Добрый день. Хочу передать коллекцию тиковых сделок IEnumerable<ExecutionMessage> в HistoryEmulationConnector.
Есть ли способ это сделать без использования механизма сохранения коллекции в файл через StorageRegistry?
Пытаюсь делать на основе примера тестирование на исторических данных через Финам, с использованием метода RegisterHistorySource, но никак не получается. Данные не подгружаются, свечки не строятся. Подскажите, пожалуйста, мою ошибку, может быть есть у кого рабочее решение.
Пытаюсь сделать следующим образом: _historyTicks - переменная содержащая коллекцию IEnumerable<ExecutionMessage> (тики загружены, проверил)
d1 = _historyTicks.ElementAt(0).ServerTime; d2 = _historyTicks.ElementAt(_historyTicks.Count() - 1).ServerTime;
_historyConnector = new HistoryEmulationConnector(new[] , new[] ) } },
UseExternalCandleSource = false,
CreateDepthFromOrdersLog = false,
CreateTradesFromOrdersLog = false,
};
_historyConnector.HistoryMessageAdapter.StartDate = d1; _historyConnector.HistoryMessageAdapter.StopDate = d2;
Func<DateTimeOffset, IEnumerable<Message>> selectionData = d => _historyTicks.Where(ht => ((ht.ServerTime.Date == d.Date) && (ht.ServerTime.TimeOfDay==d.TimeOfDay)));
_historyConnector.RegisterHistorySource(_selSecurity, MarketDataTypes.Trades, typeof (Trade), selectionData);
var candleManager = new CandleManager(_historyConnector);
_candleTimeFrame = TimeSpan.FromMinutes(5);
_connectorCandleSеries = new CandleSeries(typeof(TimeFrameCandle), _selSecurity, _candleTimeFrame);
candleManager.Processing += DrawElement;
candleManager.Start(_connectorCandleSеries);
_historyConnector.Start();
Comentarios (12)
Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario
Вот так сделайте... Поставьте точку останова внутрь GetTrades и посмотрите какое время приходит в функцию, и что она возвращает...
Сделал все по Вашей рекомендации. Создал отдельный метод: public IEnumerable<Message> GetTrades(DateTimeOffset d) { var trades = _historyTicks.Where(ht => ((ht.ServerTime.Date == d.Date) && (ht.ServerTime.TimeOfDay == d.TimeOfDay))); return trades; }
Изменил: _historyConnector.RegisterHistorySource(_selSecurity, MarketDataTypes.Trades, null, GetTrades);
Поставил внутри метода GetTrades точку останова, но программа в него не заходит
Сделал дополнительную подписку на событие коннектора появления "нового сообщения" и вывод всех приходящих сообщений в окно Debug historyConnector.NewMessage += (m) => { var m1 = m; Debug.Print(m.ToString()); };
После вызова _historyConnector.Connect(); в переменную m приходит первое сообщение: Error,T(L)=0001/01/01 00:00:00.000,Error=Не найден подходящий адаптер для -8.
затем последовательно приходят следующие сообщения: Connect,T(L)=0001/01/01 00:00:00.000 Connect,T(L)=2017/03/13 09:59:42.000 PortfolioLookupResult,T(L)=2017/03/13 09:59:42.000,Orig=1 OrderStatus,T(L)=2017/03/13 09:59:42.000,Sec=S#:@, Native:,Type:,OriginTransId=0,TransId=2,OrderId=,TransId=2 PortfolioChange,T(L)=2017/03/13 09:59:42.000,T(S)=0001/01/01 00:00:00.000,P=test account,Changes=[RealizedPnL, 0],[VariationMargin, 0],[CurrentValue, 1000000],[BlockedValue, 0],[Commission, 0] Board,T(L)=2017/03/13 09:59:42.000,Code=TQBR,Ex=MOEX Security,T(L)=2017/03/13 09:59:42.000,Sec=S#:SBER@TQBR, Native:,Type: SecurityLookupResult,T(L)=2017/03/13 09:59:42.000,Orig=3 MarketData,T(L)=2017/03/13 09:59:42.000,Sec=S#:@, Native:,Type:,Sec=S#:@, Native:,Type:,Types=Level1,IsSubscribe=True,TransId=0,OrigId=4 Time,T(L)=2017/03/13 07:00:00.000,ID=0,Response= SecurityLookupResult,T(L)=2017/03/13 15:45:00.000,Orig=3 Time,T(L)=2017/03/13 15:45:00.000,ID=0,Response= Time,T(L)=2017/03/13 15:45:01.000,ID=0,Response= Time,T(L)=2017/03/13 15:45:02.000,ID=0,Response= Time,T(L)=2017/03/14 07:00:00.000,ID=0,Response= Time,T(L)=2017/03/14 15:45:00.000,ID=0,Response= Time,T(L)=2017/03/14 15:45:01.000,ID=0,Response= Time,T(L)=2017/03/14 15:45:02.000,ID=0,Response= PortfolioLookupResult,T(L)=2017/03/14 15:45:02.000,Orig=1 Disconnect,T(L)=2017/03/14 15:45:02.000 MarketData,T(L)=2017/03/14 15:45:02.000,Sec=S#:@, Native:,Type:,Sec=S#:@, Native:,Type:,Types=Level1,IsSubscribe=False,TransId=0,OrigId=5 Disconnect,T(L)=2017/03/14 18:49:49.000
Прилагаю файл сообщений Debug.
тики загружены в переменную _historyTicks по акциям SBER за период с 13.03.17 по 14.03.17, общее кол-во 105943 шт. дата первого тика d1= {13.03.2017 9:59:42 +03:00}, дата последнего тика d2={14.03.2017 18:49:49 +03:00}
Текст кода следующий:
. . .
if (_historyTicks != null) {
d1 = _historyTicks.ElementAt(0).ServerTime; d2 = _historyTicks.ElementAt(_historyTicks.Count() - 1).ServerTime; }
Хорошо, будем проверять..
Добрый день, прошло уже 2 недели, удалось ли проверить данную проблему?
Нет еще..
Регистрацию источника нужно выполнять в событии NewSecurities.. Рабочий пример во вложении...
Спасибо. Все получилось, только не загружается информация за пятницы. Пробовал загружать историю (тики) с Финама по акциям и передавать в HistoryEmulationConnector за период с 10.04.2017 по 21.04.2017 В метод GetTrades не приходят даты за пятницу 14.04.2017 и 21.04.2017. Проверил, история за эти даты с Финама была загружена.
Я подгрузил с сайта Финам коллекцию тиковых сделок по акциям за период с 10.04.2017 по 21.04.2017 в переменную _historyTicks, информация подгрузилась без ошибок за все даты (проверил). Далее в HistoryEmuationConnector передаю готовую коллекцию _historyTicks, как указано в ранее приложенном рабочем примере. После запуска коннектра, в функцию GetTrades, при вызове, поступают поочередно даты. За две пятницы дата в функцию не приходит (14.04.17 и 21.04.17). Очень странно поступают даты при вызове GetTrades: с начальной датой (10.04.17) функция вызывается три раза, далее приходят даты 11.04, 12.04, 13.04, 16.04 (воскресенье!?), 17.04, 18.04, 19.04, 20.04, через 15-20 секунд, вызывается повторно 19.04 и все. Акцию выбрал из топ списка - АЛРОСА (критерий ликвидность, и не очень много тиков).
Чисто логически можно предположить, что неделя на 1 день смещена... А как время в данных записано? Какое там смещение...
Спасибо, что подсказали про смещение на 1 день. Вроде разобрался. Если период в HistoryMessageAdapter задавать в формате UTC, то пропущенных дней нет.
Период указываю следующим образом:
ок.