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

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

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

Непрочитанное сообщение Gerig » 30 мар 2016, 15:26

Мне кажется вы не различаете разницы между локальным экстремумом (локальный максимум или локальный минимум) и пиком/впадиной.

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

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

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

Да, возможно.
Вы можете написать индикатор, чтобы его линия была как на исправленной мною картинке?

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

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

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

Конечно, но давайте определимся с условиями отрисовки индикатора. Что такое пик - это такой high свечи в окружении которого как до него, так и после имеются другие high свечи меньшие на параметр delta. Соответсвенно впадина - это такой low свечи в окружении которого имеются другие свечи с low большим на значение параметр delta. Локальный максимум - это просто high свечи от текущей впадины. Локальный минимум - это low свечи от последнего пика.
Последний раз редактировалось Gerig 30 мар 2016, 17:31, всего редактировалось 1 раз.

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

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

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

Тогда надо сначала определится с понятием delta. Для меня delta - это минимальное расстояние между экстремумами, позволяющее формировать впадины и пики самой линии ZigZagа.

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

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

Непрочитанное сообщение Gerig » 30 мар 2016, 17:34

Pisces писал(а):Тогда надо сначала определится с понятием delta. Для меня delta - это минимальное расстояние между экстремумами, позволяющее формировать впадины и пики самой линии ZigZagа.

Нет. По условиям индикатора, delta - это параметр индикатора определенный в процентах. Например, если delta 2%, то это означает, что пиком будет считаться такой high свечи в окружении которого (как до него так и после) имеются другие high на 2% меньшие от этого high.

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

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

Непрочитанное сообщение Pisces » 30 мар 2016, 18:05

Хорошо, пусть так.

Но тот пик, про который на картинке указано, что он не может быть расчитан формируется не по вудеф, а по неоднократно изложенному правилу:
когда цена, например, пересекает вверх уровень предыдущего максимума, формируется минимум, как наименьшее значение цены за период от последнего максимума до момента пересечения ценой его уровня. И наоборот, очередной максимум формируется в момент пересечения ценой вниз уровня последнего минимума.

А какой из экстремумов выше или ниже - это уже формализация идеи индикатора. Тут я не спец...
Вам идея индикатора понятна?

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

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

Непрочитанное сообщение Gerig » 31 мар 2016, 07:57

Pisces писал(а):Хорошо, пусть так.

Но тот пик, про который на картинке указано, что он не может быть расчитан формируется не по вудеф, а по неоднократно изложенному правилу:
когда цена, например, пересекает вверх уровень предыдущего максимума, формируется минимум, как наименьшее значение цены за период от последнего максимума до момента пересечения ценой его уровня. И наоборот, очередной максимум формируется в момент пересечения ценой вниз уровня последнего минимума.

А какой из экстремумов выше или ниже - это уже формализация идеи индикатора. Тут я не спец...
Вам идея индикатора понятна?

Да уж. Если вы согласны с механизмом формирования пиков и впадин в ZigZag (предполагаю это исходя из фразы "Хорошо, пусть так."), то ваши "неоднократно изложенные правила" не работают, и я также неоднократно хочу вам напомнить, что их нужно дополнять. Могу вам направить описание формирования индикатора ZigZag, это поможет вам разобраться с терминами и мы будем говорить на "одном языке". Можно связаться по Skype и обсудить эти же вопросы, если вам так будет удобнее. Ну а если допустить, что вы не придаете этому большое значение, и хотите пиком считать локальный максимум в случае пересечения его предыдущего пика, при этом впадиной считать локальный минимум, возникший после такого "пика", то простите, но это не ZigZag (хотя внешне его напоминающий). Этот индикатор будет перерисовываться и менять количество "пиков" и "впадин" на одном и том же временном отрезке, каждый раз когда в условиях сильной волатильности свеча будет пробивать и вврех и вниз такие "пики" и "впадины". Практического применения такого индикатора я не вижу. Изначально ваша идея мне понравилась, поскольку такой подход можно использовать как индикатор четвертой волны по Эллиотту, сравнивая количество пиков сформированных классическим ZigZag и вашим. Там, где возникнут расхождения в количестве пиков и/или впадин, с большой вероятностью будет как раз четвертой волной.

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

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

Непрочитанное сообщение Pisces » 31 мар 2016, 16:13

Давайте рассмотрим новые формулировки идеи индикатора, пусть он и не ZigZag,

определяем каким-то способом на графике самый левый, например, max;
по условию выполнения Delta(D) находим первый левый min (т.е. цена от минимального Low поднялась на D);
IF
Если после формирования минимума (по D), цена не выходя за пределы диапазона этих max и min (между зелёными линиями) и далее формирует экстремумы по D, то они игнорируются (или отриовываются идикативно, в линию индикатора не входят);
ELSE
Из диапазона можно выйти либо вверх, либо вниз.
Если вверх - то первый левый min становится нижней границей нового диапазона (красная линия), а его верхом - первый max по D (красная линия);
Если вниз - в момент пересечения ценой уровня этого min формируется новый max, как наивысшая цена на интервале от этого min и до момента пересечения, который становится верхней границей нового диапазона, а нижней - первый min, сформированный по D...

Мой Skype hotpisces

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

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

Непрочитанное сообщение Pisces » 31 мар 2016, 16:13

Screenshot_2.png

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

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

Непрочитанное сообщение Gerig » 11 апр 2016, 12:50

Хочу представить уважаемым форумчанам некоторые результаты исследований на тему вариаций ZigZag (моей любимой темы, поскольку занимаюсь волновым анализом). Мотивом таких исследований явилось желание сделать индикатор четвертой волны по Эллиотту. Идеи его создания навеял мне изложенный выше пост. Ниже указаны условия при которых формируется это новый ZigZag.
Формирование пика происходит, при выполнении следующих условий:
1. Если имеется такой high свечи в окружении которого, как до него, так и после имеются другие high свечи меньшие на параметр Delta (задается в процентах);
2. Последняя впадина меньше, чем предыдущая.
3. Если второе условие не выполняется, то пик не формируется до тех пор, пока high свечи не будет выше последнего сформированного ранее пика;
Формирование впадины происходит аналогичным образом, при выполнении следующих условий:
1. Если имеется такой low свечи в окружении которого имеются другие свечи с low большим на значение параметр delta(задается в процентах);
2. Последний пик больше, чем предыдущий.
3. Если второе условие не выполняется, то впадина не формируется до тех пор, пока low свечи не будет меньше последней сформированной ранее впадины;
Я полагал, что если таким образом сформированный ZigZag (далее ZigZag_N) наложить, на ZigZag, сформированный по классическому алгоритму, то там, где нет направленного движения цены, а это как правило, четвертая волна (ее можно увидеть по характерному флэту) ZigZag_N не будет формировать пики и впадины, в то время как ZigZag будет отрисовывать флэт.
Изначально мне показалось, что автор идеи, пользователь с ником Pisces, имеет то же представление, что и я. И даже позавидовал его проницательности. Правда потом выяснилось, что автор идеи имел совсем другое в виду и считал, что дельта это разница между пиком и впадиной. Но оставим это в стороне.
Итак, первый прототип индикатора ZigZag_N готов, спасибо огромное Евгению (ник evge), что помог разобраться с механизмом накопления значений по предыдущим пикам и впадинам.

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

function Initialize()
{
IndicatorName = "ZigZag_N";   
PriceStudy = true;
AddInput("Input", Inputs.Candle);   
AddSeries("ZZWL", DrawAs.Custom, Color.Blue, true, Axes.Parent); //отображение локального ZigZag
AddSeries("ZZG", DrawAs.Custom, Color.Blue, true, Axes.Parent); //отображение глобального ZigZag
AddSeries("Lh_Ll", DrawAs.Custom, Color.Magenta, true, Axes.Parent);    //отображение последнего плеча
AddSeries("Peak", DrawAs.Custom, Color.Green);   //текуший пик
AddSeries("Trough", DrawAs.Custom, Color.Orange); //текущая впадина
AddSeries("Peak1", DrawAs.Custom, Color.Gray);    //предыдущий пик
AddSeries("Trough1", DrawAs.Custom, Color.Red); //предыдущая впадина
AddSeries("Marker", DrawAs.Custom, Color.Red);   
AddParameter("Delta", 0.2);  //параметр ZigZag задается в процентах
AddGlobalVariable("peakbar", Types.Int,  0);   
AddGlobalVariable("troughbar", Types.Int,  0);   
AddGlobalVariable("Direction", Types.Int,  0);   //направление локального ZigZag
AddGlobalVariable("DirG", Types.Int,  0);   //направление глобального ZigZag
AddGlobalVariable("hi", Types.Double,  0);   
AddGlobalVariable("lo", Types.Double,  0);   
AddGlobalVariable("hibar", Types.Int,  0);   
AddGlobalVariable("lobar", Types.Int,  0);   
AddGlobalVariable("exPkbar", Types.IntList); //процедура записи последних пиков
AddGlobalVariable("exTghbar", Types.IntList); //процедура записи последних впадин
AddGlobalVariable("hiG", Types.Double,  0);   
AddGlobalVariable("loG", Types.Double,  0);   
AddGlobalVariable("hibarG", Types.Int,  0);   
AddGlobalVariable("lobarG", Types.Int,  0);   
AddGlobalVariable("peakbarG", Types.Int,  0);   
AddGlobalVariable("troughbarG", Types.Int,  0);   
}

function Evaluate()
{
// Alfadirect4.ru Gerig
// ZigZag
// Новый минимум, если Close бара вырос от текущего Low на % и при этом
// последний Peak выше предыдущего Peak1
// Новый максимум, если Close бара снизился от текущего High на % и при этом
// последняя впадина Trough меньше предыдущей впадины Trough1
  if (CurrentIndex < 2)
  {
   lo = Input.Low[0];    //Впервые присваиваемые значения для локального минимума
   hi = Input.High[0];   //Впервые присваиваемые значения для локального максимума
    loG = Input.Low[0];    //Впервые присваиваемые значения для глобального минимума
   hiG = 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(Direction >= 0)
        {
               if((Input.Low[0] > (1 + delta)*lo))
                {
               Direction = -1; //нашли впадину локального ZigZag
               hi = Input.High[0]; //локальный максимум
               hibar = CurrentIndex; //номер бара локального максимума
                    troughbar = lobar; //номер бара впадины       
                    exTghbar.Add(troughbar); //добавляем номер бара впадины в перечень
                    if ( exTghbar.Count > 2 ) //записываем номера баров последних впадин.
                    exTghbar.RemoveAt(0);
                    ZZWL[lobar-CurrentIndex] = lo;
               Marker[lobar-CurrentIndex] = lo;           
            } 
           }
        if(Direction <= 0)   
        {
         if(Input.High[0] <(1 - delta)*hi)
           {
              Direction = 1; // нашли пик локального ZigZag
              lo = Input.Low[0]; //локальный минимум
               lobar = CurrentIndex; //мер бара локального минимума
                   peakbar = hibar; //номер бара пика
                   exPkbar.Add(peakbar); //добавляем номер пика в перечень
                   if (exPkbar.Count > 2 ) //записываем номера баров последних пиков.
                   exPkbar.RemoveAt(0);
                   ZZWL[hibar-CurrentIndex] = hi;
                   Marker[hibar-CurrentIndex] = hi;
          }   
         }
         Trough = Input.Low[troughbar-CurrentIndex]; //впадина 
         Peak = Input.High[peakbar-CurrentIndex]; //пик
         if (exTghbar.Count > 1)
         {
         Trough1 = Input.Low[exTghbar[0]-CurrentIndex]; //предыдущая впадина локального ZigZag
         }
         if(exPkbar.Count > 1)
         {
         Peak1 = Input.High[exPkbar[0]-CurrentIndex]; //предыдущий пик локального ZigZag
         //ShowMessage(peakbar-CurrentIndex);  //Для отладки использовали
         }
            Marker.DrawCircle();
         Peak.DrawDash();
         Trough.DrawDash();
         Peak1.DrawDash();
         Trough1.DrawDash();
         ZZWL.DrawLine(Color.Blue, Line.Dot, 2); //отрисовка локального ZigZag цвета Blue
         //Задаем значения глобальному минимуму loG и глобального максимуму hiG
         if(Input.High[0] > hiG)   
         {
         hiG = Input.High[0];
         hibarG = CurrentIndex;
         }
         if(Input.Low[0] < loG)
         {
         loG = Input.Low[0];
         lobarG = CurrentIndex;
         }             
         if(DirG >= 0)
         {
               if((Input.Low[0] > (1 + delta)*loG))
                {
                   if ((Peak>Peak1)||((Peak<Peak1)&&(Input.Low[0]<Trough)))
                   {
               DirG = -1; //нашли впадину глобального ZigZag
               hiG = Input.High[0]; //глобального максимум
               hibarG = CurrentIndex; //номер бара глобального максимума
                    troughbarG = lobarG; //номер бара впадины       
                    ZZG[lobarG-CurrentIndex] = loG;
             //  Marker[lobarG-CurrentIndex] = loG;
                   }         
            } 
           }
        if(DirG <= 0)   
        {
         if(Input.High[0] <(1 - delta)*hiG)
           {
                  if((Trough1>Trough)||((Trough1<Trough)&&(Input.High[0]>Peak)))
                  {
              DirG = 1; // нашли пик глобального ZigZag
              loG = Input.Low[0]; //глобального минимум
               lobarG = CurrentIndex; //мер бара глобального минимума
                   peakbarG = hibar; //номер бара пика
                   ZZG[hibarG-CurrentIndex] = hiG;
                //   Marker[hibarG-CurrentIndex] = hiG;
                 }
          }   
         }
         ZZG.DrawLine(Color.Blue, Line.Solid, 3); //отрисовка глобального ZigZag цвета Blue
         // Последнее плечо, где отображаются локальные экстремумы (не зафиксированно)
         // отображается пунктирной линией цвета Magenta
         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);   
    }
}



Что же можно увидеть? Есть некоторая неточность в отображении некоторых пиков и впадин ZigZag_N, связанная с тем, что если в условиях большой волатильности будет сформирован пик или впадина в ZigZag, то ZigZag_N ее не будет считать, а рассчитает новую рядом стоящую свечу. Я хотел было усовершенствовать алгоритм и предусмотреть правило пересчета вершин в таких случаях, но решил на график вывести еще один ZigZag, но с другой величиной Delta. Я был очень удивлен, но ZigZag c параметром delta увеличенным в 2,5 раза практически совпадает с ZigZag_N.

Получается, что мое предположение об отображении четвертой волны таким способом полностью ошибочно. И действительно был прав пользователь с ником Геннадий, предложивший просто увеличить параметр delta.
Вложения
Скриншот 2016-04-11 12.26.38.png


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей