Получение свечных данных из сообщений

Получение свечных данных из сообщений
Atom
5/16/2017
gewinn


Добрый день.
Храню свечные данные в СУБД MS SQL Server (open/close time, o, h, l, c, V).

До сего момента использовал данные из файлов (Hydra/<первая буква инструмента>/<инструмент>/candles_TimeFrameCandle_1.00-00-00.bin), примерно так:
Code
var storageRegistry = new StorageRegistry { DefaultDrive = new LocalMarketDataDrive(config.history_folder_path) };


Хотел бы, чтобы HistoryEmulationConnector получал данные не из файлов а, например, из сообщений-свечек, полученных после выборки данных из СУБД.

Дайте, по-возможности, совет (лучше пример кода), как реализовать такую логику работы:
-> Загрузили из БД свечные данные по инструменту
-> Сформировали правильно сообщения-свечки из загруженных данных
-> После старта исторического тестирования HistoryEmulationConnector начал получать сообщения-свечки
-> Все работает, словно запустили тестирование из коробки

Спасибо!


1 2  >
Support

Avatar
Date: 5/16/2017
Reply


Посмотрите пример в атачменте. Там показано как подключить к эмулятору коллекцию свечей... По идее, то же самое можно сделать с коллекцией свечей...
EmulationConnector.7z 28 KB (408)
Thanks: gewinn

Support

Avatar
Date: 5/16/2017
Reply


Support
Посмотрите пример в атачменте. Там показано как подключить к эмулятору коллекцию сделок... По идее, то же самое можно сделать с коллекцией свечей...


Thanks:

gewinn

Avatar
Date: 5/16/2017
Reply


Спасибо, попробую
Thanks:

Support

Avatar
Date: 5/17/2017
Reply


..
Thanks:

gewinn

Avatar
Date: 5/23/2017
Reply


Все заработало. Спасибо!

Если кому будет интересно использовать свои свечные данные из своей (или удаленной СУБД), то, основываясь на примере от уважаемого суппорта SS, реализовал так:
1) Получаем свечные данные из БД, формируем свечки, кладем в коллекцию:
Code

....
while (reader.Read())
{
candles_list.Add(new TimeFrameCandle()
{
Security = security,
TimeFrame = TimeSpan.FromMinutes(period),
OpenTime = new DateTimeOffset((DateTime)reader["open_datetime"], ST.timezone_timespan_hours),
CloseTime = new DateTimeOffset((DateTime)reader["open_datetime"] + TimeSpan.FromMinutes(period), ST.timezone_timespan_hours),
OpenPrice = (decimal)(double)reader["o"],
HighPrice = (decimal)(double)reader["h"],
LowPrice = (decimal)(double)reader["l"],
ClosePrice = (decimal)(double)reader["c"],
TotalVolume = (decimal)(double)reader["v"]
});
}
db.closeDbConnection();


2) Пишем ф-цию, которая превращает свечки из коллекции в сообщения:
Code

public IEnumerable<Message> getCandles(DateTimeOffset d)
{
return candles_list.Where(с=> ((с.OpenTime.Date == d.Date) && (с.OpenTime.TimeOfDay == d.TimeOfDay))).Select(t => t.ToMessage());
}


3) Подписываемся на исторические данные из наших сообщений:
Code
...
connector.RegisterHistorySource(security, MarketDataTypes.CandleTimeFrame, typeof(Candle), getCandles);
...


4) Работаем дальше как из "коробки" - создаем экземпляр класса CandleManager, создаем серию свечек:
Code
...
candle_manager = new CandleManager(connector);
...
candle_serie = new CandleSeries(typeof(TimeFrameCandle), security, TimeSpan.FromMinutes(period));
...
candle_manager.Start(candle_serie);


5) Подписываемся на событие появления новых свечей и работаем с ними :)
Code
candle_manager .Processing += (series, candle) =>
{
//TODO
};


Еще раз спасибо!
Thanks:

Support

Avatar
Date: 5/24/2017
Reply


..
Thanks:

gewinn

Avatar
Date: 5/3/2018
Reply


Добрый день! После обновления с версии 4.4.5.4 до версии 4.4.8 перестали приходить свечи.
Проблема, судя по всему, в "3) Подписываемся на исторические данные из наших сообщений:".

Фрагмент лога:


Не подскажите, как правильно теперь подписываться на свечи из внешнего источника? Спасибо.
Thanks:

Support

Avatar
Date: 5/4/2018
Reply


Добрый день

Регистрация внешних источник была изменена в версии 4.4.7. Вы можете посмотреть пример SampleHistoryTesting как работать с внешними источниками. В примере используются сервисы Финам и Яху.

Изменения разработчиков https://github.com/Stock...82d10d989376c69e0b8c30e5
Thanks:

gewinn

Avatar
Date: 5/5/2018
Reply


Добрый вечер. Пример SampleHistoryTesting и github я посмотрел прежде чем писать сообщение выше.
После вашего ответа перепроверил еще раз - но каких-либо существенных изменений у вас в примере не нашел, кроме:
1) Подписка происходит теперь по событию подключения
2) Подписка происходит для всех инструментов сразу - в метод RegisterHistorySource() первым аргументом вы передаете null.

У меня в коннекторе HistoryEmulationConnector используется не один инструмент (у каждого своя стратегия). Плюс ко всему, каждый инструмент может содержать несколько таймфреймов.
Поэтому ранее я метод RegisterHistorySource() вызывал для всех таймфреймов для каждого инструмента.
Попробовал подписаться по событию подключения - тщетно. Поэтому непонятно даже, куда копать :( Танцевал с бубном долго.

Псевдокод получается такой:

1) Для каждого таймфрейма каждого инструмента подгружаю из СУБД свечи в коллекцию таймфрейма
Code
public List<Candle> candles_sourse;

В классе каждого таймфрейма реализован метод getCandles() :


2) В HistoryEmulationConnector подписываюсь на события изменения состояния, успешного подключения и получения инструментов:


3) Событие успешного подключения AHistoryEmulationConnector_Connected() :


4) Событие получения инструмента AHistoryEmulationConnector_NewSecurity() :


Вопросы:
1) Правильная ли логика и порядок действий?
2) Прежде, чем собирать сжатый пример по данной ситуации (например, их двух инструментов в одном коннекторе), можете, пожалуйста, написать более подробно,
что вы поменяли в плане подписок на внешние источники в версии 4.4.7. Попробую сам догадаться, т.к. в примере не совсем ясно, как реализованы методы getCandles()
у источников Финам и Яху.

Спасибо!


Thanks:

Support

Avatar
Date: 5/5/2018
Reply


После регистрации источника необходимо произвести подписку на данные. Подписка производится штатными методами класса Connector. В вышеприведённом коде у вас присутствует только регистрация источника.
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy