Exemple #1
0
        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;
            }
        }