Помогите пожалуйста с ZigZag

 

Помогите пожалуйста разобраться.

Мне нужно в каждый момент времени получать последние 3 вершины ZZ с такими параметрами

iCustom(NULL,0,"ZigZag",21,5,3,0,5)

и потом сравнивать эти 3 последние вершины по величине их значения. Помогите написать код. Не получается разобраться.
 

Три индейца на основе Зигзага.

Там использовал такую ф-ю: FindZigZag(int bar, int nP );

заполняет массивы Zbar[ZZP] и Zval[ZZP] от бара bar на глубину nP

extern int ExtDepth=10;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
#define ZZP 21

int Zbar[ZZP]; //номер бара с перегибом
double Zval[ZZP]; //значение зигзага в точке перегиба Zval[1] - в точке 1 и тд. 

datetime FindZigZag(int bar, int nP )
  {
   int n; datetime res;
   for(int i=bar;i<Bars;i++)
      {
         double zz=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,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;
           }
      }
      
      //for( i=0;i<nP;i++)
     // string str=str+i+" Вершина="+DoubleToStr(Zval[i] , Digits)+"/n";
     // Comment(str);
      
      return(res);
  }
 

Постараюсь болле подробно описать то что я пытаюсь сделать:

Допустим я запустил мой советник в некоторый момент времени обозначено желтой линией. По истечению некоторого времени появился первый перегиб №1, который будет фиксироваться на 5м баре на 5м баре.

Необходимо чтобы советник запомнил его значаение и присвоил его какойто переменной - допустим V1. Потом по истичению какогото времени снова появился перегиб №2, таже ситуация. потом 3й появился.

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

 

вот я вам и дал пример ф-ции, которая от любого бара находит заданное количество перегибов назад по истории и записывает их цены и номера баров в массивы Zval[ZZP] и Zbar[ZZP]

в Zval[0] попадает последняя точка ЗЗ - не перегиб,

в Zval[1] - первый найденный перегиб, самый молодой

а условиями

if(Zval[1]==High[Zbar[1]])//верхний

{ }

if(Zval[1]==Low[Zbar[1]]

{ }

можно проверить верхний он или нижний

 
berezhnuy:

Помогите пожалуйста разобраться.

Мне нужно в каждый момент времени получать последние 3 вершины ZZ с такими параметрами

iCustom(NULL,0,"ZigZag",21,5,3,0,5)

и потом сравнивать эти 3 последние вершины по величине их значения. Помогите написать код. Не получается разобраться.

Можно использовать функцию KimIV:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bs=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=1; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bs, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(zz);
    }
  }
  Print("GetExtremumZZPrice(): Экстремум ЗигЗага номер ",ne," не найден");
  return(0);
}
Причина обращения: