Страница 1 из 3

ZZ (ZigZag) – зигзаг

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

Пример:

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


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

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

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

Re: ZZ (ZigZag) – зигзаг

Добавлено: 08 фев 2016, 19:11
Сайбер
Добрый день!

Подскажите пжл, возможно ли в АД4 написать индикатор ZigZag как в МТ 4, 5 . То есть вместо Delta в свойствах индикатора, появились следующие настройки?

Depth 12

Deviation 5

Backstep 3

А то в АД4 уж очень он корявый, спасибо.

Re: ZZ (ZigZag) – зигзаг

Добавлено: 08 фев 2016, 19:26
evge
Сайбер писал(а):Добрый день!
Подскажите пжл, возможно ли в АД4 написать индикатор ZigZag как в МТ 4, 5 .


Я думаю можно. просто надо взять исходник от МТ4, 5 переписать под АД4. Я думал заняться переписыванием индикаторов с МТ4,5. Надо будет на ZigZag попробовать

Re: ZZ (ZigZag) – зигзаг

Добавлено: 09 фев 2016, 14:25
Сайбер
Буду ждать зиг заг,спасибо.

Re: ZZ (ZigZag) – зигзаг

Добавлено: 09 фев 2016, 15:41
evge
Описание из индикатора:

ExtDeviation – это минимальное количество пунктов между максимумами (минимумами) двух соседних свечей для того чтобы индикатор Zigzag сформировал локальную вершину (локальную впадину). Этот параметр выражается в процентах.

ExtDepth – это тот минимум свечей, на котором индикатор Zigzag не будет строить второй максимум (или минимум), если тот меньше (или больше) на ExtDeviation предыдущего соответственно.

ExtBackstep –минимальное число свечей между локальными максимумами, минимумами.

вообщем, Delta это только один из трех этих параметров.

Думаю можно дописать уже существующий код двумя недостающими фильтрами Depth, Deviation...

Займусь этим в ближайшее время.

Re: ZZ (ZigZag) – зигзаг

Добавлено: 09 фев 2016, 20:57
Сайбер
Спасибо Вам огромное, очень жду )))

Re: ZZ (ZigZag) – зигзаг

Добавлено: 09 фев 2016, 21:56
Ипонамама
А вообще не хватает готовых стратегий АД4 на основе готовых индикаторов. Для таких как я, кому Си - темный лес очень трудно без готовых шаблонов делать роботов.

Re: ZZ (ZigZag) – зигзаг

Добавлено: 09 фев 2016, 21:59
evge
Ипонамама писал(а):А вообще не хватает готовых стратегий АД4


Там же есть конструктор. Даже не зная языка можно много чего с помощью него сделать.

Re: ZZ (ZigZag) – зигзаг

Добавлено: 10 фев 2016, 10:52
evge
Т.к. этим индикатором не пользуюсь, проверьте и дайте рекомендации по поведению.

Все параметры влияют на результат, их теперь 3.

Если что-то не так, поправлю, возможно поведение не такое как вам нужно.

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

function Initialize()
{
IndicatorName = "ZZ";   
PriceStudy = true;
AddInput("Input", Inputs.Candle);   
AddSeries("ZZWL", DrawAs.Line, Color.Blue);   
AddSeries("Marker", DrawAs.Custom, Color.Red);   

//Анализируемый период
AddParameter("Period", 800, 1);

// то тот минимум свечей, на котором индикатор не будет строить второй максимум (или минимум), если тот меньше (или больше) на Deviation предыдущего соответственно.
AddParameter("Depth", 12);

// это минимальное количество пунктов между максимумами (минимумами) двух соседних свечей для того чтобы индикатор Zigzag сформировал локальную вершину (локальную впадину). Этот параметр выражается в процентах.
AddParameter("Deviation", 5);

// минимальное число свечей между локальными максимумами, минимумами.
AddParameter("Backstep", 3);

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 на %

// Модификация evge 10.02.2016

if ((MaxIndex - CurrentIndex) > Period) return;

  if (lo == 0)
  {
         lo = Input.Low[0];          //First min candle for Low
         hi = Input.High[0];         //First max candle for High
         hibar = CurrentIndex;
       lobar = CurrentIndex;
  }
  else
  {
      double delta = 0.01*Deviation;
      //Detected Local max and Local min
       if(Input.High[0] > hi && (CurrentIndex - hibar) >= Depth)
        {
               hi = Input.High[0];
               hibar = CurrentIndex;
         }
         if(Input.Low[0] < lo && (CurrentIndex - lobar) >= Depth)
         {
               lo = Input.Low[0];
               lobar = CurrentIndex;
         }

         if(Direction >= 0)
         {
           if(Input.High[0] > (1 + delta)*lo && (CurrentIndex - lobar) >= Backstep)
               {
                     Direction = -1;                 
                     hi = Input.High[0];
                     hibar = CurrentIndex;
                    troughbar = lobar;
                    ZZWL[lobar-CurrentIndex] = lo;
                     Marker[lobar-CurrentIndex] = lo;
               }
         }
         if(Direction <= 0)
         {
               if(Input.Low[0] < (1 - delta)*hi && (CurrentIndex - hibar) >= Backstep)
               {
                     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;
         }
  }
}

Re: ZZ (ZigZag) – зигзаг

Добавлено: 10 фев 2016, 12:10
Сайбер
Добрый день.
У ZZ 2 новых проблемы. 1. Рисуется по мин и макс тела свечи игнорируя их тени. 2 Индикатор не показывает истинные мин и макс, то есть он отмечает хаи и лои которые ниже максимума или выше минимума предыдущей локальной точки.
Из старых проблем, ZZ как и раньше реагирует на каждое минимальное изменение, пробовал настройки менять... ничего не получилось даже близкого к мт не смог подогнать.