CandleManager и последняя свечка в сессии
Atom Ответить
27.04.2011


Добрый день.

При реализации стратегии решил сохранять свечки в локальной базе. Для получения свечек подписываюсь на событие С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 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 28.04.2011
Ответить


Как вы проверяете?
Спасибо:

esper

Фотография
Программист
Дата: 29.04.2011
Ответить


Mikhail Sukhov Перейти
Как вы проверяете?

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

Для работы с базой использую EF. Обработчик candleManager_CandlesFinished примерно следующий:
Код

void candleManager_CandlesFinished(CandleToken arg1, IEnumerable<Entities.Candle> arg2)
{
foreach (var c in arg2)
{
var candle = context.Candles.FirstOrDefault(e => e.Security.Code == c.Security.Code && e.Time == c.Time);
if (candle == null)
{
candle = new Entities.TimeFrameCandle()
{
Security = c.Security,
Time = c.Time,
OpenPrice = c.OpenPrice,
HighPrice = c.HighPrice,
LowPrice = c.LowPrice,
ClosePrice = c.ClosePrice,
TotalVolume = c.TotalVolume,
};
context.Add(candle);
}

}
context.SaveChanges();
}
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.04.2011
Ответить


Увидел кажется проблему... Событие CandlesFinished. Оно только для сформированных свечек. Видимо последние находятся еще в стадии формирования.
Спасибо:

esper

Фотография
Программист
Дата: 29.04.2011
Ответить


Mikhail Sukhov Перейти
Увидел кажется проблему... Событие CandlesFinished. Оно только для сформированных свечек. Видимо последние находятся еще в стадии формирования.


Программу с роботом закрываю через пару часов после завершения торгов, данные уже давно не поступают...
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.04.2011
Ответить


esper Перейти
Mikhail Sukhov Перейти
Увидел кажется проблему... Событие CandlesFinished. Оно только для сформированных свечек. Видимо последние находятся еще в стадии формирования.


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


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

esper

Фотография
Программист
Дата: 29.04.2011
Ответить


Mikhail Sukhov Перейти
esper Перейти
Mikhail Sukhov Перейти
Увидел кажется проблему... Событие CandlesFinished. Оно только для сформированных свечек. Видимо последние находятся еще в стадии формирования.


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


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


Т.е. придется обрабатывать не Finished, а New и Changed? Не хотелось бы слишком часто в базу писать.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.04.2011
Ответить


esper Перейти
Т.е. придется обрабатывать не Finished, а New и Changed? Не хотелось бы слишком часто в базу писать.


Пишите по окончанию сессии все свечки один раз.
Спасибо:

esper

Фотография
Программист
Дата: 29.04.2011
Ответить


Mikhail Sukhov Перейти
Пишите по окончанию сессии все свечки один раз.


Спасибо за ответы, буду думать дальше, хотя было бы классно, если для последней свечки это событие тоже вызывалось.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 29.04.2011
Ответить


esper Перейти
Mikhail Sukhov Перейти
Пишите по окончанию сессии все свечки один раз.


Спасибо за ответы, буду думать дальше, хотя было бы классно, если для последней свечки это событие тоже вызывалось.


Оно и вызывается. Просто нужно понять схему алгоритма. Если он у вас другой, то можете всегда сделать свой собственный CandleFactory.
Спасибо:

esper

Фотография
Программист
Дата: 29.04.2011
Ответить


Mikhail Sukhov Перейти
Оно и вызывается. Просто нужно понять схему алгоритма. Если он у вас другой, то можете всегда сделать свой собственный CandleFactory.


Алгоритм простой, после "завершения" свечки мне необходимо ее сохранить. CandlesFinished же не вызывается для последней свечки, так как, если я правильно понял, после нее свечек в этой сессии не будет.

Можно записывать все скопом после завершения сессии, но тогда усложнится момент запуска стратегии, так как сейчас я просто поднимаю нужное кол-во свечек из базы (там есть все сформировавшиеся свечки) и запускаю стратегию, а придется комбинировать получение данных из базы и CandleManager.
Автор топика
Спасибо:

Alexander

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


esper Перейти
Mikhail Sukhov Перейти
Оно и вызывается. Просто нужно понять схему алгоритма. Если он у вас другой, то можете всегда сделать свой собственный CandleFactory.


Алгоритм простой, после "завершения" свечки мне необходимо ее сохранить. CandlesFinished же не вызывается для последней свечки, так как, если я правильно понял, после нее свечек в этой сессии не будет.


Есть вариант сделать что для последней свечки будет подниматься событие CandlesFinished если Trader.MarketTime станет больше чем время завершения сессии - т.е. если Trader.MarketTime >= 23.50 для фортса и >= 18.45 для ММВБ.
Спасибо:

esper

Фотография
Программист
Дата: 29.04.2011
Ответить


Alexander Перейти
Есть вариант сделать что для последней свечки будет подниматься событие CandlesFinished если Trader.MarketTime станет больше чем время завершения сессии - т.е. если Trader.MarketTime >= 23.50 для фортса и >= 18.45 для ММВБ.


Это было бы замечательноSmile
Автор топика
Спасибо:

Alexander

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


esper Перейти
Alexander Перейти
Есть вариант сделать что для последней свечки будет подниматься событие CandlesFinished если Trader.MarketTime станет больше чем время завершения сессии - т.е. если Trader.MarketTime >= 23.50 для фортса и >= 18.45 для ММВБ.


Это было бы замечательноSmile


Фикса в 3.1 не будет.
Вариант локального решения - отнаследуйтесь от TimeFrameCandleFactory и переопределите IsCandleFinished с проверкой что время закончилось:
Код
            return trade.Time < currentCandle.Time || (currentCandle.Time + token.TypedArg) <= trade.Time || trade.Security.Trader.MarketTime.TimeOfDay >= trade.Security.Exchange.WorkingTime.Times.Last().Max;
Спасибо: esper


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

loading
clippy