Ищется быстрый ZigZag

 

Если кто-нибудь где-то видел, то подскажите, пожалуйста, адекватный и самое главное - очень быстрый - индикатор ZigZag.


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

 
Идея здесь - Zigzag R
 
попробуйте )
Файлы:
zigzag_nk.mq4  9 kb
 
rider:
попробуйте )

В этом варианте зигзага имеются ошибки. Переломы зигзага могут из-за этой ошибки рисоваться в воздухе, а не на High или Low бара.


Исправить ее можно заменив


LowestBuffer[bar]=val;
на

if (Low[bar]==val)
{
LowestBuffer[bar]=val;

}

и

HighestBuffer[bar]=val;
на


if (High[bar]==val)
{
HighestBuffer[bar]=val;

}

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

 

Спасибо, Rosh, rider, nen.


Я провел тесты представленных здесь зигзагов, а также внешних зигзагов, используемых известным интегральным индикатором Zup_v73 (встроенные зигзаги из него тестировать не стал, т.к. лень было их оттуда выдирать, а подключать в советника сам Zup_v73 тоже лень, т.к. у него до фига входных параметров...).


Обнаружился интересный факт. Оказывается, ZigZag_R_ по коду идентичен стандартному ZigZag, идущему в составе MT4 (по крайней мере, в его текущей - build 216 - версии). А в CodeBase на месте стандартного зигзага лежит какой-то от старых версий. MetaQuotes, обновите. :) В тесте я решил проверить оба зигзага, назвав их, соответственно, "ZigZag (MT4)" (он же ZigZag_R_) и "ZigZag (MT3)".


Полный код тестового советника:

void init()   {Print("Start");}
void start()  {double ZZ = iCustom(NULL, 0, "ZigZag",   24,10,1 /* Depth,Deviation,Backstep */,   0, 0);}
void deinit() {Print("Finish");}

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


Cоветник запускался для каждого индикатора, на EURUSD H1 open. Было два тура тестирования:

1) весь 2007 год;

2) 1999-2007 годы. 2-й тур проводился только для самых быстрых по результату 1-го тура.


Результаты тестирования:


Как видно, 3 индикатора существенно вырвались вперед.


Хочу похвалить MetaQuotes за то, что стандартный индикатор зигзага в MT4 оказался таким резвым. Он получает в этом тесте заслуженное 3-е место.


2-е место получает ZigZag_NK. На графике он практически совпадает со стандартным зигзагом, хоть алгоритм построения немного другой. Причина, по которой индикатор оказался лишь на втором месте, кроется в его коде:

#property indicator_buffers  2
int init() {

  SetIndexBuffer(0,LowestBuffer);
  SetIndexBuffer(1,HighestBuffer);

  SetIndexStyle(0,DRAW_ZIGZAG);
  SetIndexStyle(1,DRAW_ZIGZAG);

Т.е. это только на графике выглядит как единый зигзаг, а реально это два отдельных буфера, поэтому программно использовать такой зигзаг не очень удобно - для поиска вершин зигзага нужно считывать значения из обоих буферов и складывать их в общий результат. Хотя, если ваша МТС основана на раздельном учете верхних и нижних вершин, то для вас два отдельных буфера - это даже хорошо... Но в целом было бы неплохо, если бы авторы этого индикатора его доработали и сделали 3-й буфер. Так же тем, кто решит использовать этот зигзаг в своих советниках, напоминаю о замечании nen'а касательно вероятности рисования вершин в воздухе. Я пробовал строить на графике этот индикатор с исправлением nen'а (кстати, при внесении исправления индикатор начинает совпадать со стандартным зигзагом абсолютно) и без - поведение индикатора немного различается (появляются дополнительные переломы зигзага), но в обоих случаях оно идеологически правильное, и я не заметил, чтобы что-то висело в воздухе. Может, nen пояснит, при каких условиях это можно увидеть?


1-е место получает CZigZag (автор - Candid). Рисуемый им график сильно отличается от стандартного зигзага. Какой из графиков "правильней" - это дело субъективного вкуса, каждый трейдер считает по-своему. Поэтому судить об этом не берусь, выбирайте сами. Главное, что не замечено объективных глюков, и в индикаторе есть сводный буфер (он там вообще единственный):

#property indicator_buffers 1
int init() {
  SetIndexStyle(0,DRAW_SECTION);
  SetIndexBuffer(0,ZigZag);

Возможно, ему тоже не помешало бы иметь 3 буфера, а не 1... Разделение вершин на два буфера пригодилось бы В МТС, строящих по зигзагу уровни поддержки и сопротивления.


А вообще, на первый взгляд все 3 зигзага нормальные, и предположительно любой из них можно использовать в своих советниках. А окончательный точный ответ даст только торговая практика ваших МТС... :)

 
ds2:

CZigZag (автор - Candid). Рисуемый им график сильно отличается от стандартного зигзага. Какой из графиков "правильней" - это дело субъективного вкуса, каждый трейдер считает по-своему.

Насколько я помню, там временнОй параметр используется наоборот: если время от последней вершины превышает задаваемое параметром, происходит принудительное переключение сегментов. Привести к стандартному (переключения не чаще, чем через заданное время) вроде было не особо сложно. Если я правильно помню (давно это было). Что помню совершенно точно - он писался именно как быстрый зигзаг для тестера :).

Уровни поддержки и сопротивления прекрасно строятся без лишних буферов.


 
ds2:

Может, nen пояснит, при каких условиях это можно увидеть?


Предложенное исправление кода было сделано для версий зигзага, поставлявшегося с МТ в 2005-2006 годах. Несколько лет назад было проведено подробное исследование работы той версии зигзага. В результате было найдено предложеноое решение. (Исправление кода). Это не вполне корректное решение. Это грубое исправление ошибки. Более корректное не удалось найти. Устроило найденное.

В зигзаге Косицина также присутствует этот участок кода. Поэтому я и предложил исправление. У Роша, насколько помню, исправлен этот участок. Поэтому и совпадение "показаний" индикаторов.


У меня осталось впечатление от первых версий ZigZag_NK. А эта версия ZigZag_NK последняя. Сейчас посмотрел. Ошибок построения нет. Приношу извинения. Судил по названию индикатора (название как и у первых версий) и по участку кода, вызывавшему ранее сбои в построениях.


Впрочем, я сейчас делал проверку без поступления новых котировок, на истории...

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


ZigZag_new_nen4 использует в своей основе алгоритм стандартного зигзага (2005-2006 годов) с исправлениями Косицина (исправления взяты из первых версий его зигзага). Там также исправлены найденные ошибки, приводившие к повисанию вершин в воздухе. И еще внесены дополнения для дополнительных графических построений. Это не скоростной зигзаг.

............


По поводу выбора зигзага. Длительное использование различных зигзагов выявило, что стандартный зигзаг наиболее хорошо подходит для волновиков. И для построений, связанных с волновой разметкой.

Зигзаг Косицина (не посмотрел сразу внимательно его код. Первые версии были однобуферными) двухбуферный. Это хорошее решение при работе с внешними барами. Swing_ZZ_1 - это несколько модифицированная версия построения свингов Ганна по алгоритму, описанному Хьержиком. Для алгоритма Хьержика хорошо подходит двухбуферная версия зигзага. А Swing_ZZ_1 - однобуферная версия. К тому же в этой версии также имеются параметры для дополнительных построений. Все дополнительные параметры вызывают замедление работы. Swing_ZZ_1 - это не зигзаг. Построения делает, как и зигзаг. Но идеологически - это не зигзаг.

DT_ZZ_nen - это зигзаг, разработанный klot-ом с дополнительными параметрами.....

Дополнительные параметры в зигзаги вносились для применения с ZUP. Цели создания быстрых зигзагов не преследовалось. Там были нужны зигзаги для создания определенных графических построений. Для графических построений в подавляющем большинстве случаев не нужны быстрые зигзаги. Главное - реализовать идеи, заложенные в графические построения. Графические построения позволяют прогнозировать наступление определенных событий на рынке задолго до наступления этих событий. Поэтому скорость здесь не нужна.


Прежде чем использовать тот или иной зигзаг необходимо четко понимать, какова конечная цель. То есть сначала необходимо определиться со стратегией, а потом уже искать пути реализации этой стратегии.


В основе зигзагов Косицина и Роша лежит стандартный зигзаг.

================

В заключение предлагаю попробовать поработать с зигзагом, который разработал Talex. Хороший программист. Этот зигзаг встроен в ZUP. Проверьте скорость его работы.

В этом зигзаге всего два параметра количество обрабатываемых баров для поиска экстремума и количество переломов зигзага, которые необходимо вывести на экран.

Файлы:
 
nen:

У меня осталось впечатление от первых версий _NK. А эта версия _NK последняя. Сейчас посмотрел. Ошибок построения нет. Приношу извинения. Судил по названию индикатора (название как и у первых версий) и по участку кода, вызывавшему ранее сбои в построениях.

Похоже, мы оба просмотрели. :-) Вот, сегодня я таки заметил висящую в воздухе вершину:



И таких много оказалось, если внимательно искать на крупном масштабе.


Предложенный вами ранее патч эту ошибку исправляет: оба перелома исчезают, и график становится полностью идентичным стандартному зигзагу. Что говорит также о том, что в стандартном зигзаге эта ошибка исправлена.


Но вы правы, этот патч - лишь грубая заплатка, а не устранение причины. Заглянем в код стандартного ZigZag (MT4):

#property indicator_buffers 1
int init() {
  IndicatorBuffers(3);
  SetIndexStyle(0,DRAW_SECTION);
  SetIndexBuffer(0,ZigzagBuffer);
  SetIndexBuffer(1,HighMapBuffer);
  SetIndexBuffer(2,LowMapBuffer);

Наружу доступен только сводный буфер, но внутри есть еще два. Познакомимся с ними поближе. :) Для этого изменим код на:

#property indicator_buffers 3
int init() {
  IndicatorBuffers(3);
  SetIndexStyle(0, DRAW_SECTION);
  SetIndexStyle(1, DRAW_ARROW);
  SetIndexStyle(2, DRAW_ARROW);      
  SetIndexBuffer(0, ZigzagBuffer);
  SetIndexBuffer(1, HighMapBuffer);
  SetIndexBuffer(2, LowMapBuffer);

И выведем этот индикатор на график вместе с непропатченным ZigZag_NK:


Крестики на рисунке - это вершины из задействованных нами дополнительных буферов стандартного ZigZag. Где находится вершина ZigZag_NK, но нет крестика - это и есть висящие в воздухе вершины, это видно при более крупном масштабе.


Если бы такие висящие вершины не удалялись грубо патчем, а просто изначально рисовались бы безошибочно, в правильных местах, то наверняка мы получили бы дополнительные (соответствующие алгоритму) переломы зигзага, т.е. более корректную картину рынка. А то сейчас получается, что из-за удаления вершин некоторые отрезки зигзага "выпадают" за его общий алгоритм и строятся по какому-то своему особому... Что наверняка вносит определенную погрешность в работу основанных на этом зигзаге торговых систем.


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


Тогда на свет появился бы быстрый и при этом действительно безглючный зигзаг.

 

1) Есть статья Косицина, в которой описывается оптимизация алгоритмов индикаторов. Там как раз и описана доработка зигзага. Этот зигзаг работает быстро потому, что пересчет ведется только на небольшом участке истории.

2) Ошибка - висящие в воздухе вершины - возникает из за неправильного понимания работы параметра start в функциях:

iLowest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)

iHighest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)

Непонимание работы параметра start, а, соответственно, и применение этого параметра и вызывает ошибку с Повисшими в воздухе переломами зигзага.

Дело не в буферах.

Сегодня попытался найти на ОНИКСе подробное описание поиска этой ошибки. Не нашел. Где-то в этой ветке http://onix-trade.net/forum/index.php?showtopic=118&st=0&start=0

Также здесь, на форуме mql4, я цитировал небольшие отрывки из описания поиска этой ошибки. Где-то в переписке с Рошем. Поищите.


Ошибка исправлена правильно, но грубо.

Дополнительных переломов этого зигзага быть при правильном построении не должно.

С заплаткой зигзаг отрисовывается правильно.

 
Кто знает, подскажите пожалуйста, алгоритм стандартного ZigZag из MetaTrader.
 
А никто не подскажет, как этот самый ЗигЗаг использовать? Я видела или рисующие, или сильно прррриторможенные. На истории да, впечатляет. А в реальной жизни?
Причина обращения: