Каталог файлов форума

Список вложений в сообщениях, оставленных на этой конференции.

Все файлы форума: 1233

Добавлено: evge » 07 фев 2016, 17:01

Тема: ZZ (ZigZag) – зигзаг

Текст сообщения:

Зигзаг – показывает локальные экстремумы цены, полученные по high и low, которые формируются при отклонении цены (close) от них на заданную величину, заданную в процентах. Последнее плечо индикатора перестраивается и соединяется с текущим максимальным или минимальным значением цены. Данный индикатор используется для наглядного представления направленного движения цены на истории.
Параметр «Delta» индикатора определяет величину движения цены (в процентах) в противоположную сторону для формирования экстремума.

Пример:

ZZ-00.png
ZZ-00.png (25.98 КБ) 38766 просмотров


Исходный текст:

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

function Initialize()
{
IndicatorName = "ZZ";   
PriceStudy = true;
AddInput("Input", Inputs.Candle);   
AddSeries("ZZWL", DrawAs.Line, Color.Blue);   
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 на %
// Новый максимум, если Close бара снизился от текущего 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(Direction >= 0)
         {
           if(Input.Close[0] > (1 + delta)*lo)
               {
                  Direction = -1;                  
                  hi = Input.High[0];
                  hibar = CurrentIndex;
              troughbar = lobar;
              ZZWL[lobar-CurrentIndex] = lo;
                  Marker[lobar-CurrentIndex] = lo;
               }
         }
         if(Direction <= 0)
         {
               if(Input.Close[0] < (1 - delta)*hi)
               {
                  Direction = 1;                  
                  lo = Input.Low[0];
                  lobar = CurrentIndex;
              peakbar = hibar;
              ZZWL[hibar-CurrentIndex] = hi;
              Marker[hibar-CurrentIndex] = hi;
               }
         }
         Marker.DrawCircle();
       // Последнее плечо (не зафиксированно)
         if (CurrentIndex == MaxIndex)
         {
                 if (troughbar > peakbar)
                  ZZWL[hibar-CurrentIndex] = hi;

               if (troughbar < peakbar)
                ZZWL[lobar-CurrentIndex] = lo;
         }
  }
}