示例#1
0
        /// <summary>
        ///     Подписаться на исторические данные
        /// </summary>
        /// <param name="consumer">
        ///     Потребитель исторических данных
        /// </param>
        /// <param name="instrument">
        ///     Инструмент
        /// </param>
        /// <param name="begin">
        ///     Начало диапазона
        /// </param>
        /// <param name="span">
        ///     Интервал свечей для исторических данных
        /// </param>
        /// <returns>
        ///     Подписка на исторические данные
        /// </returns>
        /// <remarks>
        ///     Провайдер вправе переопределить параметры исторических графиков - диапазон, интервал,
        ///     если он не в состоянии предоставить запрошенные данные.
        /// </remarks>
        public async Task <IHistoryDataSubscription> SubscribeToHistoryDataAsync(
            IHistoryDataConsumer consumer,
            Instrument instrument,
            DateTime begin,
            HistoryProviderSpan span)
        {
            var symbol = await adapter.ResolveSymbolAsync(instrument);

            if (symbol == null)
            {
                consumer.Error($"Unable to resolve symbol for {instrument}");
                return(new NullHistoryDataSubscription());
            }

            QLAdapter.Log.Debug().Print($"Candles subscription: {symbol}, span {span}, from {begin}");
            var subscriptionMessage = new QLHistoryDataSubscription(symbol, begin, span);
            var subscription        =
                new HistoryDataSubscription(subscriptionMessage.id, instrument, begin, span, adapter, consumer);

            using (requestsLock.Lock())
            {
                subscriptions[subscription.Id] = subscription;
            }

            adapter.SendMessage(subscriptionMessage);

            return(subscription);
        }
示例#2
0
        private void AdapterOnMessageReceived(object sender, QLMessageEventArgs e)
        {
            switch (e.Message.message_type)
            {
            case QLMessageType.CandlesResponse:
                var response = (QLHistoryDataResponse)e.Message;
                QLAdapter.Log.Debug().Print($"CandlesResponse received, contains {response.candles?.Count} candles", LogFields.RequestId(response.id));

                HistoryDataRequest request;
                using (requestsLock.Lock())
                {
                    if (!requests.TryGetValue(response.id, out request))
                    {
                        return;
                    }
                }

                request.ProcessResponse(response);

                using (requestsLock.Lock())
                {
                    requests.Remove(response.id);
                }

                break;

            case QLMessageType.CandlesUpdate:
                var update = (QLHistoryDataUpdate)e.Message;
                QLAdapter.Log.Trace().Print($"CandlesUpdate received: {update.candles}");

                HistoryDataSubscription subscription = null;

                using (requestsLock.Lock())
                {
                    if (!subscriptions.TryGetValue(update.id, out subscription))
                    {
                        return;
                    }
                }

                subscription.ProcessUpdate(update);

                break;
            }
        }