/// <inheritdoc /> public BinanceWebsocketClient(IBinanceCommunicator communicator) { BnbValidations.ValidateInput(communicator, nameof(communicator)); _communicator = communicator; _messageReceivedSubscription = _communicator.MessageReceived.Subscribe(HandleMessage); }
private void OnStop() { _pingSubscription?.Dispose(); _client.Dispose(); _communicator.Dispose(); _client = null; _communicator = null; Clear(); }
/// <inheritdoc /> public BinanceWebsocketClient(IBinanceCommunicator communicator, IBinanceReferenceOrderBookCommunicator referenceOrderBookCommunicator = null) { BnbValidations.ValidateInput(communicator, nameof(communicator)); _communicator = communicator; _messageReceivedSubscription = _communicator.MessageReceived.Subscribe(HandleMessage); _referenceOrderBookCommunicator = referenceOrderBookCommunicator; _rlobMessageReceivedSubscription = _referenceOrderBookCommunicator.MessageReceived.Subscribe(HandleMessage); }
/// <summary> /// Stream snapshot manually via communicator /// </summary> public static void StreamFakeSnapshot(OrderBookPartial snapshot, IBinanceCommunicator communicator) { var symbolSafe = (snapshot?.Symbol ?? string.Empty).ToLower(); var countSafe = snapshot?.Bids?.Length ?? 0; var response = new OrderBookPartialResponse(); response.Data = snapshot; response.Stream = $"{symbolSafe}@depth{countSafe}"; var serialized = JsonConvert.SerializeObject(response, BinanceJsonSerializer.Settings); communicator.StreamFakeMessage(ResponseMessage.TextMessage(serialized)); }
private static void SubscribeToStreams(BinanceWebsocketClient client, IBinanceCommunicator comm) { client.Streams.PongStream.Subscribe(x => Log.Information($"Pong received ({x.Message})")); client.Streams.FundingStream.Subscribe(response => { var funding = response.Data; Log.Information($"Funding: [{funding.Symbol}] rate:[{funding.FundingRate}] " + $"mark price: {funding.MarkPrice} next funding: {funding.NextFundingTime} " + $"index price {funding.IndexPrice}"); }); client.Streams.AggregateTradesStream.Subscribe(response => { var trade = response.Data; Log.Information($"Trade aggreg [{trade.Symbol}] [{trade.Side}] " + $"price: {trade.Price} size: {trade.Quantity}"); }); client.Streams.TradesStream.Subscribe(response => { var trade = response.Data; Log.Information($"Trade normal [{trade.Symbol}] [{trade.Side}] " + $"price: {trade.Price} size: {trade.Quantity}"); }); client.Streams.OrderBookPartialStream.Subscribe(response => { var ob = response.Data; Log.Information($"Order book snapshot [{ob.Symbol}] " + $"bid: {ob.Bids.FirstOrDefault()?.Price:F} " + $"ask: {ob.Asks.FirstOrDefault()?.Price:F}"); Task.Delay(500).Wait(); //OrderBookPartialResponse.StreamFakeSnapshot(response.Data, comm); }); client.Streams.OrderBookDiffStream.Subscribe(response => { var ob = response.Data; Log.Information($"Order book diff [{ob.Symbol}] " + $"bid: {ob.Bids.FirstOrDefault()?.Price:F} " + $"ask: {ob.Asks.FirstOrDefault()?.Price:F}"); }); }
private async Task OnStart() { var pair = _view.Pair; if (string.IsNullOrWhiteSpace(pair)) { pair = _defaultPair; } pair = pair.ToUpper(); _tradeStatsComputer = new TradeStatsComputer(); _orderBookStatsComputer = new OrderBookStatsComputer(); var url = BinanceValues.ApiWebsocketUrl; _communicator = new BinanceWebsocketCommunicator(url); _client = new BinanceWebsocketClient(_communicator); Subscribe(_client); _communicator.ReconnectionHappened.Subscribe(type => { _view.Status($"Reconnected (type: {type})", StatusType.Info); }); _communicator.DisconnectionHappened.Subscribe(type => { if (type == DisconnectionType.Error) { _view.Status($"Disconnected by error, next try in {_communicator.ErrorReconnectTimeoutMs/1000} sec", StatusType.Error); return; } _view.Status($"Disconnected (type: {type})", StatusType.Warning); }); SetSubscriptions(_client, pair); await _communicator.Start(); StartPingCheck(_client); }
private static void SubscribeToStreams(BinanceWebsocketClient client, IBinanceCommunicator comm) { client.Streams.PongStream.Subscribe(x => Log.Information($"Pong received ({x.Message})")); client.Streams.FundingStream.Subscribe(response => { var funding = response.Data; Log.Information($"Funding: [{funding.Symbol}] rate:[{funding.FundingRate}] " + $"mark price: {funding.MarkPrice} next funding: {funding.NextFundingTime} " + $"index price {funding.IndexPrice}"); }); client.Streams.AggregateTradesStream.Subscribe(response => { var trade = response.Data; Log.Information($"Trade aggreg [{trade.Symbol}] [{trade.Side}] " + $"price: {trade.Price} size: {trade.Quantity}"); }); client.Streams.TradesStream.Subscribe(response => { var trade = response.Data; Log.Information($"Trade normal [{trade.Symbol}] [{trade.Side}] " + $"price: {trade.Price} size: {trade.Quantity}"); }); client.Streams.OrderBookPartialStream.Subscribe(response => { var ob = response.Data; Log.Information($"Order book snapshot [{ob.Symbol}] " + $"bid: {ob.Bids.FirstOrDefault()?.Price:F} " + $"ask: {ob.Asks.FirstOrDefault()?.Price:F}"); Task.Delay(500).Wait(); //OrderBookPartialResponse.StreamFakeSnapshot(response.Data, comm); }); client.Streams.OrderBookDiffStream.Subscribe(response => { var ob = response.Data; Log.Information($"Order book diff [{ob.Symbol}] " + $"bid: {ob.Bids.FirstOrDefault()?.Price:F} " + $"ask: {ob.Asks.FirstOrDefault()?.Price:F}"); }); client.Streams.BookTickerStream.Subscribe(response => { var ob = response.Data; Log.Information($"Book ticker [{ob.Symbol}] " + $"Best ask price: {ob.BestAskPrice} " + $"Best ask qty: {ob.BestAskQty} " + $"Best bid price: {ob.BestBidPrice} " + $"Best bid qty: {ob.BestBidQty}"); }); client.Streams.KlineStream.Subscribe(response => { var ob = response.Data; Log.Information($"Kline [{ob.Symbol}] " + $"Kline start time: {ob.StartTime} " + $"Kline close time: {ob.CloseTime} " + $"Interval: {ob.Interval} " + $"First trade ID: {ob.FirstTradeId} " + $"Last trade ID: {ob.LastTradeId} " + $"Open price: {ob.OpenPrice} " + $"Close price: {ob.ClosePrice} " + $"High price: {ob.HighPrice} " + $"Low price: {ob.LowPrice} " + $"Base asset volume: {ob.BaseAssetVolume} " + $"Number of trades: {ob.NumberTrades} " + $"Is this kline closed?: {ob.IsClose} " + $"Quote asset volume: {ob.QuoteAssetVolume} " + $"Taker buy base: {ob.TakerBuyBaseAssetVolume} " + $"Taker buy quote: {ob.TakerBuyQuoteAssetVolume} " + $"Ignore: {ob.Ignore} "); }); client.Streams.MiniTickerStream.Subscribe(response => { var ob = response.Data; Log.Information($"Mini-ticker [{ob.Symbol}] " + $"Open price: {ob.OpenPrice} " + $"Close price: {ob.ClosePrice} " + $"High price: {ob.HighPrice} " + $"Low price: {ob.LowPrice} " + $"Base asset volume: {ob.BaseAssetVolume} " + $"Quote asset volume: {ob.QuoteAssetVolume}"); }); }