/// <summary> /// Обработчик события получения списка счетов /// </summary> private void AccountResolved(AdapterEventArgs <AccountsReport> args) { args.MarkHandled(); // Инициализируем счета if (args.Message.brokerage != null) { using (accountsLock.WriteLock()) { foreach ( var account in from brokerage in args.Message.brokerage from ss in brokerage.sales_series from account in ss.account select account) { Logger.Debug().PrintFormat("Account resolved: {0};{1};{2}", account.brokerage_account_id, account.account_id, account.name); AddAccount(account.name); accountCodesById[account.account_id] = account.name; accountIdsByCode[account.name] = account.account_id; } } OnMessageReceived( new InitResponseMessage { OrderRouters = new Dictionary <string, string[]> { { ServiceCode, AvailableAccounts.ToArray() } } }); } // Подписываемся на счета var subscription = new TradeSubscription { publication_type = (uint)TradeSubscription.PublicationType.ALL_AUTHORIZED, subscription_scope = { (uint)TradeSubscription.SubscriptionScope.ORDERS, (uint)TradeSubscription.SubscriptionScope.POSITIONS, (uint)TradeSubscription.SubscriptionScope.COLLATERAL }, subscribe = true, id = adapter.GetNextRequestId() }; adapter.SendMessage(subscription); }
/// <summary> /// Получить исторические данные /// </summary> /// <param name="consumer"> /// Потребитель исторических данных /// </param> /// <param name="instrument"> /// Инструмент /// </param> /// <param name="begin"> /// Начало диапазона /// </param> /// <param name="end"> /// Конец диапазона /// </param> /// <param name="span"> /// Интервал свечей для исторических данных /// </param> /// <param name="cancellationToken"> /// Токен отмены /// </param> /// <returns> /// Исторические данные /// </returns> /// <remarks> /// Провайдер вправе переопределить параметры исторических графиков - диапазон, интервал, /// если он не в состоянии предоставить запрошенные данные. /// </remarks> /// <exception cref="NoHistoryDataException"> /// Бросается, если исторические данные за указанный период недоступны /// </exception> public async Task GetHistoryDataAsync( IHistoryDataConsumer consumer, Instrument instrument, DateTime begin, DateTime end, HistoryProviderSpan span, CancellationToken cancellationToken = new CancellationToken()) { var message = await PrepareTimeBarRequestAsync(instrument, begin, end, span, TimeBarRequest.RequestType.GET); if (message == null) { throw new ArgumentException($"Unable to resolve instrument {instrument}"); } var request = new HistoryDataRequest(this, consumer, instrument, begin, end, span, message); using (requestsLock.Lock()) { requests[message.request_id] = request; } CQGCAdapter.Log.Debug().Print( "Requesting history data block", LogFields.RequestId(message.request_id), LogFields.ContractId(message.time_bar_parameters.contract_id)); adapter.SendMessage(message); // Поддержка отмены запроса cancellationToken.RegisterSafe(() => request.TrySetCanceled()); var data = await request.Task; consumer.Update(data, HistoryDataUpdateType.Batch); }
private void SendBatchRequest() { List <InformationRequest> requests; using (requestBatchLock.Lock()) { if (requestBatch.Count == 0) { return; } requests = requestBatch.ToList(); requestBatch.Clear(); } adapter.SendMessage(requests); }
private void SendBatchRequest() { List <MarketDataSubscription> requests; using (requestBatchLock.Lock()) { if (requestBatch.Count == 0) { return; } requests = requestBatch.ToList(); requestBatch.Clear(); } adapter.SendMessage(requests); }