Добрый день. Храню свечные данные в СУБД MS SQL Server (open/close time, o, h, l, c, V).
До сего момента использовал данные из файлов (Hydra/<первая буква инструмента>/<инструмент>/candles_TimeFrameCandle_1.00-00-00.bin), примерно так:
var storageRegistry = new StorageRegistry { DefaultDrive = new LocalMarketDataDrive(config.history_folder_path) };
Хотел бы, чтобы HistoryEmulationConnector получал данные не из файлов а, например, из сообщений-свечек, полученных после выборки данных из СУБД.
Дайте, по-возможности, совет (лучше пример кода), как реализовать такую логику работы: -> Загрузили из БД свечные данные по инструменту -> Сформировали правильно сообщения-свечки из загруженных данных -> После старта исторического тестирования HistoryEmulationConnector начал получать сообщения-свечки -> Все работает, словно запустили тестирование из коробки
Спасибо!
Comentarios (12)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Посмотрите пример в атачменте. Там показано как подключить к эмулятору коллекцию свечей... По идее, то же самое можно сделать с коллекцией свечей...
Спасибо, попробую
..
Все заработало. Спасибо!
Если кому будет интересно использовать свои свечные данные из своей (или удаленной СУБД), то, основываясь на примере от уважаемого суппорта SS, реализовал так:
Еще раз спасибо!
..
Добрый день! После обновления с версии 4.4.5.4 до версии 4.4.8 перестали приходить свечи. Проблема, судя по всему, в "3) Подписываемся на исторические данные из наших сообщений:".
Фрагмент лога:
0001/01/01 00:00:00.000| |AHistoryEmulationConnector|Connect 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connecting 'EmulationMessageAdapter'. 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connected to 'EmulationMessageAdapter'. 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connecting 'История (c 10.07.2013 3:00:00 +00:00 по 23.03.2018 3:00:00 +00:00)'. 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connected to 'История (c 10.07.2013 3:00:00 +00:00 по 23.03.2018 3:00:00 +00:00)'. 2013/07/10 03:00:00.000| |AHistoryEmulationConnector|Создан новый портфель TestPortfolio#0. 2013/07/10 03:00:00.000| |Strategy_SBER@TQBR|Стратегия Запущена. [0,-1]. Позиция 0. 2013/07/10 03:00:00.000| |Strategy_GAZP@TQBS|Стратегия Запущена. [0,-1]. Позиция 0. 2013/07/10 03:00:00.000| |Strategy_MICEX10INDEX@MICEX|Стратегия Запущена. [0,-1]. Позиция 0. 2013/07/10 03:00:00.000|Error |HistoryBasketMessageAdapter|System.InvalidOperationException: Не найден подходящий адаптер для MarketData,T(L)=2013/07/10 03:00:00.000,Sec=S#:SBER@TQBR, Native:,Type:,Sec=S#:SBER@TQBR, Native:,Type:,Type=CandleTimeFrame,IsSubscribe=True,Arg=1.00:00:00,TransId=8,OrigId=0. в StockSharp.Algo.BasketMessageAdapter.GetSubscriptionAdapters(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.ProcessMarketDataRequest(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.OnSendInMessage(Message message) в StockSharp.Messages.MessageAdapter.SendInMessage(Message message)
Не подскажите, как правильно теперь подписываться на свечи из внешнего источника? Спасибо.
Добрый день
Регистрация внешних источник была изменена в версии 4.4.7. Вы можете посмотреть пример SampleHistoryTesting как работать с внешними источниками. В примере используются сервисы Финам и Яху.
Изменения разработчиков https://github.com/StockSharp/StockSharp/commit/db0dfb39d05140db7565acdb05a771248e4b2202#diff-84a8277382d10d989376c69e0b8c30e5
Добрый вечер. Пример SampleHistoryTesting и github я посмотрел прежде чем писать сообщение выше. После вашего ответа перепроверил еще раз - но каких-либо существенных изменений у вас в примере не нашел, кроме:
У меня в коннекторе HistoryEmulationConnector используется не один инструмент (у каждого своя стратегия). Плюс ко всему, каждый инструмент может содержать несколько таймфреймов. Поэтому ранее я метод RegisterHistorySource() вызывал для всех таймфреймов для каждого инструмента. Попробовал подписаться по событию подключения - тщетно. Поэтому непонятно даже, куда копать :( Танцевал с бубном долго.
Псевдокод получается такой:
В классе каждого таймфрейма реализован метод getCandles() :
Вопросы:
Спасибо!
После регистрации источника необходимо произвести подписку на данные. Подписка производится штатными методами класса Connector. В вышеприведённом коде у вас присутствует только регистрация источника.
Добрый день. Подписка на данные в эмуляторе не помогла (ранее она была необходима только при биржевых подключениях).
Поэтому собрал очень короткий пример иллюстрирующий обсуждаемую проблему, с комментариями. Прикрепляю и очень прошу посмотреть.
Цель: получить на обработку свечку с методе processCandle() внутри стратегии.
Очень надеюсь на помощь.
Логи пока такие:
0001/01/01 00:00:00.000| |HistoryEmulationConnector|Connect 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connecting 'EmulationMessageAdapter'. 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connected to 'EmulationMessageAdapter'. 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connecting 'История (c 07.05.2018 10:00:00 +03:00 по 09.05.2018 10:00:00 +03:00)'. 0001/01/01 00:00:00.000| |HistoryBasketMessageAdapter|Connected to 'История (c 07.05.2018 10:00:00 +03:00 по 09.05.2018 10:00:00 +03:00)'. 2018/05/07 10:00:00.000| |HistoryEmulationConnector|Создан новый портфель TestPortfolio. 2018/05/07 13:13:50.521|Debug |SecurityMarketEmulator| --> Board,T(L)=0001.01.01 00:00:00.000,Code=TQBR,Ex=MOEX 2018/05/07 13:13:50.528|Debug |SecurityMarketEmulator| --> Security,T(L)=2018.05.07 10:00:00.000,Sec=S#:GASP@TQBR, Native:,Type: 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент GASP@TQBR подписается на Level1. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент GASP@TQBR подписается на Trades. 2018/05/07 13:13:50.669|Debug |SecurityMarketEmulator| --> Board,T(L)=2018.05.07 10:00:00.000,Code=TQBR,Ex=MOEX 2018/05/07 13:13:50.673|Debug |SecurityMarketEmulator| --> Board,T(L)=0001.01.01 00:00:00.000,Code=TQBR,Ex=MOEX 2018/05/07 13:13:50.673|Debug |SecurityMarketEmulator| --> Security,T(L)=2018.05.07 10:00:00.000,Sec=S#:LKOH@TQBR, Native:,Type: 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент LKOH@TQBR подписается на Level1. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент LKOH@TQBR подписается на Trades. 2018/05/07 10:00:00.000|Debug |strategy_GASP@TQBR|Переход из состояния Stopped в Started. 2018/05/07 10:00:00.000| |strategy_GASP@TQBR|Стратегия Запущена. [0,-1]. Позиция 0. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент GASP@TQBR подписается на CandleTimeFrame 1.00:00:00. 2018/05/07 10:00:00.000|Debug |strategy_LKOH@TQBR|Переход из состояния Stopped в Started. 2018/05/07 10:00:00.000| |strategy_LKOH@TQBR|Стратегия Запущена. [0,-1]. Позиция 0. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент LKOH@TQBR подписается на CandleTimeFrame 1.00:00:00. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент GASP@TQBR подписан на Level1. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент GASP@TQBR подписан на Trades. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент LKOH@TQBR подписан на Level1. 2018/05/07 10:00:00.000|Debug |HistoryEmulationConnector|Инструмент LKOH@TQBR подписан на Trades. 2018/05/07 10:00:00.000|Error |HistoryBasketMessageAdapter|System.InvalidOperationException: Не найден подходящий адаптер для MarketData,T(L)=2018/05/07 10:00:00.000,Sec=S#:GASP@TQBR, Native:,Type:,Sec=S#:GASP@TQBR, Native:,Type:,Type=CandleTimeFrame,IsSubscribe=True,Arg=1.00:00:00,TransId=11,OrigId=0. в StockSharp.Algo.BasketMessageAdapter.GetSubscriptionAdapters(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.ProcessMarketDataRequest(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.OnSendInMessage(Message message) в StockSharp.Messages.MessageAdapter.SendInMessage(Message message) 2018/05/07 10:00:00.000|Error |HistoryEmulationConnector|System.InvalidOperationException: Не найден подходящий адаптер для MarketData,T(L)=2018/05/07 10:00:00.000,Sec=S#:GASP@TQBR, Native:,Type:,Sec=S#:GASP@TQBR, Native:,Type:,Type=CandleTimeFrame,IsSubscribe=True,Arg=1.00:00:00,TransId=11,OrigId=0. в StockSharp.Algo.BasketMessageAdapter.GetSubscriptionAdapters(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.ProcessMarketDataRequest(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.OnSendInMessage(Message message) в StockSharp.Messages.MessageAdapter.SendInMessage(Message message) 2018/05/07 10:00:00.000|Error |HistoryBasketMessageAdapter|System.InvalidOperationException: Не найден подходящий адаптер для MarketData,T(L)=2018/05/07 10:00:00.000,Sec=S#:LKOH@TQBR, Native:,Type:,Sec=S#:LKOH@TQBR, Native:,Type:,Type=CandleTimeFrame,IsSubscribe=True,Arg=1.00:00:00,TransId=13,OrigId=0. в StockSharp.Algo.BasketMessageAdapter.GetSubscriptionAdapters(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.ProcessMarketDataRequest(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.OnSendInMessage(Message message) в StockSharp.Messages.MessageAdapter.SendInMessage(Message message) 2018/05/07 10:00:00.000|Error |HistoryEmulationConnector|System.InvalidOperationException: Не найден подходящий адаптер для MarketData,T(L)=2018/05/07 10:00:00.000,Sec=S#:LKOH@TQBR, Native:,Type:,Sec=S#:LKOH@TQBR, Native:,Type:,Type=CandleTimeFrame,IsSubscribe=True,Arg=1.00:00:00,TransId=13,OrigId=0. в StockSharp.Algo.BasketMessageAdapter.GetSubscriptionAdapters(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.ProcessMarketDataRequest(MarketDataMessage mdMsg) в StockSharp.Algo.BasketMessageAdapter.OnSendInMessage(Message message) в StockSharp.Messages.MessageAdapter.SendInMessage(Message message) 2018/05/07 10:00:00.000| |HistoryEmulationConnector|Изменение состояния эмуляции Stopped -> Starting 2018/05/07 10:00:00.000| |HistoryEmulationConnector|Изменение состояния эмуляции Starting -> Started 2018/05/09 07:00:00.000| |HistoryEmulationConnector|Изменение состояния эмуляции Started -> Stopping 2018/05/09 07:00:00.000| |HistoryEmulationConnector|Изменение состояния эмуляции Stopping -> Stopped 2018/05/09 07:00:00.000| |HistoryEmulationConnector|Disconnect 2018/05/09 07:00:00.000| |HistoryBasketMessageAdapter|Disconnecting 'EmulationMessageAdapter'. 2018/05/09 07:00:00.000| |HistoryBasketMessageAdapter|Disconnected from 'EmulationMessageAdapter'. 2018/05/09 07:00:00.000| |HistoryBasketMessageAdapter|Disconnecting 'История (c 07.05.2018 10:00:00 +03:00 по 09.05.2018 10:00:00 +03:00)'. 2018/05/09 07:00:00.000| |HistoryBasketMessageAdapter|Disconnected from 'История (c 07.05.2018 10:00:00 +03:00 по 09.05.2018 10:00:00 +03:00)'.
Проблема решена по почте.