Проблема с индикатором ZigZag - страница 2

 
Я забыл выделить значения индикатора, минимальное совпадает, но максимальное не совпадает, как я пытался показать на 2-м графике...
 
aed71:

На графике ниже показано минимальное значение (значение точки курсора, значение окна данных и выходной сигнал одинаковы).

Ниже на 6 тиков позже показан самый высокий максимум графика. Оба окна данных и точки курсора одинаковы, однако вывод не одинаков, и кроме того, он возвращает как низкое, так и высокое значение.

2-й

Я проверил, что iCustom() правильно загружает индикатор. Низкое значение такое же, а вот высокое - нет. Может ли это быть связано с индикатором ZigZag?

Что я делаю не так, я действительно не могу понять.


Я вижу только одно значение, исходящее от вашего индикатора ZigZag

Это значение - что это такое?

 
aed71:

На графике ниже показано минимальное значение (значение точки курсора, значение окна данных и выходной сигнал одинаковы).

Ниже на 6 тиков позже показан самый высокий максимум графика. Оба окна данных и точки курсора одинаковы, однако вывод не одинаков, и кроме того, он возвращает как низкое, так и высокое значение.

2-й

Я проверил, что iCustom() правильно загружает индикатор. Низкое значение такое же, а вот высокое - нет. Может ли это быть связано с индикатором ZigZag?

Что я делаю не так, я действительно не могу понять.

Вы неправильно используете ZigZag в своем примере iCustom. Стандартный ЗигЗаг от MetQuotes имеет ТРИ (не два) буфера (режимы или линейный индекс в iCustom)

  1. Режим = 0: Удерживает как высокие, так и низкие точки зигзага.
  2. Режим = 1: высокие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).
  3. Режим = 2: Низкие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).

Вам нужно будет сравнить первый буфер (Mode 0) с двумя другими буферами, чтобы решить, является ли он точкой High Point или Low Point (например, если значения буферов 1 и 3 одинаковы, то это точка Low ZigZag, а если значения буферов 1 и 2 одинаковы, то это точка High Point).

Также, чтобы лучше понять, как работает ЗигЗаг и как он перерисовывается, я предлагаю поиграть с моим индикатором ZigZagZug. Однако в своем коде используйте ЗигЗаг от MetaQuotes, так как он быстрее. Моя версия выполняет больше обработки из-за дополнительных функций и поэтому работает медленнее.

PS! Если буфер 1 (Mode = 0) имеет значение 0.0, а другие буферы имеют ненулевые значения, то это старые точки перерисовки, а НЕ точки ZigZag.

В вашем коде вы используете буфер Mode 0 как Low, а буфер Mode 1 как High. Это совершенно неверно.

 
FMIC:

Вы неправильно используете ZigZag в своем примере iCustom. Стандартный зигзаг от MetQuotes имеет ТРИ (не два) буфера (режимы или индекс линии в iCustom)

  1. Режим = 0: Удерживает как высокие, так и низкие точки зигзага.
  2. Режим = 1: высокие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).
  3. Режим = 2: Низкие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).

Вам нужно будет сравнить первый буфер (Mode 0) с двумя другими буферами, чтобы решить, является ли он точкой High Point или Low Point (например, если значения буферов 1 и 3 одинаковы, то это точка Low ZigZag, а если значения буферов 1 и 2 одинаковы, то это точка High Point).

Также, чтобы лучше понять, как работает ЗигЗаг и как он перерисовывается, я предлагаю поиграть с моим индикатором ZigZagZug. Однако в своем коде используйте ЗигЗаг от MetaQuotes, так как он быстрее. Моя версия выполняет больше обработки из-за дополнительных функций и поэтому работает медленнее.

PS! Если буфер 1 (Mode = 0) имеет значение 0.0, а другие буферы имеют ненулевые значения, то это старые точки перерисовки, а НЕ точки ZigZag.

В вашем коде вы используете буфер Mode 0 как Low, а буфер Mode 1 как High. Это совершенно неверно.


Смотрите здесь https://www.mql5.com/en/forum/149492/page2#912747 внешние полосы являются проблемой для старого кодированного Zigzag.

Желтая линия дает лучший способ отображения зигзага.

 
deVries:


Посмотрите здесь https://www.mql5.com/en/forum/149492/page2#912747 внешние полосы - это проблема для старого кода Зигзага.

Желтая линия показывает лучший способ отображения зигзага.


Внешние полосы не имеют ничего общего с текущей дилеммой "aed71". Его использование ZigZag просто некорректно.

Пожалуйста, не отклоняйтесь от текущей проблемы, так как вы только запутаете ситуацию.

Кроме того, я также дал ссылку на мой код ZigZagZug, который не имеет этой проблемы.

 
FMIC:

Вы неправильно используете ZigZag в своем примере iCustom. Стандартный зигзаг от MetQuotes имеет ТРИ (не два) буфера (режимы или индекс линии в iCustom)

  1. Режим = 0: Удерживает как высокие, так и низкие точки зигзага.
  2. Режим = 1: высокие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).
  3. Режим = 2: Низкие точки, но не обязательно только точки ZigZag (так как он также удерживает точки перерисовки).

Вам нужно будет сравнить первый буфер (Mode 0) с двумя другими буферами, чтобы решить, является ли он точкой High Point или Low Point (например, если значения буферов 1 и 3 одинаковы, то это точка Low ZigZag, а если значения буферов 1 и 2 одинаковы, то это точка High Point).

Также, чтобы лучше понять, как работает ЗигЗаг и как он перерисовывается, я предлагаю поиграть с моим индикатором ZigZagZug. Однако в своем коде используйте ЗигЗаг от MetaQuotes, так как он быстрее. Моя версия выполняет больше обработки из-за дополнительных функций и поэтому работает медленнее.

PS! Если буфер 1 (Mode = 0) имеет значение 0, а другие буферы имеют значения, то это старые точки перерисовки.


Отлично, спасибо за важные подсказки! Теперь я понял, почему это не работает...

Я думаю, что оригинальный код Metaquotes ZigZag не корректен, так как у него всего 2 буфера. Поэтому я подумал, что один из них должен быть высоким, а другой низким...

На самом деле название тоже не совпадает, я недавно видел. Кто-нибудь должен это проверить!

Я ссылаюсь на код здесь https://www.mql5.com/en/code/7796

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer[shift]=val;
      //--- high
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0; 
              } 
           }
        }
      ExtMapBuffer2[shift]=val;
     }

   // final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         res=ExtMapBuffer2[shift];
         if(res!=0.0) ExtMapBuffer[shift]=res;
        }
     }
  }
 
aed71:


Отлично, спасибо за важные подсказки! Теперь я понял, почему это не работает...

Я думаю, что оригинальный код Metaquotes ZigZag не является правильным, поскольку он имеет только 2 буфера. Поэтому я подумал, что один из них должен быть высоким, а другой низким...

На самом деле название тоже не совпадает, я недавно видел. Кто-нибудь должен это проверить!

Я имею в виду код здесь https://www.mql5.com/en/code/7796.


Не используйте этот код! Это древний код!

Используйте код, который в настоящее время проталкивается через LiveUpdates. Используйте текущую 600+ версию или хотя бы 509 версию.

PS! NB! Также, используйте просто "ZigZag" в имени, а не "ZigZag.ex4" в iCustom.

 
FMIC:


Не используйте этот код! Это древний код!

Используйте код, который в настоящее время распространяется через LiveUpdates. Используйте текущую версию 600+ или хотя бы версию 509.

PS! NB! Также используйте просто "ZigZag" в имени, а не "ZigZag.ex4" в iCustom.


Привет, FMIC,

Спасибо за советы. Я добавлял ex4 в конце файла, чтобы не забыть его скомпилировать. К сожалению, в моей новой сборке 610 ZigZag заменен на старый.

Я решил использовать ваш, так как время для меня не проблема. Я также столкнулся с некоторыми проблемами, и буду благодарен, если вы сможете мне помочь.

Я использовал тот же самый код, указанный выше, только изменил имя файла на вашу версию. Я использую параметры 6,5,3; это единственное отличие от ваших настроек по умолчанию.

Я столкнулся с некоторыми проблемами:

Во-первых, индикатор загружается каждый раз на каждом тике, чтобы считать значения zh,zl. И в конце он сбрасывает все загрузки (чего не видно на картинке), говоря что-то вроде "2014.02.22 09:35:09.171 2013.11.01 22:55 Custom indicator ZigZagZug EURUSD,M15: removed". Пожалуйста, обратитесь к лог-файлу, который я прикрепил. Не вызывает ли это в дальнейшем проблем с памятью?

Во-вторых, в журнале счетчик cnt перескочил с cnt8 на cnt84, что странно. В журнале он не прыгает. Я думаю, что я должен рассматривать журналы как правильные значения.

Третье и самое критическое - это то, что он нашел два минимума, чего не должно быть. На рисунке я хочу получить высокие и низкие значения серых зигзагообразных линий, но когда я записываю все высокие и низкие значения в журнал, они точно такие же, как у вас, с розовыми и голубыми цветовыми точками. Однако мне нужны только значения зигзагообразных линий. Я проверил другие буферы, но они не принесли правильных значений. Есть какие-нибудь предложения? Или я должен использовать классический зигзаг (для билда 610?).

Спасибо.

ZigZagZug

 
aed71:


Привет FMIC,

Спасибо за советы. Я добавлял ex4 в конец файла, чтобы не забыть его скомпилировать. К сожалению, в моей новой сборке 610 ZigZag заменен на старый.

Я решил использовать ваш, так как время для меня не проблема. Я также столкнулся с некоторыми проблемами, и буду благодарен, если вы сможете мне помочь.

Я использовал тот же самый код, указанный выше, только изменил имя файла на вашу версию. Я использую параметры 6,5,3; это единственное отличие от ваших настроек по умолчанию.

Есть какие-нибудь предложения? Или я должен использовать классический зигзаг (для билда 610?).

Спасибо.

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

Мой индикатор ZigZagZug использует дополнительные параметры и в другом порядке и типе, поэтому вы не можете просто использовать аналогичный iCustom, который вы используете сейчас. Он полностью отличается.

Также я использую 7 буферов в индикаторе для дополнительных возможностей. Он должен использоваться в качестве наглядного учебного пособия для понимания ZigZag, а не для использования в советнике.

PS! Это нормально, когда индикатор загружается и выгружается несколько раз во время тестирования советника с помощью iCustom. Все зависит от того, как закодирован советник и индикатор. Чтобы предотвратить это и сделать советника быстрее, я обычно перекодирую только основной код в самом советнике, чтобы не зависеть от внешних индикаторов, но это уже другой вопрос, не имеющий прямого отношения к вашему случаю. Просто совет для ваших будущих советников.

 
aed71:


Hi FMIC,

... Я хочу получить высокие и низкие значения серых зигзагообразных линий, но когда я записываю все высокие и низкие значения в журнал, они в точности совпадают с вашими розовыми и голубыми цветными точками. Однако мне нужны только значения зигзагообразных линий. ...

Спасибо.


Как уже объяснялось в предыдущем сообщении, вы не можете просто использовать буфер High и Low для получения точек ZigZag, поскольку они также включают перекрашенные точки (аква и пурпурные круги на ZigZagZug). На стандартном ZigZag это тоже так, но вы их просто не видите. Поэтому мой индикатор показывает их, чтобы вы могли лучше понять его.

Вы должны сравнить буферы High и Low с первым буфером, который содержит BOTH Low и Highs, чтобы отфильтровать ТОЛЬКО точки ZigZag.

NB! Вам нужно сравнить первый буфер (Mode 0) с двумя другими буферами, чтобы решить, является ли он точкой High или Low (например, если оба буфера 1 и буфер 3 имеют одинаковое значение, то это точка Low ZigZag, а если оба буфера 1 и буфер 2 имеют одинаковое значение, то это точка High).

Если хотите, прикрепите свой файл к сообщению, и я подкорректирую его, чтобы вы могли увидеть, как правильно его использовать (прикрепите его, не используйте SRC, чтобы не было длинного сообщения).

Причина обращения: