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

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

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

Добавлено: Gerig » 26 фев 2016, 23:21

Тема: ZigZag - индикатор

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

Индикатор ZigZag относится к ряду трендовых и изображается на графиках в виде отрезков, соединяющих локальные экстремумы цены, именуемые пиками (Peak) и впадинами (Trough). Благодаря этому удается рассматривать важные рыночные движения, не принимая во внимание шумы. Параметр в этом индикатора один - Delta. Этот параметр определяет расчет пиков и впадин. Другими словами пиком считается тот high свечи в окружении которого, как перед так и после ней, имеются другие high свечей меньшие на значение Delta (в процентах). Расчет для впадины обратный. Выбирается такой low свечи, в окружении которого есть low, большие на значение Delta (в процентах). Особенность этого индикатора в том, то он не "заглядывает в будущее" (отсутствует явление "peeking").

2016-02-26.png

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

Текст индикатора:

function Initialize()
{
IndicatorName = "ZigZag";   
PriceStudy = true;
AddInput("Input", Inputs.Candle);   
AddSeries("ZZWL", DrawAs.Line, Color.Blue);   
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 на %
// Новый максимум, если 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.Low[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.High[0] < (1 - delta)*hi)
               {
                  Direction = 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)
             {
             ZZWL[hibar-CurrentIndex] = hi;
           
             }
         if (troughbar < peakbar)
             {
              ZZWL[lobar-CurrentIndex] = lo;
             }
         }
    }
}