Бары экстремумов ZigZag

 

Не все бары экстремумов ZigZag определяются верно, причём на нижних в основном
В чём может быть проблема?

Пример кода индикатора:

double Pik1,Pik2;
bool Up=true,Dn=true;
int pp;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double& high[],
                const double& low[], 
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int j=rates_total-prev_calculated-1;

   while(j>=0)
     {
   if(High[j+NumBar(j,1)]>Low[j+NumBar(j,2)]){
      Pik1=High[j+NumBar(j,1)]; 
      Pik2=Low[j+NumBar(j,2)];
      Up=true;
      Dn=false;
      } else {
   if(Low[j+NumBar(j,1)]<High[j+NumBar(j,2)]){
      Pik1=Low[j+NumBar(j,1)]; 
      Pik2=High[j+NumBar(j,2)];
      Dn=true;
      Up=false;}}
//---+
   pp=(int)MathAbs((Pik2-Pik1)/Point);
j--;}

return(rates_total);}

//+------------------------------------------------------------------+
//|  Возвращает номер бара ZZ по его номеру                          |
//+------------------------------------------------------------------+
int NumBar(int n,int NumSign=0) { 
  double arrow=0.0;
  int    bar,CountBars=iBars(Symbol(),0),num=0;

  for(bar=0; bar<CountBars; bar++){
    arrow=IndBuffer[n+bar];// <<== Это ZigZag ==|
    if(arrow!=0.0 && arrow!=EMPTY_VALUE){
        num++;
     if(num>NumSign) return(bar);}
    }
  Print("экстремум не найден");
return(-1);}
//--------------------------------------------------------------------+
 
forex2030:

Не все бары экстремумов ZigZag определяются верно, причём на нижних в основном
В чём может быть проблема?


В непонимании Zig-Zag. 

И в не очень хорошей структуризации программы. 

 
Алексей Тарабанов:

В непонимании Zig-Zag. 

Если есть понимание можно тогда направить куда обратить внимание?

 
forex2030:

Если есть понимание можно тогда направить куда обратить внимание?

Ну, у Вас функция возвращает номер бара по его номеру. Это как? 

if then else совсем никакая. Не покрывает все возможные исходы. 

Учитесь. 

 
Алексей Тарабанов:

Ну, у Вас функция возвращает номер бара по его номеру. Это как? 

if then else совсем никакая. Не покрывает все возможные исходы. 

Совершенно не информативный ответ!!

 
forex2030:

Совершенно не информативный ответ!!

Ваш вариант разобрать? Или, дать вариант рабочего ZZ? Или сами посмотрите? 

Ваш условный оператор работает с верхними точками, но отсекает часть нижних. 

Да и вообще, это - не алгоритм построения ZZ. 

 
Алексей Тарабанов:

Ваш вариант разобрать? Или, дать вариант рабочего ZZ? Или сами посмотрите? 

Лучше мой разобрать

Ваш условный оператор работает с верхними точками, но отсекает часть нижних. 

Да, я это тоже заметил и не пойму почему

Да и вообще, это - не алгоритм построения ZZ. 

Это малая часть кода. Для определения где может быть кривописание.

 
forex2030:

Лучше мой разобрать

Да, я это тоже заметил и не пойму почему

Это малая часть кода. Для определения где может быть кривописание.


if(High[j+NumBar(j,1)]>Low[j+NumBar(j,2)]){
      Pik1=High[j+NumBar(j,
1)];
      Pik2=Low[j+NumBar(j,
2)];
      Up=
true;
      Dn=
false;
      }
else {
  
if(Low[j+NumBar(j,1)]<High[j+NumBar(j,2)]){
      Pik1=Low[j+NumBar(j,
1)];
      Pik2=High[j+NumBar(j,
2)];
      Dn=
true;
      Up=
false;}}

 
Только теперь на верхних точках будут ошибки. 
 
Просто, потому, что рассматривается неполный набор событий(исходов). 
 

Алексей Тарабанов:
Только теперь на верхних точках будут ошибки. 

if(High[j+NumBar(j,1)]>Low[j+NumBar(j,2)]){
      Pik1=High[j+NumBar(j,
1)];
      Pik2=Low[j+NumBar(j,
2)];
      Up=
true;
      Dn=
false;
      } 
else  {
   
if(Low[j+NumBar(j,1)]<High[j+NumBar(j,2)]){
      Pik1=Low[j+NumBar(j,
1)];
      Pik2=High[j+NumBar(j,
2)];
      Dn=
true;
      Up=
false;}}

А что поменялось?
Всё тоже самое.

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