Добрый день.
При реализации стратегии решил сохранять свечки в локальной базе. Для получения свечек подписываюсь на событие СandleManager.CandlesFinished в событии Trader.Connected:
candleManager = new CandleManager(trader);
candleManager.CandlesFinished += candleManager_CandlesFinished;
в событии Trader.NewSecurities регистрирую какие свечки получать:
sec = obj.FirstOrDefault(e => e.Code == "GAZP");
if (sec != null)
{
if (!candleManager.IsTimeFrameCandlesRegistered(sec, timeFrame))
{
// регистрируем наш тайм-фрейм
candleManager.RegisterTimeFrameCandles(sec, timeFrame);
}
}
Таймфрейм равен 5 минутам. Данные приходят, за исключением последней свечки. Т.е. время первой свечки 10:30:00, а время последней 18:35:00, хотя должно быть 18:40:00?
Комментарии (13)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Как вы проверяете?
Для работы с базой использую EF. Обработчик candleManager_CandlesFinished примерно следующий:
Увидел кажется проблему... Событие CandlesFinished. Оно только для сформированных свечек. Видимо последние находятся еще в стадии формирования.
Программу с роботом закрываю через пару часов после завершения торгов, данные уже давно не поступают...
Дело в том, что свечка заканчивает формироваться не по таймеру, а по поступлению данных (чтобы избежать проблем с лагами в сети брокера, которые есть чуть ли не всегда). Поэтому свечка закончит формироваться тогда, когда появиться новая свечка.
Т.е. придется обрабатывать не Finished, а New и Changed? Не хотелось бы слишком часто в базу писать.
Пишите по окончанию сессии все свечки один раз.
Спасибо за ответы, буду думать дальше, хотя было бы классно, если для последней свечки это событие тоже вызывалось.
Оно и вызывается. Просто нужно понять схему алгоритма. Если он у вас другой, то можете всегда сделать свой собственный CandleFactory.
Алгоритм простой, после "завершения" свечки мне необходимо ее сохранить. CandlesFinished же не вызывается для последней свечки, так как, если я правильно понял, после нее свечек в этой сессии не будет.
Можно записывать все скопом после завершения сессии, но тогда усложнится момент запуска стратегии, так как сейчас я просто поднимаю нужное кол-во свечек из базы (там есть все сформировавшиеся свечки) и запускаю стратегию, а придется комбинировать получение данных из базы и CandleManager.
Есть вариант сделать что для последней свечки будет подниматься событие CandlesFinished если Trader.MarketTime станет больше чем время завершения сессии - т.е. если Trader.MarketTime >= 23.50 для фортса и >= 18.45 для ММВБ.
Это было бы замечательно🙂
Фикса в 3.1 не будет. Вариант локального решения - отнаследуйтесь от TimeFrameCandleFactory и переопределите IsCandleFinished с проверкой что время закончилось: