Пользовательские индикаторы > ZigZag - индикатор

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Gerig
Сообщения: 52
Зарегистрирован: 24 фев 2016, 16:06
Откуда: Москва

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

Непрочитанное сообщение Gerig » 03 мар 2016, 08:20

Еще одна реализация индикатора 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);
  }
}

Pisces
Сообщения: 28
Зарегистрирован: 09 мар 2016, 16:54

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

Непрочитанное сообщение Pisces » 22 мар 2016, 22:07

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

2016-02-26_.png

Геннадий
Сообщения: 29
Зарегистрирован: 06 мар 2016, 02:11
Поблагодарили: 2 раза

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

Непрочитанное сообщение Геннадий » 23 мар 2016, 07:51

Не проще ли в самом индикаторе увеличить значение Delta? Тогда индикатор буде показывать более значимые уровни.

Pisces
Сообщения: 28
Зарегистрирован: 09 мар 2016, 16:54

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

Непрочитанное сообщение Pisces » 23 мар 2016, 10:19

То, что предложил я и то, что предложили Вы, лежит в разных плоскостях.

Gerig
Сообщения: 52
Зарегистрирован: 24 фев 2016, 16:06
Откуда: Москва

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

Непрочитанное сообщение Gerig » 24 мар 2016, 22:56

Pisces писал(а):То, что предложил я и то, что предложили Вы, лежит в разных плоскостях.


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

Gerig
Сообщения: 52
Зарегистрирован: 24 фев 2016, 16:06
Откуда: Москва

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

Непрочитанное сообщение Gerig » 25 мар 2016, 11:16

Вот готов индикатор. Посмотрите его.

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

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);   
          }
    }


Pisces
Сообщения: 28
Зарегистрирован: 09 мар 2016, 16:54

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

Непрочитанное сообщение Pisces » 27 мар 2016, 15:14

Я не увидел отличий в отрисовке линии индикатора с этим кодом. А сами смотрели?

Gerig
Сообщения: 52
Зарегистрирован: 24 фев 2016, 16:06
Откуда: Москва

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

Непрочитанное сообщение Gerig » 27 мар 2016, 22:11

Pisces писал(а):Я не увидел отличий в отрисовке линии индикатора с этим кодом. А сами смотрели?

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

Gerig
Сообщения: 52
Зарегистрирован: 24 фев 2016, 16:06
Откуда: Москва

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

Непрочитанное сообщение Gerig » 28 мар 2016, 12:03

Нужно добавить условия, поскольку возникает ситуация, при которой дальнейший расчет индикатора станет не возможным. См. рисунок. Какие ваши мысли?
Вложения
IMG_0158 (1) - с эффектами.PNG

Gerig
Сообщения: 52
Зарегистрирован: 24 фев 2016, 16:06
Откуда: Москва

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

Непрочитанное сообщение Gerig » 28 мар 2016, 12:23

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


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 9 гостей