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

 

Здравствуйте,

Я пытаюсь разработать эксперта, который копает исторические данные (вершины и низы), чтобы использовать их для моего основного эксперта. Я решил использовать индикатор zigzag, так как он прост и легко находит максимумы/минимумы.

Моя проблема в том, что когда я вызываю ZigZag.ex4 с помощью функции iCustom(), я не могу получить правильные значения high и low. Чтобы избежать перерисовки, я использовал индекс 20 индикатора iCustom() в качестве базовой защиты от перерисовки.

В коде ZigZag есть два буфера (использую версию метакотировок https://www.mql5.com/en/code/7796 ). Я мог бы взять значения high и low наоборот, но в данный момент это не имеет большого значения.

Некоторые значения совпадают с кодом, некоторые нет, а в журнале я вижу и высокие и низкие значения в одном столбце, что невозможно.

Зигзаг

Мой код приведен ниже:

//+------------------------------------------------------------------+
//|                                                 ZigZagDigger_02  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
/* 

*/

#include <stderror.mqh>
#include <stdlib.mqh>
    
int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

int init()
  {
   ArrayInitialize(Zig_high,0);
   ArrayInitialize(Zig_low,0);
   return(0);
 } 
   
int deinit()
{ 
   return(0);
}

void start()
  {
  
   static datetime tmp;
  

   //  On every tick
   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop
         
   
  }

Интересно, я неправильно использую индикатор zig zag или я допустил ошибку в коде? Я не смог найти проблему, поэтому прошу вашей помощи, чтобы определить мою проблему.

Спасибо

 
aed71:

Здравствуйте,

Я пытаюсь разработать эксперт, который копает исторические данные (вершины и низы), чтобы использовать их для моего основного эксперта. Я решил использовать индикатор zigzag, так как он прост и легко находит максимумы/минимумы.

Моя проблема в том, что когда я вызываю ZigZag.ex4 с помощью функции iCustom(), я не могу получить правильные значения high и low. Чтобы избежать перерисовки, я использовал индекс 20 индикатора iCustom() в качестве базовой защиты от перерисовки.

В коде ZigZag есть два буфера (использую версию метакотировок https://www.mql5.com/en/code/7796 ). Я мог бы взять значения high и low наоборот, но в данный момент это не имеет большого значения.

Некоторые значения совпадают с кодом, некоторые нет, а в журнале я вижу и высокие и низкие значения в одном столбце, что невозможно.

Мой код приведен ниже:

Интересно, я неправильно использую индикатор zig zag или я допустил ошибку в коде? Я не смог найти проблему, поэтому прошу вашей помощи, чтобы определить мою проблему.

Спасибо

Можете ли вы сказать, читая код MACD Sample, как работает этот советник?

Мне кажется, вы никогда не пробовали ....

То, что вы написали, похоже на то, что я делаю что-то ..... не знаю, что происходит Можете ли вы сказать мне, что я сделал?

Каждый тиковый цикл Что такое ваш каждый тиковый цикл?

Это?

   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop

Да, тогда где цикл?

нет, тогда объясните построчно, что означает ваш код...

 
aed71: Интересно, я неправильно использую индикатор zig zag или я допустил ошибку в коде?
  1. Если бы вы поискали на форуме, то нашли бы ответ.
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZag не заполняет каждый элемент буфера (он использует DRAW_SECTION.) Делайте вызов в цикле, пока не найдете сдвиг, который имеет ненулевое значение.
 
WHRoeder:
  1. Если бы вы поискали на форуме, то нашли бы ответ.
  2. ZigZag не заполняет каждый элемент буфера (он использует DRAW_SECTION.) Делайте вызов в цикле, пока не найдете сдвиг, который имеет ненулевое значение.


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

Почему он одновременно возвращает высокие и низкие значения, как я понял на картинке (часть журнала с отметкой ???) И эти значения не соответствуют ни высоким, ни низким... Это моя главная проблема...

Спасибо

 
deVries:

Можете ли вы сказать, читая код MACD Sample, как работает этот советник?

Мне кажется, вы никогда не пробовали ....

то, что вы написали, похоже на то, что я делаю что-то ..... не знаю, что происходит Можете ли вы сказать мне, что я сделал?

Каждый тиковый цикл Что такое ваш каждый тиковый цикл?

Это?

Да, тогда где цикл?

Нет, тогда объясните построчно, что означает ваш код...

Я не думаю, что у меня есть вопрос о цикле, цикл работает и печатает результаты. он проверяет таймфрейм (15M в моем случае) и вычисляет значения зигзага и печатает. Пожалуйста, проверьте зеленый прямоугольник, как он работает каждые 15 минут. Функция Start() сама является циклом, не так ли?

Каждые 15 месяцев

 
aed71:

Я не думаю, что у меня есть проблема с циклом, цикл работает и печатает результаты. он проверяет таймфрейм (15M в моем случае) и вычисляет значения зигзага и печатает. Пожалуйста, проверьте зеленый прямоугольник, как он работает каждые 15 минут. Функция Start() сама по себе является циклом, не так ли?



Вы правы, что функция Start() сама по себе является циклом.

но где начинается этот цикл и где заканчивается функция Start()?

Это где-то в другом месте ...

Сообщения, которые вы напечатали, не повторяются каждый тик .....

Так что же вы делаете ......??

Попытайтесь объяснить строки вашего кода ..... как можно подробнее.

 
deVries:


Вы правы, что функция Start() сама по себе является циклом

но где начинается этот цикл и где заканчивается функция Start()?

это где-то в другом месте ...

Сообщения, которые вы напечатали, не повторяются каждый тик .....

Так что же вы делаете ......??

Попытайтесь объяснить строки вашего кода ..... как можно подробнее.


Приношу свои извинения, если не смог объяснить правильно.

Этот эксперт будет использоваться для бэктеста, и моя цель - найти исторические максимумы и минимумы на графике 15M. Затем я буду обрабатывать данные максимумов и минимумов для расчета фазы и амплитуды графика.

Я сделал так: я использовал два массива для хранения значений максимума и минимума и один счетчик для подсчета тиков. Размер массива 1000 более чем достаточно, так как я запускаю его максимум на 2 дня (1440/15=96 тиков в день).

int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

В функции init() я заполняю массивы нулями.

В функции start() я проверяю, сработал ли новый тик, с помощью следующего кода

 if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];

   // the code here runs every 15M.

   }

Таким образом, функция start() имеет непрерывный цикл, пока не завершится бэктест (2 дня).

Моя основная проблема заключается в вызове ZigZag. Ниже я вызываю индикатор зигзаг. Обычно, если есть максимум или минимум, он должен возвращать ненулевое значение. Но в моем случае он иногда возвращает и low и high с одинаковым значением, что невозможно.


  double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

  Zig_high[cnt]=zh;
  Zig_low[cnt]=zl;
  cnt=cnt+1;

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

//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

Спасибо

 

Уделите немного времени чтению и обучению

Это также может немного помочь вам

Подробное объяснение iCustom

 
Я также прилагаю свой код...
Файлы:
 
Что отображает окно данных?
 
deVries:
Что отображает окно данных?

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

1-й

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

2-й2-й

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

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

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