В коде есть такие строки:
if(prev_calculated==0)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
Расположены в функции OnCalculate
Получается, что если на предыдущем вызове индикатора не было обработано ничего, то prev_calculated=0
И в этом случае происходит переинициализация массивов индикаторных буферов.
Это и вызывает мерцание зигзагов.
Переинициализацию необходимо производить только при начальной загрузке или если произошла подкачка истории.
Если не обработано 2 бара, то это нормально. Если необработано на предыдущем вызове более двух баров, то в этом случае необходимо производить переинициализацию.
Вышеприведенный код необходимо переписать примерно так:
if(Bars(.....)-prev_calculated>2)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
Но при этом необходимо сделать необходимые проверки на синхронизированность таймсерий.

- www.mql5.com
В коде есть такие строки:
if(prev_calculated==0)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
Расположены в функции OnCalculate
О каком варианте идет речь? В стандартной поставке ZigZag есть такое место
if(prev_calculated==0)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
но после перовго расчета индикатора переинициализации быть не должно
О каком варианте идет речь? В стандартной поставке ZigZag есть такое место
но после перовго расчета индикатора переинициализации быть не должно
Не знаю, последняя ли это версия. Смотрел ZigZag.mq5.
Есть проблема, о которой написал автор топика. Возникает вопрос, почему это происходит.
Стал смотреть код и справку.
В Справке написано, что
prev_calculated, // обработано баров на предыдущем вызове.
И отсюда вся логика моего ответа. Ведь действительно индикатор мерцает.
А кроме как переинициализацией индикаторных буферов пока больше ничем объяснить мерцание не могу.
И это похоже действительно так:
if(prev_calculated==0)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
//--- set start position for calculations
if(prev_calculated==0) limit=ExtDepth;
//--- ZigZag was already counted before
if(prev_calculated>0)
{
.....
Происходит переинициализация, если prev_calculated==0
Но далее перерасчета не происходит потому что prev_calculated==0
И какое-то время до следующего тика прорисовки зигзага нет.
Лучше сделать
if(Bars(.....)-prev_calculated>2)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
А можно ввести еще три глобальные переменные lBar , hBar и tBar
double lBar, hBar;
datetime tBar;
И пересчет индикатора вызывать только когда на следующем тике
if (lBar>Low[0] || hBar<High[0] || tBar!=Time[0])
{
lBar=Low[0]; hBar=High[0]; tBar=Time[0];
if(Bars(.....)-prev_calculated>2)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
// Здесь код расчета индикатора.
}
lBar=Low[0]; hBar=High[0]; tBar=Time[0]; - это как в МТ4. Для МТ5 переписать

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как это исправить ?? Стандартный индикатор Зигзаг мерцает. Мой написаный так же мерцает...
Если долго смотреть на такое, то можно эпилепсию заработать!
Проблема только у меня или это терминал ?