Обновлённый клиентский терминал MetaTrader 4 build 201 - страница 6

 

2 Rosh: мне надо ознакомиться с методом Владислава, есть непонятные термины. Это в большой эллиоттовской ветке здесь же?
Да, только я выдал фактически дайджест.
 

2 klot: твоя версия намноооого короче стандартной. Надо на него посмотреть, что он рисует...

Стараюсь :)

Есть идея сделать отдельный раздел для Zigzag'ов и Swing'ов.
 
Есть идея сделать отдельный раздел для Zigzag'ов и Swing'ов.

Поддерживаю.
 

2 klot: твоя версия намноооого короче стандартной. Надо на него посмотреть, что он рисует...

Стараюсь :)

Есть идея сделать отдельный раздел для Zigzag'ов и Swing'ов.

Полностью ЗА!!!
 
Можно открыть ветку по Zigzag|Swings , предлагать обоснованные алгоритмы, сами коды в корректно оформленом стиле выкладывать в Code Base на https://www.mql5.com/en/code/mt4
Не забываем, что в исходнике можно указать координаты автора (линк, e-mail, ник и ФИО). Таким образом, об индикаторе может узнать на порядок больше пользователей, и возможно, кто-то внесет свои идеи и пожелания.
Например, стандартный Zigzag из поставки МТ4 находится здесь - "MQL4: ZigZag"
Как не странно, индикатор является лидером по числу скачиваний среди пользовательских индикаторов, идущих в стандартной поставке.


Кроме того, имеется возможность сортировки , например, по количству скачиваний:



Любой выложенный в Code Base код можно скачать одним кликом мыши прямо из MetaEditor


 

Честно говоря, у меня пока четко оформленного алгоритма нет, но несколько дней назад я об этом очень крепко задумался и намерен создать абсолютно другой алгоритм. Подход к решению видится в рекурсии и только в ней, а не в последовательном многопроходном алгоритме. Рекурсия кажется здесь самым естественным подходом, автоматически учитывающим фрактальность чарта.
Зигзаг с рекурсивным вычислением есть.Его сделал Tauber. Правда, этот зигзаг встроен в мой индикатор. Но можно его и отцепить.
 
Еще один немаловажный момент для алгоритма зигзага. Стандартный зигзаг, несмотря на всю его сложность, дает возможность построения зигзагов на любых таймфреймах через алгоритм построения зигзага со старшего таймфрейма на младшем таймфрейме таким образом, что зигзаги (читай волны) старших периодов раскладываются на волны младших периодов. При этом для всех таймфреймов используются одни и теже параметры зигзага.То есть на чарте всегда будут точки, в которых зигзаги с разных таймфреймов сходятся и все зигзаги показывают в этих точках экстремумы. Другие алгоритмы такого не позволяют делать. Для разных таймфреймов надо подбирать свои параметры. Возможно, это свойство стандартного зигзага и заставляет многих возвращаться к этому зигзагу после поисков "своего" зигзага.
 
Еще один немаловажный момент для алгоритма зигзага. Стандартный зигзаг, несмотря на всю его сложность, дает возможность построения зигзагов на любых таймфреймах через алгоритм построения зигзага со старшего таймфрейма на младшем таймфрейме таким образом, что зигзаги (читай волны) старших периодов раскладываются на волны младших периодов. При этом для всех таймфреймов используются одни и теже параметры зигзага.То есть на чарте всегда будут точки, в которых зигзаги с разных таймфреймов сходятся и все зигзаги показывают в этих точках экстремумы. Другие алгоритмы такого не позволяют делать. Для разных таймфреймов надо подбирать свои параметры. Возможно, это свойство стандартного зигзага и заставляет многих возвращаться к этому зигзагу после поисков "своего" зигзага.

Мой алгоритм позволяет искать зкстремумы на других ТФ :)
 
Выкладываю код индикатора, использующий стиль отрисовки DRAW_ZIGZAG
Он является прямым потомком стандартного Zigzag'а и позволяет на примере получить представление об этом стиле отрисовки.
//+------------------------------------------------------------------+
//|                                                      Zigzag2.mq4 |
//|                 Copyright © 2005-2007, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ZigzagPeakBuffer[];
double ZigzagLawnBuffer[];
double HighMapBuffer[];
double LowMapBuffer[];
int level=3; // recounting's depth 
bool downloadhistory=false;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(4);
//---- drawing settings
   SetIndexStyle(0,DRAW_ZIGZAG);
   SetIndexStyle(1,DRAW_ZIGZAG);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigzagPeakBuffer);
   SetIndexBuffer(1,ZigzagLawnBuffer);
   SetIndexLabel(0,"ZigzafPeak");
   SetIndexLabel(1,"ZigzafLawn");

   SetIndexBuffer(2,HighMapBuffer);
   SetIndexBuffer(3,LowMapBuffer);

   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);

//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i, counted_bars = IndicatorCounted();
   int limit,counterZ,whatlookfor;
   int shift,back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   if (counted_bars==0 && downloadhistory) // history was downloaded
     {
      ArrayInitialize(ZigzagPeakBuffer,0.0);
      ArrayInitialize(ZigzagLawnBuffer,0.0);
      ArrayInitialize(HighMapBuffer,0.0);
      ArrayInitialize(LowMapBuffer,0.0);
     }
   if (counted_bars==0) 
     {
      limit=Bars-ExtDepth;
      downloadhistory=true;
     }
   if (counted_bars>0) 
     {
      while (counterZ<3 && i<100)
        {
         res=(ZigzagPeakBuffer[i]+ZigzagLawnBuffer[i]);
         if (res!=0) counterZ++;
         i++;
        }
      i--;
      limit=i;
      if (LowMapBuffer[i]!=0) 
        {
         curlow=LowMapBuffer[i];
         whatlookfor=1;
        }
      else
        {
         curhigh=HighMapBuffer[i];
         whatlookfor=-1;
        }
      for (i=limit-1;i>=0;i--)  
        {
         ZigzagPeakBuffer[i]=0.0;  
         ZigzagLawnBuffer[i]=0.0;  
         LowMapBuffer[i]=0.0;
         HighMapBuffer[i]=0.0;
        }
     }
      
   for(shift=limit; shift>=0; shift--)
     {
      val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      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=LowMapBuffer[shift+back];
               if((res!=0)&&(res>val)) LowMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      if (Low[shift]==val) LowMapBuffer[shift]=val; else LowMapBuffer[shift]=0.0;
      //--- high
      val=High[iHighest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      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=HighMapBuffer[shift+back];
               if((res!=0)&&(res<val)) HighMapBuffer[shift+back]=0.0; 
              } 
           }
        }
      if (High[shift]==val) HighMapBuffer[shift]=val; else HighMapBuffer[shift]=0.0;
     }

   // final cutting 
   if (whatlookfor==0)
     {
      lastlow=0;
      lasthigh=0;  
     }
   else
     {
      lastlow=curlow;
      lasthigh=curhigh;
     }
   for (shift=limit;shift>=0;shift--)
     {
      switch(whatlookfor)
        {
         case 0: // look for peak or lawn 
            if (lastlow==0 && lasthigh==0)
              {
               if (HighMapBuffer[shift]!=0)
                 {
                  lasthigh=High[shift];
                  lasthighpos=shift;
                  whatlookfor=-1;
                  ZigzagPeakBuffer[shift]=lasthigh;
                 }
               if (LowMapBuffer[shift]!=0)
                 {
                  lastlow=Low[shift];
                  lastlowpos=shift;
                  whatlookfor=1;
                  ZigzagLawnBuffer[shift]=lastlow;
                 }
              }
             break;  
         case 1: // look for peak
            if (LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)
              {
               ZigzagLawnBuffer[lastlowpos]=0.0;
               lastlowpos=shift;
               lastlow=LowMapBuffer[shift];
               ZigzagLawnBuffer[shift]=lastlow;
              }
            if (HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
              {
               lasthigh=HighMapBuffer[shift];
               lasthighpos=shift;
               ZigzagPeakBuffer[shift]=lasthigh;
               whatlookfor=-1;
              }   
            if (HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]!=0.0 && Close[shift]>Open[shift]) // outside bar
              {
               lastlow=LowMapBuffer[shift];
               lasthigh=HighMapBuffer[shift];
               lasthighpos=shift;
               lastlowpos=shift;
               ZigzagLawnBuffer[shift]=lastlow;
               ZigzagPeakBuffer[shift]=lasthigh;
              }   
            break;               
         case -1: // look for lawn
            if (HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
              {
               ZigzagPeakBuffer[lasthighpos]=0.0;
               lasthighpos=shift;
               lasthigh=HighMapBuffer[shift];
               ZigzagPeakBuffer[shift]=lasthigh;
              }
            if (LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
              {
               lastlow=LowMapBuffer[shift];
               lastlowpos=shift;
               ZigzagLawnBuffer[shift]=lastlow;
               whatlookfor=1;
              }   
            if (LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]!=0.0 && Close[shift]< Open[shift]) // outside bar
              {
               lasthigh=HighMapBuffer[shift];
               lastlow=LowMapBuffer[shift];
               lastlowpos=shift;
               lasthighpos=shift;
               lastlowpos=shift;
               ZigzagPeakBuffer[shift]=lasthigh;
               ZigzagLawnBuffer[shift]=lastlow;
              }
            break;               
         default: return; 
        }
      if (lasthighpos==lastlowpos && lasthighpos==shift)  Print("Outside Bar -",TimeToStr(Time[shift]));
     }

   return(0);
  }
//+------------------------------------------------------------------+
 
[quote]Выкладываю код индикатора, использующий стиль отрисовки DRAW_ZIGZAG
Отлично, я ни разу не использовл этот стиль :)
Маленький вопросик.
С помощю этого стиля можно рисовать лучик ZZ в будущее на SetIndexShift баров?
Хочу визуально оценить прогноз точки разворота (эстремума ЗЗ) и фактический разворот...
Причина обращения: