Советники: New Candle or Bar formation. - страница 2

 
Maxim Kuznetsov # :

1. Неправильно инициализированное previous_time, вызывающее ложные срабатывания сразу после запуска кода.

2. дорогостоящий доступ к iTime при каждом тике.

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

Работа кода заключается в обнаружении образования новой свечи, что можно сделать только внутри функции Ontick или OnTimer.
 

Вы не можете знать, когда закрывается свеча. Только когда приходит новый тик, который начинает новый бар, старый бар закрывается, и этот тик может прийти почти в конце продолжительности бара.

Для теста нового бара Bars ненадежен (обновление/подключение может изменить количество баров на графике), объем ненадежен (пропуск тиков), цена ненадежна (дублирование цен и операнд The ==. - Форум по программированию на MQL4.) Всегда используйте время.
MT4: Новая свеча - Форум по программированию на MQL4 #3 (2014)
MT5: Доступ к переменным - Форум по программированию на MQL4 #3 (2022)

Я не согласен с созданием функции new bar, потому что она может быть вызвана только один раз за тик (второй вызов возвращает false). Переменная может быть проверена несколько раз.
Запуск советника один раз в начале каждого бара - Форум по программированию на MQL4 (2011)

 static datetime curDT=0; datetime preDT=curDT; curDT=iTime(_Symbol,_Period,0);
 if(curDT != preDT){ … }
 
William Roeder #:

Я не согласен с созданием функции new bar, потому что она может быть вызвана только один раз за тик (второй вызов возвращает false). Переменная может быть проверена несколько раз.

У меня получилось сделать общую функцию IsNewBar(symbol, timeframe), которая работает корректно внутри одного советника для разных комбинаций symbol и timeframe, и может вызываться неоднократно в пределах обработки одного тика, возвращая во второй раз (и последующие разы) то же, что и в первый раз.