Индикатор ZigZag. Нужно оптимизировать рабочий код. MQL4

 
Есть советник на индикаторе ZigZag.
Все как бы ничего, рабочий, но потребляет очень много ресурсов.
Общие знания есть но далеко не достаточно чтобы правильно оптимизировать.
Помогите знающие люди.
Заранее спасибо

datetime ZZ0s(int bar, int nP)
  {
   int n;
   datetime res;
   for(int i=bar; i<Bars; i++)
     {
      double zz=iCustom(Symbol(),PERIOD_M5,"ZigZag",48,12,5,0,i);
      if(zz!=0 && zz!=EMPTY_VALUE)
        {
         Zbar[n]=i;
         Zval[n]=zz;
         if(n==0)
            res=Time[Zbar[n]];//iTime(NULL, 0 , Zbar[n]);

         n++;
         if(n>=nP)
            break;
        }
     }

   return(res);
  }


datetime ZZ1s(int bar, int nP)
  {
   int n;
   datetime res;
   for(int i=bar; i<Bars; i++)
     {
      double zz=iCustom(Symbol(),PERIOD_M5,"ZigZag",48,12,5,0,i);
      if(zz!=0 && zz!=EMPTY_VALUE)
        {
         Zbar[n]=i;
         Zval[n]=zz;
         if(n==1)
            res=Time[Zbar[n]];//iTime(NULL, 0 , Zbar[n]);

         n++;
         if(n>=nP)
            break;
        }
     }

   return(res);
  }
n==0  n==1  n==2  n==3 ..... n==6

//-------------------------------------------------------------------------

   ZZ0 = ZZ0s(0,6);
   ZZ1 = ZZ1s(0,6);
   ZZ2 =ZZ2s(0,6);
   ZZ3 = ZZ3s(0,6);
   ZZ4 =ZZ4s(0,6);
   ZZ5 =ZZ5s(0,6);
   ZZ6 =ZZ6s(0,6);

      high0 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ0));
      high1 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ1));
      high2 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ2));
      high3 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ3));
      high4 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ4));
      high5 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ5));
      high6 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ6));
 
Yuriy Abragamets:



      high1 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ1));
    ну и т д получаем максимумы для каждого значения zigzag

Но если таких значений больше n==5 , 6  ,  то это уже не вариант.

Как можно написать код, чтобы получать на выходе значения максимумов от 0 до 6 и не пересчитывать каждый раз.


Индексы баров изменяются только с приходом нового бара. Поэтому, как минимум, такой расчет можно делать один раз на бар, а не на каждом тике.

Плюс можно запоминать индексы полученных ранее баров и добавлять к ним 1 с приходом каждого нового бара.

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

high0 = iHigh(Symbol(),PERIOD_M5,iBarShift(Symbol(),PERIOD_M5,ZZ0));

не может работать всегда и везде.

 
Yuriy Abragamets:
Есть советник на индикаторе ZigZag.
Все как бы ничего, рабочий, но потребляет очень много ресурсов.
Общие знания есть но далеко не достаточно чтобы правильно оптимизировать.
Помогите знающие люди.
Заранее спасибо

Зачем изобретать велосипед? Есть же идеальный зигзаг - XLab_ZZ.

 
khorosh:

Зачем изобретать велосипед? Есть же идеальный зигзаг - XLab_ZZ.

Спасибо, но вопрос не в самом индикаторе, а в советнике на основании индикатора
Причина обращения: