Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vlad
512
Vlad  

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

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

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

Eugeni Neumoin
2097
Eugeni Neumoin  

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

   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
Rashid Umarov
Админ
12501
Rashid Umarov  
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);
     }


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

Eugeni Neumoin
2097
Eugeni Neumoin  
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 переписать

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий