Алгоритм сбора последних непустых значений зиг-зага

 

Я написал алгоритм сбора последних непустых вершин зиг-зага.

Вот он:

    int cnt = 0;    // Индекс буфера последних N-эффективных экстремумов Zig-Zag'a
    for (int i = 0; i <= Bars; i++) {
      if (cnt == i_extremumCountToCollect) break;
      double ZZPrice = iCustom(NULL, 0, "ZZ_mtf", i_ZZTF, 0, i);
      if (ZZPrice == EMPTY_VALUE) continue;
      Print("ZZPrice[", cnt, "] = ", ZZPrice);
//      setZZProperties(m_ZZProperties[cnt], i, ZZPrice);
      cnt++;
    }

Имеется инпут-переменная:

input int               i_extremumCountToCollect = 5;    // Количество самых последних непустых значений Zig-Zag'a, которые используются в торговле

Зиг-заг имеет один буфер цены, а так же 1 парамтер i_ZZTF - таймфрейм, на котором он рисуется. По сути, второй параметр функии iCustom(), как я понимаю не играет здесь вообще никакой роли, поэтому там можно ставить 0, i_ZZTF или даже PERIOD_CURRENT. Я проверял, в любом случает выдаются одинаковые значения. Но вот почему-то, хотя я и собираю непустые значения в количестве i_extremumCountToCollect. Потом их печатаю. Но выводятся какие-то не совсем верные данные. Попадаются некоторые верные, а некоторые нет.

Вот и возник вопрос. Мой алгоритм верен вообще?

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

 
hoz:

Вот и возник вопрос. Мой алгоритм верен вообще?

Алгоритм абсолютная глупость. Чтобы объяснить в чём глупость надо полностью написать код, а мне, извини, лениво.

Если коротко, то считая непустые значения ZZ надо их куда-то сохранять, а не просто принтовать и увеличивать счётчик.

 
hoz:

Я написал алгоритм сбора последних непустых вершин зиг-зага.

Вот он:

Имеется инпут-переменная:

Зиг-заг имеет один буфер цены, а так же 1 парамтер i_ZZTF - таймфрейм, на котором он рисуется. По сути, второй параметр функии iCustom(), как я понимаю не играет здесь вообще никакой роли, поэтому там можно ставить 0, i_ZZTF или даже PERIOD_CURRENT. Я проверял, в любом случает выдаются одинаковые значения. Но вот почему-то, хотя я и собираю непустые значения в количестве i_extremumCountToCollect. Потом их печатаю. Но выводятся какие-то не совсем верные данные. Попадаются некоторые верные, а некоторые нет.

Вот и возник вопрос. Мой алгоритм верен вообще?

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

В глаза бросилось вот это:

if (ZZPrice == EMPTY_VALUE) continue;
Вы ищите в буфере пустые значения , которые равны 2147483647 , но буфер может содержать и нули (0). А в остальном вроде всё правильно..
 
Alexey Viktorov:

Алгоритм абсолютная глупость. Чтобы объяснить в чём глупость надо полностью написать код, а мне, извини, лениво.

Если коротко, то считая непустые значения ZZ надо их куда-то сохранять, а не просто принтовать и увеличивать счётчик.

Вы не внимательно прочитали вопрос. Про сохранение речи не было.

На самом деле, всё у меня сохраняется в класе, которые я началсегодня писать. Я его даже прилагаю.

А в посте выше я просто принтовал. он этого ничего не меняется. Видно же в первом сообщение закомментирнованная строка:

//      setZZProperties(m_ZZProperties[cnt], i, ZZPrice);

Вот и сохранение.. Но, на данный момент, меня интересует больше не сохранение, а получение. Так что в моём вопросе есть все данные, как я понимаю.

Файлы:
ZZ_mtf.ex4  18 kb
ZZHandling.mqh  11 kb
onZZ.mq4  12 kb
 
Sergey Kolemanov:

В глаза бросилось вот это:

Вы ищите в буфере пустые значения , которые равны 2147483647 , но буфер может содержать и нули (0). А в остальном вроде всё правильно..

Я ищу не пустые, а именно непустые значения т.е. экстремумы. 0 там быть не может т.к. в индикаторе у меня изначально все элементы буферного массива инициализируются пустым значением т.е.:

    ArrayInitialize(g_ZZPriceBuf, EMPTY_VALUE);
 
hoz:   Я написал алгоритм сбора последних непустых вершин зиг-зага.

Зиг-заг имеет один буфер цены, а так же 1 парамтер i_ZZTF - таймфрейм, на котором он рисуется. По сути, второй параметр функии iCustom(), как я понимаю не играет здесь вообще никакой роли, поэтому там можно ставить 0, i_ZZTF или даже PERIOD_CURRENT. Я проверял, в любом случает выдаются одинаковые значения. Но вот почему-то, хотя я и собираю непустые значения в количестве i_extremumCountToCollect. Потом их печатаю

Алгоритм правильный, сам так делаю. Но в рассуждениях 3 слабых момента. А где тонко - там и рвется. 1) Обычно, второй параметр имеет значение. Попробуйте поставить 5, 15, 30, 60 - должна быть разница. Хотя, возможно, в самом индикаторе этот параметр игнорируется.  2) в OnTick данные будут выводиться каждый тик, т.е. повторяться. Лучше поместить эти строки в OnInit или вынести в скрипт для разового исполнения. 3) если печатаете - то для оперативности лучше использовать функцию Alert

 
STARIJ:

Алгоритм правильный, сам так делаю. Но в рассуждениях 3 слабых момента. А где тонко - там и рвется. 1) Обычно, второй параметр имеет значение. Попробуйте поставить 5, 15, 30, 60 - должна быть разница. Хотя, возможно, в самом индикаторе этот параметр игнорируется.  2) в OnTick данные будут выводиться каждый тик, т.е. повторяться. Лучше поместить эти строки в OnInit или вынести в скрипт для разового исполнения. 3) если печатаете - то для оперативности лучше использовать функцию Alert

1) А каким образом индикатор его может игнорировать? Я так понимаю, что если у меня есть параметр в индкаторе ТФ, то он влиичет на его выдачу, а если нет не понятно как он может на него влиять, на самом деле... Ставил разные периоды, возвращает что-то левое, а не те значения, которые этот индикатор отображает на графике.

2) Ну так правильно. Нам же нужно перепроверять каждые (смотря какой таймфрейм) сформированные вершины. А в ините отработает раз, найдет.. и всё. Смысл?

 
hoz:

1) А каким образом индикатор его может игнорировать? Я так понимаю, что если у меня есть параметр в индкаторе ТФ, то он влиичет на его выдачу, а если нет не понятно как он может на него влиять, на самом деле... Ставил разные периоды, возвращает что-то левое, а не те значения, которые этот индикатор отображает на графике.


Второй параметр функции iCustom указывает на каком таймфрейме запускать индикатор. А если в параметрах или коде индикатора конкретно указано с каким таймфреймом работать вне зависимости от таймфрейма графика, на котором он запущен, то в таком случае и будет проигнорирован второй параметр функции iCustom.

 
Dmitriy Gizlyk:

Второй параметр функции iCustom указывает на каком таймфрейме запускать индикатор. А если в параметрах или коде индикатора конкретно указано с каким таймфреймом работать вне зависимости от таймфрейма графика, на котором он запущен, то в таком случае и будет проигнорирован второй параметр функции iCustom.

Я так и подумал. Но получается странно. Ведь, если мт4 может работать только с текущим таймфреймом, то тот параметр ни к чему. Да и вообще, если параметр можно задать самому, то второй параметр функции iCustom() излишество.

У себя я вопрос решил промудохавшись прилично. Получается, что тестер не работает с другими ТФ, кроме открытого графаки, на котором индикатор запущен. Понял я это т.к. в пятницу в риалтайме всё корректно отображалось в реал-тайме.

 
hoz:

Я так и подумал. Но получается странно. Ведь, если мт4 может работать только с текущим таймфреймом, то тот параметр ни к чему. Да и вообще, если параметр можно задать самому, то второй параметр функции iCustom() излишество.

У себя я вопрос решил промудохавшись прилично. Получается, что тестер не работает с другими ТФ, кроме открытого графаки, на котором индикатор запущен. Понял я это т.к. в пятницу в риалтайме всё корректно отображалось в реал-тайме.

Точнее, тестер МТ4 не работает с несколькими таймфреймами. В реалтайм, прекрасно работает и в мультивалютном, и в мультитаймфремовом режимах. Для этого и существуют эти параметры. К тому же в параметрах не всех индикаторах указывается таймфрейм. Возьмите любой индикатор из поставки МТ4, там нет таймфрейма в параметрах.
 
Dmitriy Gizlyk:
Точнее, тестер МТ4 не работает с несколькими таймфреймами. В реалтайм, прекрасно работает и в мультивалютном, и в мультитаймфремовом режимах. Для этого и существуют эти параметры. К тому же в параметрах не всех индикаторах указывается таймфрейм. Возьмите любой индикатор из поставки МТ4, там нет таймфрейма в параметрах.

То что тестер не работает с другим ТФ, кроме активного я уже сам понял и выше это отписал. А остальное не очевидно. Объясню свою точку зрения:

Второй параметр функции iCustom() - период. Как он влияет на нндикатор, если у индикатора нет такого параметра?

Это как запрограммировать машину и управлять скорость её движения, когда у машины нет такого параметра. Такая же ситуация и здесь. Какой-то не эффективный набро параметров. Вот этот период можно было смело опустить. Если не добавил в индикатор переменную периода, значит период текущий и всё.. Логично? И вопросов бы не было. А так хз посредством чего этот второй параметр влияет на индикатор, если влияет.