Example #1
0
        public CandlesSubscribeRequest(string pair, BitfinexTimeFrame bitfinexTimeFrame)
        {
            BfxValidations.ValidateInput(pair, nameof(pair));

            Key =
                $"trade:{TimeFrameToKeyCommand(bitfinexTimeFrame)}:{BitfinexSymbolUtils.FormatPairToTradingSymbol(pair)}";
        }
        /// <summary>
        /// Send message to the websocket channel.
        /// It inserts the message to the queue and actual sending is done on an other thread
        /// </summary>
        /// <param name="message">Message to be sent</param>
        public Task Send(string message)
        {
            BfxValidations.ValidateInput(message, nameof(message));

            _messagesToSendQueue.Add(message);
            return(Task.CompletedTask);
        }
        public BitfinexWebsocketClient(BitfinexWebsocketCommunicator communicator)
        {
            BfxValidations.ValidateInput(communicator, nameof(communicator));

            _communicator               = communicator;
            _channelIdToHandler[0]      = Streams.HandleAccountInfo;
            _messageReceivedSubsciption = _communicator.MessageReceived.Subscribe(HandleMessage);
        }
        public Task Send <T>(T request)
        {
            BfxValidations.ValidateInput(request, nameof(request));

            var serialized = JsonConvert.SerializeObject(request, BitfinexJsonSerializer.Settings);

            return(_communicator.Send(serialized));
        }
        /// <summary>
        /// Create a new unique order identification
        /// </summary>
        public CidPair(long cid, DateTime cidDate)
        {
            BfxValidations.ValidateInput(cid, nameof(cid), 0);
            BfxValidations.ValidateInput(cidDate, nameof(cidDate));

            Cid     = cid;
            CidDate = cidDate;
        }
Example #6
0
        /// <summary>
        /// Cancel multiple order in selected groups
        /// </summary>
        public static CancelMultiOrderRequest CancelGroups(long[] gids)
        {
            BfxValidations.ValidateInputCollection(gids, nameof(gids));

            return(new CancelMultiOrderRequest()
            {
                Gids = gids
            });
        }
Example #7
0
        /// <summary>
        /// Cancel multiple order in selected group
        /// </summary>
        public static CancelMultiOrderRequest CancelGroup(long gid)
        {
            BfxValidations.ValidateInput(gid, nameof(gid), 0);

            return(new CancelMultiOrderRequest()
            {
                Gids = new[] { gid }
            });
        }
Example #8
0
        /// <summary>
        /// Subscribe for L3 order book data (no grouping, every single order)
        /// </summary>
        /// <param name="pair">Target symbol/pair (BTCUSD, ETHBTC, etc.)</param>
        /// <param name="length">Number of orders returned by API ("1", "25", "100") [default="25"]</param>
        public RawBookSubscribeRequest(
            string pair,
            string length = null)
        {
            BfxValidations.ValidateInput(pair, nameof(pair));

            Symbol = BitfinexSymbolUtils.FormatPairToSymbol(pair);
            Prec   = "R0";
            Len    = string.IsNullOrWhiteSpace(length) ? "25" : length;
        }
        public BitfinexWebsocketCommunicator(Uri url, Func <ClientWebSocket> clientFactory = null)
        {
            BfxValidations.ValidateInput(url, nameof(url));

            _url           = url;
            _clientFactory = clientFactory ?? (() => new ClientWebSocket()
            {
                Options = { KeepAliveInterval = new TimeSpan(0, 0, 5, 0) }
            });
        }
        public async Task Send(string message)
        {
            BfxValidations.ValidateInput(message, nameof(message));

            Log.Verbose(L($"Sending:  {message}"));
            var buffer         = Encoding.UTF8.GetBytes(message);
            var messageSegment = new ArraySegment <byte>(buffer);
            var client         = await GetClient();

            await client.SendAsync(messageSegment, WebSocketMessageType.Text, true, _cancelation.Token);
        }
        public BitfinexWebsocketCommunicator(Uri url, ClientWebSocket websocketClient = null)
        {
            BfxValidations.ValidateInput(url, nameof(url));

            _url    = url;
            _client = websocketClient;

            var minute = 1000 * 60;

            _lastChanceTimer = new Timer(async x => await LastChance(x), null, minute, minute);
        }
Example #12
0
        /// <inheritdoc />
        public BitfinexWebsocketClient(IBitfinexCommunicator communicator)
        {
            BfxValidations.ValidateInput(communicator, nameof(communicator));

            _communicator = communicator;
            _messageReceivedSubscription = _communicator.MessageReceived.Subscribe(HandleMessage);
            _configurationSubscription   = Streams.ConfigurationSubject.Subscribe(HandleConfiguration);

            _authenticatedHandler = new BitfinexAuthenticatedHandler(Streams, _channelIdToHandler);
            _publicHandler        = new BitfinexPublicHandler(Streams, _channelIdToHandler);
        }
        public AuthenticationRequest(string apiKey, string apiSecret)
        {
            BfxValidations.ValidateInput(apiKey, nameof(apiKey));
            BfxValidations.ValidateInput(apiSecret, nameof(apiSecret));

            ApiKey = apiKey;

            AuthNonce   = BitfinexAuthentication.CreateAuthNonce();
            AuthPayload = BitfinexAuthentication.CreateAuthPayload(AuthNonce);

            AuthSig = BitfinexAuthentication.CreateSignature(AuthPayload, apiSecret);
        }
Example #14
0
        /// <summary>
        /// Subscribe for L2 order book data (grouped by price)
        /// </summary>
        /// <param name="pair">Target symbol/pair (BTCUSD, ETHBTC, etc.)</param>
        /// <param name="precision">Level of price aggregation (P0, P1, P2, P3). The default is P0</param>
        /// <param name="frequency">Frequency of updates (F0, F1). F0=realtime / F1=2sec. The default is F0.</param>
        /// <param name="length">Number of price points ("25", "100") [default="25"]</param>
        public BookSubscribeRequest(
            string pair,
            BitfinexPrecision precision = BitfinexPrecision.P0,
            BitfinexFrequency frequency = BitfinexFrequency.Realtime,
            string length = null)
        {
            BfxValidations.ValidateInput(pair, nameof(pair));

            Symbol = BitfinexSymbolUtils.FormatPairToSymbol(pair);
            Prec   = precision.GetStringValue();
            Freq   = frequency.GetStringValue();
            Len    = string.IsNullOrWhiteSpace(length) ? "25" : length;
        }
        public BitfinexWebsocketCommunicator(Uri url, Func <ClientWebSocket> clientFactory = null)
        {
            BfxValidations.ValidateInput(url, nameof(url));

            _url           = url;
            _clientFactory = clientFactory ?? (() => new ClientWebSocket()
            {
                Options = { KeepAliveInterval = new TimeSpan(0, 0, 0, 10) }
            });

            var minute = 1000 * 60;

            _lastChanceTimer = new Timer(async x => await LastChance(x), null, minute, minute);
        }
        /// <summary>
        /// Simple constructor mostly for LIMIT and MARKET order,
        /// for other order types use parameter-less constructor and set properties by your own
        /// </summary>
        public NewOrderRequest(long gid, long cid, string symbol, OrderType type, double amount, double price)
        {
            BfxValidations.ValidateInput(cid, nameof(cid), 0);
            BfxValidations.ValidateInput((int)type, nameof(type), 0);
            BfxValidations.ValidateInput(price, nameof(price), 0);
            BfxValidations.ValidateInput(symbol, nameof(symbol));

            Gid    = gid;
            Cid    = cid;
            Symbol = symbol;
            Type   = type;
            Amount = amount;
            Price  = price;
        }
Example #17
0
        /// <summary>
        /// Serializes request and sends message via websocket communicator.
        /// It logs and re-throws every exception.
        /// </summary>
        /// <param name="request">Request/message to be sent</param>
        public async Task Send <T>(T request)
        {
            try
            {
                BfxValidations.ValidateInput(request, nameof(request));

                var serialized = JsonConvert.SerializeObject(request, BitfinexJsonSerializer.Settings);
                await _communicator.Send(serialized);
            }
            catch (Exception e)
            {
                Log.Error(e, L($"Exception while sending message '{request}'. Error: {e.Message}"));
                throw;
            }
        }
        public Task Send <T>(T request, bool resubscribe = false)
        {
            BfxValidations.ValidateInput(request, nameof(request));

            if (!resubscribe)
            {
                //Store subscriptions to re-establish if communication is lost and re-established
                if (request is SubscribeRequestBase)
                {
                    _storedSubscriptions.Add(request as SubscribeRequestBase);
                }
            }

            var serialized = JsonConvert.SerializeObject(request, BitfinexJsonSerializer.Settings);

            return(this.SendInternal(serialized));
        }
        /// <summary>
        /// Authentication request
        /// </summary>
        /// <param name="apiKey">Your API key</param>
        /// <param name="apiSecret">Your API secret</param>
        /// <param name="deadManSwitchEnabled">Dead-Man-Switch flag (optional), when socket is closed, cancel all account orders</param>
        public AuthenticationRequest(string apiKey, string apiSecret, bool deadManSwitchEnabled)
        {
            BfxValidations.ValidateInput(apiKey, nameof(apiKey));
            BfxValidations.ValidateInput(apiSecret, nameof(apiSecret));

            ApiKey = apiKey;

            AuthNonce   = BitfinexAuthentication.CreateAuthNonce();
            AuthPayload = BitfinexAuthentication.CreateAuthPayload(AuthNonce);

            AuthSig = BitfinexAuthentication.CreateSignature(AuthPayload, apiSecret);

            if (deadManSwitchEnabled)
            {
                Dms = 4;
            }
        }
Example #20
0
        public Task Send(string message)
        {
            BfxValidations.ValidateInput(message, nameof(message));

            Log.Debug(L($"Sending:  {message}"));
            var buffer         = Encoding.UTF8.GetBytes(message);
            var messageSegment = new ArraySegment <byte>(buffer);

            lock (_sendingTaskLock)
            {
                var client = GetClient();
                if (client == null)
                {
                    return(null);
                }
                try
                {
                    if (_sendingTask != null &&
                        _sendingTask.Status != TaskStatus.RanToCompletion &&
                        _sendingTask.Status != TaskStatus.Canceled &&
                        _sendingTask.Status != TaskStatus.Faulted)
                    {
                        Log.Warning(L($"Waiting SendAsync completed."));
                        _sendingTask.Wait();
                    }
                    _sendingTask = client.SendAsync(messageSegment, WebSocketMessageType.Text, true, _cancelation.Token);
                }
                catch (Exception e)
                {
                    Log.Error(e, L($"Exception while SendAsync."));
#pragma warning disable 4014
                    Reconnect();
#pragma warning restore 4014
                }
            }

            return(null);
        }
        public TickerSubscribeRequest(string pair)
        {
            BfxValidations.ValidateInput(pair, nameof(pair));

            Symbol = FormatPairToSymbol(pair);
        }
        /// <summary>
        /// Subscribe to trades request
        /// </summary>
        /// <param name="pair">Target pair, for example 'BTC/USD', 'ETH/USD', ETHBTC, etc.</param>
        public TradesSubscribeRequest(string pair)
        {
            BfxValidations.ValidateInput(pair, nameof(pair));

            Symbol = BitfinexSymbolUtils.FormatPairToTradingSymbol(pair);
        }
        public FundingsSubscribeRequest(string symbol)
        {
            BfxValidations.ValidateInput(symbol, nameof(symbol));

            Symbol = BitfinexSymbolUtils.FormatSymbolToFunding(symbol);
        }
Example #24
0
        /// <summary>
        /// Cancel order by combination of client id and order creation date
        /// </summary>
        public CancelOrderRequest(CidPair cidPair)
        {
            BfxValidations.ValidateInput(cidPair, nameof(cidPair));

            CidPair = cidPair;
        }
Example #25
0
        /// <summary>
        /// Cancel order by unique Bitfinex order id
        /// </summary>
        /// <param name="id"></param>
        public CancelOrderRequest(long id)
        {
            BfxValidations.ValidateInput(id, nameof(id), 0);

            Id = id;
        }
        /// <summary>
        /// Send message to the websocket channel.
        /// It doesn't use a sending queue,
        /// beware of issue while sending two messages in the exact same time
        /// on the full .NET Framework platform
        /// </summary>
        /// <param name="message">Message to be sent</param>
        public Task SendInstant(string message)
        {
            BfxValidations.ValidateInput(message, nameof(message));

            return(SendInternal(message));
        }
Example #27
0
        public FundingsSuscribeRequest(string symbol)
        {
            BfxValidations.ValidateInput(symbol, nameof(symbol));

            Symbol = FormatSymbolFunding(symbol);
        }
Example #28
0
        /// <summary>
        /// Cancel multiple orders by unique Bitfinex order ids
        /// </summary>
        /// <param name="ids"></param>
        public CancelMultiOrderRequest(long[] ids)
        {
            BfxValidations.ValidateInputCollection(ids, nameof(ids));

            Ids = ids;
        }
Example #29
0
        /// <summary>
        /// Cancel multiple orders by unique client order identifications
        /// </summary>
        /// <param name="cidPairs"></param>
        public CancelMultiOrderRequest(CidPair[] cidPairs)
        {
            BfxValidations.ValidateInputCollection(cidPairs, nameof(cidPairs));

            CidPairs = cidPairs;
        }