/// <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); }
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; } }