Страница 2 из 5

Re: ZigZag - индикатор

Добавлено: 03 мар 2016, 08:20
Gerig
Еще одна реализация индикатора ZigZag. Показания этого индикатора полностью совпадают с показаниями предыдущего, хотя способ его реализации другой. В этом индикаторе, пунктирной линией цвета Magenta соединяется уже найденный пик с локальным минимумом (который еще не стал впадиной, но может ей стать), такой же механизм отображения при найденной впадине. Впадина пунктирной линией соединяется с локальным максимумом. Это сделано потому, что в предыдущих версиях они отображались одним цветом и могла возникнуть путаница. Серая линия "X" отображает значение параметра ZigZag по которому производится расчет пиков и впадин. Иными словами эта линия делит график цены на участки, где сформированы пики и впадины.

Код: Выделить всё

function Initialize()
{
IndicatorName = "ZZWL";       
PriceStudy = true;
AddInput("Input", Inputs.Candle);       
AddSeries("ZZWL", DrawAs.Line, Color.Blue);   
AddSeries("Lh_Ll", DrawAs.Custom, Color.Magenta, true, Axes.Parent); 
AddSeries("O", DrawAs.Custom, Color.Magenta);       
AddSeries("X", DrawAs.Line, Color.Gray);       

AddParameter("Delta", 0.2);

AddGlobalVariable("peakDetected", Types.Boolean,  false);       
AddGlobalVariable("troughDetected", Types.Boolean,  false);       
AddGlobalVariable("peakbar", Types.Int,  0);       
AddGlobalVariable("troughbar", Types.Int,  0);       

AddGlobalVariable("hi", Types.Double,  0);       
AddGlobalVariable("lo", Types.Double,  0);       
AddGlobalVariable("hibar", Types.Int,  0);       
AddGlobalVariable("lobar", Types.Int,  0);       
}

function Evaluate()
{
// AlfaDirect 2015.
// ZZWL (ZigZag WelthLab)
// Новый минимум, если Low бара вырос от текущего Low на %
// Новый максимум, если High бара снизился от текущего High на %
  if (CurrentIndex < 2)
  {
    lo = Input.Low[0];          //First min candle for Low
    hi = Input.High[0];         //First max candle for High
  }
  else
  {
      double delta = 0.01*Delta;
      //Detected Local max and Local min
            if(Input.High[0] > hi) 
                  {
                       hi = Input.High[0];
                       hibar = CurrentIndex;
                        }
                        if(Input.Low[0] < lo)
                        {
                        lo = Input.Low[0];
                        lobar = CurrentIndex;
                        }
                        if(!troughDetected)
                        {
                           X = (1 + delta)*lo;
                           if(Input.Low[0] > (1 + delta)*lo)
                            {
                             troughDetected = true;
                             peakDetected = false;
                             hi = Input.High[0];
                             hibar = CurrentIndex;
                             troughbar = lobar;
                             O[lobar-CurrentIndex] = lo;
                             ZZWL[lobar-CurrentIndex] = lo;
                            }
                        }
                        if(!peakDetected)
                        {
                           X = (1 - delta)*hi;
                           if(Input.High[0] < (1 - delta)*hi)
                           {
                            troughDetected = false;
                            peakDetected = true;
                            lo = Input.Low[0];
                            lobar = CurrentIndex;
                            peakbar = hibar;
                            O[hibar-CurrentIndex] = hi;
                            ZZWL[hibar-CurrentIndex] = hi;
                           }
                        }
                   O.DrawCircle();
                   if (CurrentIndex == MaxIndex)
                   {
                      if (troughbar > peakbar)
                       {
                         Lh_Ll[troughbar-CurrentIndex]=ZZWL[troughbar-CurrentIndex];
                         Lh_Ll[hibar-CurrentIndex] = hi;
                       }
                      if (troughbar < peakbar)
                       {
                         Lh_Ll[peakbar-CurrentIndex]=ZZWL[peakbar-CurrentIndex];
                         Lh_Ll[lobar-CurrentIndex] = lo;
                       }
                       
                   }
                   Lh_Ll.DrawLine(Color.Magenta, Line.Dot, 2);
  }
}

Re: ZigZag - индикатор

Добавлено: 22 мар 2016, 22:07
Pisces
Возможно ли доработать Ваш ZigZag таким образом, чтобы очередной экстремум определялся(формировался) бы только в случае пересечения ценой уровня предыдущего противоположного экстремума.
Т.е., когда цена, например, пересекает вверх уровень предыдущего максимума, формируется минимум, как наименьшее значение цены за период от последнего максимума до момента пересечения ценой его уровня. И наоборот, очередной максимум формируется в момент пересечения ценой вниз уровня последнего минимума.
При этом предусмотреть:
возможность указания минимального расстояния между соседними максимумом и минимумом в пунктах, и
возможность выбора входящего ряда из Close и High/Low

2016-02-26_.png

Re: ZigZag - индикатор

Добавлено: 23 мар 2016, 07:51
Геннадий
Не проще ли в самом индикаторе увеличить значение Delta? Тогда индикатор буде показывать более значимые уровни.

Re: ZigZag - индикатор

Добавлено: 23 мар 2016, 10:19
Pisces
То, что предложил я и то, что предложили Вы, лежит в разных плоскостях.

Re: ZigZag - индикатор

Добавлено: 24 мар 2016, 22:56
Gerig
Pisces писал(а):То, что предложил я и то, что предложили Вы, лежит в разных плоскостях.


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

Re: ZigZag - индикатор

Добавлено: 25 мар 2016, 11:16
Gerig
Вот готов индикатор. Посмотрите его.

Код: Выделить всё

function Initialize()
{
IndicatorName = "ZigZag_N";   
PriceStudy = true;
AddInput("Input", Inputs.Candle);   
AddSeries("ZZWL", DrawAs.Line, Color.Blue);
AddSeries("Lh_Ll", DrawAs.Custom, Color.Magenta, true, Axes.Parent);   
AddSeries("Peak", DrawAs.Custom, Color.Green);   
AddSeries("Trough", DrawAs.Custom, Color.Orange);
AddSeries("Marker", DrawAs.Custom, Color.Red);   

AddParameter("Delta", 0.2);

AddGlobalVariable("peakbar", Types.Int,  0);   
AddGlobalVariable("troughbar", Types.Int,  0);   
AddGlobalVariable("Direction", Types.Int,  0);   
AddGlobalVariable("hi", Types.Double,  0);   
AddGlobalVariable("lo", Types.Double,  0);   
AddGlobalVariable("hibar", Types.Int,  0);   
AddGlobalVariable("lobar", Types.Int,  0);   
}

function Evaluate()
{
// AlfaDirect 2015. OX
// ZZ (ZigZag)
// Новый минимум, если Close бара вырос от текущего Low на % и при этом
// локальный максимум выше пика Peak
// Новый максимум, если Close бара снизился от текущего High на % и при этом
// локальный минумум меньше впадины Trough
  if (CurrentIndex < 2)
  {
         lo = Input.Low[0];    //Впервые присваиваемые значения для локального минимума
         hi = Input.High[0];   //Впервые присваиваемые значения для локального максимума
  }
  else
  {
      double delta = 0.01*Delta;
      //Определяем локальный минимум lo и локальный максимум hi
           if(Input.High[0] > hi)   
          {
               hi = Input.High[0];
               hibar = CurrentIndex;
           }
         if(Input.Low[0] < lo)
         {
               lo = Input.Low[0];
               lobar = CurrentIndex;
         }
             if((Input.Low[0] < Trough)||( Input.High[0] > Peak))
             {             
            if(Direction >= 0)
            {
                     if(Input.Low[0] > (1 + delta)*lo)
               {
                  Direction = -1;   
                  // Trigger = 1;
                  hi = Input.High[0];
                  hibar = CurrentIndex;
                         troughbar = lobar;
                         ZZWL[lobar-CurrentIndex] = lo;
                  Marker[lobar-CurrentIndex] = lo;           
               }
              
                 }
                   if(Direction <= 0)
             {
               if(Input.High[0] < (1 - delta)*hi)
               {
                  Direction = 1;
                  //Trigger = -1;
                  lo = Input.Low[0];
                  lobar = CurrentIndex;
                          peakbar = hibar;
                         ZZWL[hibar-CurrentIndex] = hi;
                         Marker[hibar-CurrentIndex] = hi; 
               }
         
                  }
             }
            Peak=Input.High[peakbar-CurrentIndex];
            Trough=Input.Low[troughbar-CurrentIndex];
 
               Marker.DrawCircle();
            Peak.DrawDash();
            Trough.DrawDash();
        // Последнее плечо (не зафиксированно)
        // отображается пунктирной линией
         if (CurrentIndex == MaxIndex)
          {
                      if (troughbar > peakbar)
                       {
                         Lh_Ll[troughbar-CurrentIndex]=ZZWL[troughbar-CurrentIndex];
                         Lh_Ll[hibar-CurrentIndex] = hi;
                       }
                      if (troughbar < peakbar)
                       {
                         Lh_Ll[peakbar-CurrentIndex]=ZZWL[peakbar-CurrentIndex];
                         Lh_Ll[lobar-CurrentIndex] = lo;
                       }
                       
                   }
                   Lh_Ll.DrawLine(Color.Magenta, Line.Dot, 2);   
          }
    }


Re: ZigZag - индикатор

Добавлено: 27 мар 2016, 15:14
Pisces
Я не увидел отличий в отрисовке линии индикатора с этим кодом. А сами смотрели?

Re: ZigZag - индикатор

Добавлено: 27 мар 2016, 22:11
Gerig
Pisces писал(а):Я не увидел отличий в отрисовке линии индикатора с этим кодом. А сами смотрели?

Верно. Мое упущение. Простое решение - if((Input.Low[0] < Trough)||( Input.High[0] > Peak)) не будет работать, поскольку впадина или пик уже будут сформированы вновь и это условие будет выполняться всегда. Надо в условие включать сравнение и предыдущих впадин и пиков. Другими словами пик может формироваться, если последняя впадина ниже предыдущей. Соответственно впадина может быть сформирована, если последний пик выше предыдущего. Переделаю.

Re: ZigZag - индикатор

Добавлено: 28 мар 2016, 12:03
Gerig
Нужно добавить условия, поскольку возникает ситуация, при которой дальнейший расчет индикатора станет не возможным. См. рисунок. Какие ваши мысли?

Re: ZigZag - индикатор

Добавлено: 28 мар 2016, 12:23
Gerig
Согласно вашим условиям индикатор будет рассчитываться, только если имеет место расходящийся ZigZag. Надо доработать условия его формирования.