예제 #1
0
        /// <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);
        }
예제 #3
0
        private void SendBatchRequest()
        {
            List <InformationRequest> requests;

            using (requestBatchLock.Lock())
            {
                if (requestBatch.Count == 0)
                {
                    return;
                }

                requests = requestBatch.ToList();
                requestBatch.Clear();
            }

            adapter.SendMessage(requests);
        }
예제 #4
0
        private void SendBatchRequest()
        {
            List <MarketDataSubscription> requests;

            using (requestBatchLock.Lock())
            {
                if (requestBatch.Count == 0)
                {
                    return;
                }

                requests = requestBatch.ToList();
                requestBatch.Clear();
            }

            adapter.SendMessage(requests);
        }