public async Task SubscribeOnOrderBook(string currencyPairId, Action <IList <OrderBookItem> > callback) { Connect(); var innerExistingOrderbook = await _connection.Context.MarketOrderbookAsync(currencyPairId, 30); var existingOrderBook = innerExistingOrderbook.ToOuterModel(); callback(existingOrderBook); var subscription = new Subscription { SubscribeRequest = StreamingRequest.SubscribeOrderbook(currencyPairId, 30), UnsubscribeRequest = StreamingRequest.UnsubscribeOrderbook(currencyPairId, 30), EventHandler = (o, e) => { if (!(e.Response is OrderbookResponse orderbookResponse) || orderbookResponse.Payload.Figi != currencyPairId) { return; } var orderBook = orderbookResponse.Payload.ToOuterModel(); callback(orderBook); } }; _connection.StreamingEventReceived += (o, e) => subscription.EventHandler(o, e); await _connection.Context.SendStreamingRequestAsync(subscription.SubscribeRequest); }
private async void StreamingEventReceivedHandler(object sender, StreamingEventReceivedEventArgs args) { if (args.Response is OrderbookResponse response) { var ticker = _tickersByFigi[response.Payload.Figi]; if (!Quotes.ContainsKey(ticker)) { Debug.WriteLine($"Received unexpected Tinkoff orderbook for ticker \"{ticker}\""); var request = StreamingRequest.UnsubscribeOrderbook(response.Payload.Figi, StockQuoteDepth); await _context.SendStreamingRequestAsync(request).ConfigureAwait(false); return; } var quote = Quotes[ticker]; if (response.Payload.Bids.Count > 0) { quote.TinkoffBidPrice = response.Payload.Bids[0][0]; quote.TinkoffBidSize = response.Payload.Bids[0][1]; } if (response.Payload.Asks.Count > 0) { quote.TinkoffAskPrice = response.Payload.Asks[0][0]; quote.TinkoffAskSize = response.Payload.Asks[0][1]; } quote.TinkoffMarketPrice = (quote.TinkoffBidPrice * quote.TinkoffBidSize + quote.TinkoffAskPrice * quote.TinkoffAskSize) / (quote.TinkoffBidSize + quote.TinkoffAskSize); quote.TinkoffUpdatedAt = response.Time; quote.LongDelta = quote.BidPrice - quote.TinkoffAskPrice; quote.ShortDelta = quote.TinkoffBidPrice - quote.AskPrice; quote.LongDeltaPercent = quote.LongDelta * 100 / quote.TinkoffMarketPrice; quote.ShortDeltaPercent = quote.ShortDelta * 100 / quote.TinkoffMarketPrice; } }