Использование готовой коллекции данных в HistoryEmulationConnector
Atom Ответить
14.03.2017


Добрый день.
Хочу передать коллекцию тиковых сделок IEnumerable<ExecutionMessage> в HistoryEmulationConnector.

Есть ли способ это сделать без использования механизма сохранения коллекции в файл через StorageRegistry?

Пытаюсь делать на основе примера тестирование на исторических данных через Финам,
с использованием метода RegisterHistorySource, но никак не получается.
Данные не подгружаются, свечки не строятся. Подскажите, пожалуйста, мою ошибку,
может быть есть у кого рабочее решение.

Пытаюсь сделать следующим образом:
_historyTicks - переменная содержащая коллекцию IEnumerable<ExecutionMessage> (тики загружены, проверил)

d1 = _historyTicks.ElementAt(0).ServerTime;
d2 = _historyTicks.ElementAt(_historyTicks.Count() - 1).ServerTime;

_historyConnector = new HistoryEmulationConnector(new[] {_selSecurity}, new[] {_selPortfolio})
{
EmulationAdapter =
{
Emulator = { Settings = { MatchOnTouch = false, } }
},

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();




Спасибо: RashinSergey




12 Ответов
Support

Фотография
Дата: 14.03.2017
Ответить



Код
private 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 и посмотрите какое время приходит в функцию, и что она возвращает...
Спасибо:

Pelmen32

Фотография
Курсы
Дата: 15.03.2017
Ответить


Сделал все по Вашей рекомендации.
Создал отдельный метод:
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}

Текст кода следующий:

public IEnumerable<Message> GetTrades(DateTimeOffset d)
{
var trades = _historyTicks.Where(ht => ((ht.ServerTime.Date == d.Date) &&
(ht.ServerTime.TimeOfDay == d.TimeOfDay)));
return trades;
}

. . .

if (_historyTicks != null)
{
d1 = _historyTicks.ElementAt(0).ServerTime;
d2 = _historyTicks.ElementAt(_historyTicks.Count() - 1).ServerTime;
}

_selSecurity = SecFinamBuilder.SelectedSecurityModyf;

_selPortfolio = new Portfolio
{
Name = "test account",
BeginValue = 1000000,
};

_historyConnector = new HistoryEmulationConnector(new[] {_selSecurity}, new[] {_selPortfolio})
{
EmulationAdapter =
{
Emulator = { Settings = { MatchOnTouch = false, } }
},

UseExternalCandleSource = false,
CreateDepthFromOrdersLog = false,
CreateTradesFromOrdersLog = false,
};

_historyConnector.HistoryMessageAdapter.StartDate = d1;
_historyConnector.HistoryMessageAdapter.StopDate = d2;

_historyConnector.RegisterHistorySource(_selSecurity, MarketDataTypes.Trades, null, GetTrades);

_historyConnector.NewMessage += (m) =>
{
var m1 = m;
Debug.Print(m.ToString());
};

_historyConnector.Connect();

var candleManager = new CandleManager(_historyConnector);

LoadSettingsDiagram();

_candleTimeFrame = TimeSpan.FromMinutes(5);

_connectorCandleSеries = new CandleSeries(typeof(TimeFrameCandle), _selSecurity, _candleTimeFrame);

candleManager.Processing += DrawElement;

candleManager.Start(_connectorCandleSеries);

_historyConnector.Start();
debug.txt (0)
Автор топика
Спасибо:

Support

Фотография
Дата: 15.03.2017
Ответить


Хорошо, будем проверять..
Спасибо:

Pelmen32

Фотография
Курсы
Дата: 29.03.2017
Ответить


Добрый день,
прошло уже 2 недели, удалось ли проверить данную проблему?
Автор топика
Спасибо:

Support

Фотография
Дата: 30.03.2017
Ответить


Нет еще..
Спасибо:

Support

Фотография
Дата: 17.04.2017
Ответить


Регистрацию источника нужно выполнять в событии NewSecurities.. Рабочий пример во вложении...
Спасибо:

Pelmen32

Фотография
Курсы
Дата: 24.04.2017
Ответить


Спасибо.
Все получилось, только не загружается информация за пятницы.
Пробовал загружать историю (тики) с Финама по акциям и передавать в HistoryEmulationConnector за период с 10.04.2017 по 21.04.2017
В метод GetTrades не приходят даты за пятницу 14.04.2017 и 21.04.2017.
Проверил, история за эти даты с Финама была загружена.
Автор топика
Спасибо:

Support

Фотография
Дата: 24.04.2017
Ответить


1. Загружена куда?
Спасибо:

Pelmen32

Фотография
Курсы
Дата: 24.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 и все.
Акцию выбрал из топ списка - АЛРОСА (критерий ликвидность, и не очень много тиков).
Автор топика
Спасибо:

Support

Фотография
Дата: 25.04.2017
Ответить


Чисто логически можно предположить, что неделя на 1 день смещена... А как время в данных записано? Какое там смещение...
Спасибо:

Pelmen32

Фотография
Курсы
Дата: 26.04.2017
Ответить


Спасибо, что подсказали про смещение на 1 день. Вроде разобрался.
Если период в HistoryMessageAdapter задавать в формате UTC, то пропущенных дней нет.

Период указываю следующим образом:
Код
_historyConnector.HistoryMessageAdapter.StartDate = d1.Date.ToUniversalTime();
_historyConnector.HistoryMessageAdapter.StopDate = d2.Date.ToUniversalTime().AddDays(1);

Автор топика
Спасибо:

Support

Фотография
Дата: 26.04.2017
Ответить


ок.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy