В примере SampleSMA пытаюсь получить текущую, не сформировавшуюся свечку, чтобы закрывать позицию по стопу, и никак не выходит: _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, _nextTime - base.TimeFrame) - возвращает последнюю сформированную свечку _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, _nextTime ) - всегда возвращает null
Как получить текущую свечку?
Комментарии (13)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
_candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, _trader.MarketTime)
И так не получается, всегда null. Вот код protected override bool OnProcess() { // если наша стратегия в процессе остановки if (base.ProcessState == StrategyProcessStates.Stopping) { // отменяем стратегию base.Orders.Where(o => o.State == OrderStates.Active).ForEach(base.Trader.GuarantyCancelOrder); // так как все активные заявки гарантированно были отменены, то возвращаем false return false; }
_candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, Trader.MarketTime);
никогда сюда не заходит ... }
что раньше, чем окончания текущей 5-минутки. if (base.Trader.MarketTime < _nextTime) { // возвращаем true, так как наш алгоритм еще не закончил свою работу, а просто ожидает следующего вызова. return true; }
base.TimeFrame, _nextTime - base.TimeFrame); // если свечки не существует (не было ни одной сделке в тайм-фрейме), то ждем окончания следующей свечки. if (candle == null) return true;
Начнем с простого - CandleManager.NewCandles вообще вызывается?
Да, на графике все свечки есть, в том числе и текущая
Тоесть, она на графике изменяется, появляются другие текущие свечки? Тогда экспорт идет правильно. А Вы случаем с биржей временного смещения не имеете?
Нет, поставил на компе московское время
Тогда как-то странно. График ведь берет из того же источника... А OnProcess как часто вызывается? Может из-за того, что он вызывается раньше, чем будут получены новые следки для портсоения свечки, ничего не находит, засывает на тайм время, опять просывается.... Попробуйте изменить стратегию, если нужна текущая свечка:
if (candleCur != null ) { ....
else return true;
И уменьшить тайм фремя скажем до секунды (в примере со скользящими жестко стоят минутки насколько я помню).
OnProcess вызывается многократно внутри тайм фрейма. Вот сейчас смотрел: ТФ - 1 мин. На графике последняя свечка 16:37. Она есть, сделки идут, она перерисовывается. Ставлю брэкпоинт, смотрю MarketTime - 16:37:15, _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, Trader.MarketTime); - возвращает Null 37-ая минута закончится и _candleManager.GetTimeFrameCandle(base.Security, base.TimeFrame, _nextTime - base.TimeFrame) вернет сформированную свечку
Мне, по стратегии, нужны и сформированные свечки и текущая. Входы по закрытию, а вот выхожу и внутри свечи
Да, я кажется понял. Дело в том, что свечка ищется в точном соотношении времени. Соответсвенно нужно обрезать секунды. Или использовать специальный метод TraderHelper.GetCandleBounds
Надо как секунды, так и милисекунды обрезать. Просто 0 им присваивать, я так поступаю. Тоже некоторое время провозился с этим.
Большое спасибо Mikhail, Alexandr! Всё заработало. Отличная библиотека!
n ?????????? ?????????? ?????? CandleManager.NewCandles ????? ?? ???????????\r\n\n