ZigZag MetaQuotes и другие вопросы - страница 2

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



Разработчики, отчего может происходить это повисание экстремумов в воздухе ?
 
На минутках мне не приходило в голову смотреть Zigzag, а вот на часвоках в тестере я видел ситуацию, когда между Лоу и Хай Зигзага вклинивается непонятно что. Ветка с экспертом находится здесь - "Снова про индикаторы в Экспертах - вопрос к разработчикам" рисунок из той ветки можно увидеть здесь - "MQL4: Вопросы по MQL4."

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

Завтра выложим исправление, проверите.
 
Сначала нужно разобраться - почему рисуются воздушные экстремумы, а потом уже смотреть алгоритм.

То есть Вы уверены, что с алгоритмом это не связано ?
 
Сначала нужно разобраться - почему рисуются воздушные экстремумы, а потом уже смотреть алгоритм.

То есть Вы уверены, что с алгоритмом это не связано ?


Но ведь раньше было все нормально. Могли изменить некоторые функции в компиляторе, и теперь алгоритм сломался- это самое простое объяснение. А так как мы не знаем - что там меняли,а можем только догадываться - сначала разработчики у себя глянут. Например , могли изменить Highest() и Lowest().
 
Сначала нужно разобраться - почему рисуются воздушные экстремумы, а потом уже смотреть алгоритм.

То есть Вы уверены, что с алгоритмом это не связано ?


Но ведь раньше было все нормально. Могли изменить некоторые функции в компиляторе, и теперь алгоритм сломался- это самое простое объяснение. А так как мы не знаем - что там меняли,а можем только догадываться - сначала разработчики у себя глянут. Например , могли изменить Highest() и Lowest().

Нет, просто банальные ошибки в коде самого эксперта. Завтра Слава опубликует код.
 
А несколько максимумов подряд вот из-за этого косочка кода:
for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
else
{
res=ExtMapBuffer2[shift];
if(res!=0.0) ExtMapBuffer[shift]=res;
}
}
Почему-то автор решил отдать предпочтение максимумам. И если ZigZag находит на одном баре максимум и минимум, то этот кусочек кода оставляет только максимум.
 
Вот исправленный зигзаг
//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtLowBuffer[];
double ExtHighBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtLowBuffer);
   SetIndexBuffer(2,ExtHighBuffer);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos,index;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;
//----
   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      index=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      val=Low[index];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtLowBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtLowBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtLowBuffer[shift]=0.0;
      if(val!=0.0) ExtLowBuffer[index]=val;
      //--- high
      index=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      val=High[index];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtHighBuffer[shift+back];
               if((res!=0)&&(res<val)) ExtHighBuffer[shift+back]=0.0; 
              } 
           }
        }
      ExtHighBuffer[shift]=0.0;
      if(val!=0.0) ExtHighBuffer[index]=val;
     }
//---- final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtLowBuffer[shift];
      curhigh=ExtHighBuffer[shift];
      if(curlow==0 && curhigh==0) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtHighBuffer[lasthighpos]=0;
            else ExtHighBuffer[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtLowBuffer[lastlowpos]=0;
            else ExtLowBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
//---- merge 2 buffers
   lasthighpos=-1;
   lastlowpos=-1;
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         curlow=ExtLowBuffer[shift];
         curhigh=ExtHighBuffer[shift];
         //----
         res=0;
         if(curlow!=0)
           {
            if(lastlowpos==-1)
              {
               res=curlow;
               lastlowpos=shift;
              }
            else
              {
               if(lasthighpos!=-1 && lastlowpos>lasthighpos)
                 {
                  res=curlow;
                  lastlowpos=shift;
                 }
              }
           }
         if(curhigh!=0)
           {
            if(lasthighpos==-1)
              {
               res=curhigh;
               lasthighpos=shift;
              }
            else
              {
               if(lastlowpos!=-1 && lasthighpos>lastlowpos)
                 {
                  res=curhigh;
                  lasthighpos=shift;
                 }
              }
           }
         //----
         ExtMapBuffer[shift]=res;
        }
     }
  }
//+------------------------------------------------------------------+


В алгоритм не вмешивался, внёс всего 2 исправления.

1. Сохранение индекса экстремума, который не всегда совпадает со значением shift

2. При объединении двух массивов верхних и нижних экстремумов второй подряд идущий экстремум игнорируется.

 
Думаю, у этой версии будут также свои "приверженцы" :)




Красным - "старый", Синим - "новый" зигзаги.
 
2 Slawa

В отличие от всех других индикаторов, в этом зигзаге не используется функция IndicatorCounted(). Кроме того, есть целых 3 цикла, которые проходят каждый раз по всей истории. При всей простоте алгоритма, это приводит к тормозу и нагрузке на ресурсы компа.
В алгоритме я особо не разбирался, просто хотел узнать - что-то мешает сделать зигзаг по общей схеме, когда то, что не меняется уже не пересчитывается ?

И еще вопрос. Объясните смысл каждого из трех параметров этого зигзага.
Можно было бы понять это и из программы, но мне хотелось бы знать что там заложено по идее.

Спасибо.
Причина обращения: