Получение свечных данных из сообщений
Atom Ответить
16.05.2017


Добрый день.
Храню свечные данные в СУБД 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 начал получать сообщения-свечки
-> Все работает, словно запустили тестирование из коробки

Спасибо!



Спасибо:




12 Ответов
Support

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


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

Support

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


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


Спасибо:

gewinn

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


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

Support

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


..
Спасибо:

gewinn

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


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

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

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

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


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


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


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


Еще раз спасибо!
Автор топика
Спасибо:

Support

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


..
Спасибо:

gewinn

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


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

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


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

Support

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


Добрый день

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

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

gewinn

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


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

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

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

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

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


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


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


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


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

Спасибо!


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

Support

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


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

gewinn

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


Добрый день. Подписка на данные в эмуляторе не помогла (ранее она была необходима только при биржевых подключениях).

Поэтому собрал очень короткий пример иллюстрирующий обсуждаемую проблему, с комментариями.
Прикрепляю и очень прошу посмотреть.

Цель: получить на обработку свечку с методе processCandle() внутри стратегии.

Очень надеюсь на помощь.

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

Support

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


Проблема решена по почте.
Спасибо:


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

loading
clippy