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

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


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

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

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

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

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> 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


1 2  >
Support

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


[code]private IEnumerable> 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);[/code]

Вот так сделайте... Поставьте точку останова внутрь GetTrades и посмотрите какое время приходит в функцию, и что она возвращает...

Спасибо:

Pelmen32

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


Сделал все по Вашей рекомендации. Создал отдельный метод: public IEnumerable 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 16 KB (620)
Спасибо:

Support

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


Хорошо, будем проверять..

Спасибо:

Pelmen32

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


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

Спасибо:

Support

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


Нет еще..

Спасибо:

Support

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


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

EmulationConnector.7z 28 KB (643)
Спасибо:

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 день смещена... А как время в данных записано? Какое там смещение...

Спасибо:
1 2  >

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

loading
clippy