Как исправить мерцание индикаторов типа Zigzag

 

Как это исправить ?? Стандартный индикатор Зигзаг мерцает. Мой написаный так же мерцает...

Если долго смотреть на такое, то можно эпилепсию заработать! 

Проблема только у меня или это терминал ? 

 

В коде есть такие строки:

   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);
     }

Но при этом необходимо сделать необходимые проверки на синхронизированность таймсерий.

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - Документация по MQL5
 
nen :

В коде есть такие строки:

   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);
     }


но после перовго расчета индикатора переинициализации быть не должно

 
Rosh :

О каком варианте идет речь? В стандартной поставке 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 переписать

Причина обращения: