В данной ветке предлагаю описать что означают переменные в заг-заге, какие могут быть варианты работы индикатора, и , попытаться сформулировать алгоритм работы зигзага для последующего создания нормального индикатора ЗЗ для МТ и других платформ. дабы появилась общая точка отсчета для создания МТС. Собственно сам вопрос возник при попытке переноса и оптимизации "классического" ЗЗ для МТ4. Его недостатки известны: нагружает процессор, тройной пробег при каждом тике всей истории , невнятное описание принципа работы, недокументированный код и т.д Некоторые вещи исправил nen в индикаторе ZUP. Но все равно остались вопросы по логике работы. Итак , начнем: Здесь прикрепляю рисунок схему зигзага. Хотелось бы услышать от сообщества как правильно привязать переменные ЗЗ к указанным отрезкам и вершинам: - Depth - Deviation - Backstep
Идея алгоритм зигзага, поставляемого с метатрейдером, не плохая. Но не реализована до конца. Из-за ошибок этого зигзага много нареканий на его работу. Расчет зигзага за три прохода нагружает процессор. Отказываться от трехпроходного алгоритма сейчас не стоит. На рынке много неопределенности. И каждое последующее движение часто отменяет действия, вызванные предыдущими движениями. Соответственно, требует пересчета ... Трехпроходность вызывает нарекания в основном из-за нагрузки на процессор. Элегантное решение по уменьшению нагрузки на процессор предложил micmed. Его предложение заключается в том, чтобы не пересчитывать зигзаг, когда цена перемещается внутри нулевого бара. Только когда цена вышла за хай или лоу нулевого бара требуется пересчет. А также при появлении нового бара. Этот алгоритм сейчас реализован в 51 версии ZUP. Нагрузка на процессор уменьшилась значитьльно. Сейчас почти любое количество экземпляров ZUP в режиме поиска паттернов Gartley почти не тормозит компьютер.
Для начала приведем текст описания индикатора от Метаквотов: Попытаемся понять: это, я так понимаю, про Deviation. Но тут уже есть проблема то пункты, то проценты. судя по коду - пункты. Далее : У Роша есть пояснение : И сразу вопрос : в первом случае Depth это по сути кол-во баров слева от текущего, но по Рошу это число и слева и справа от вершины (низа). как правильно? Далее: Тут мне понять трудновато. Т.е. . например,как на рисунке , разность между вершинами 3 и 5 должна быть меньше Deviation? тогда вершина 5 может быть отрисована? или перемещена с позиции 3 на позицию 5? И, почти последнее преположение, данный постулат сильнее того что уже отрисовался низ 4 и он будет вычеркнут при переносе вершины из 3 в 5? Или я чего-то тут не понял.
Это здорово. Да, а отдельный ЗЗ в виде ЗЗ-nen-XX с исправлениями будет? Дабы не лопатить всего монстра 51 го ?
Давай сначала обсудим здесь идеи зигзага. Возможно, найдем свой алгоритм зигзага. Есть что сказать. Часа через три напишу.
ОК, сразу пара проблем , принципиальных. - Начальный алгоритм определения верха - низа, на внешнем баре, порядок опредения тренда для выявления первой начальной вершины (низа). - все таки опять про поглощение вершины или низа при переносе вершины (низа). Насколько определившаяся точка перелома значима, можно ли ее удалять. ( В принципе можно сделать это одной из опций, важно лишь понимать, что и зачем делаем).
Приведу кусочек кода, реализующий предложение micmed'a. // Объявление переменных в начальном блоке, где объявляются все переменные double h0Bar, l0Bar; // переменные для хая и лова нулевого бара datetime t0Bar; // переменная для записи времени открытия нулевого бара // следующие две строчки вставляются перед основным циклом расчета индикатора if (l0Bar<=Close[0] && h0Bar>=Close[0] && t0Bar==Time[0]) return(0); else {l0Bar=Low[0]; h0Bar=High[0]; t0Bar=Time[0];} Есть вариант: if (l0Bar<=Low[0] && h0Bar>=High[0] && t0Bar==Time[0]) return(0); else {l0Bar=Low[0]; h0Bar=High[0]; t0Bar=Time[0];}
Есть два варианта прорисовки зигзага на графике. 1) Используя один индикаторный буфер. Так реализовано в метатрейдеровском зигзаге. 2) Используя два индикаторных буфера. Отдельно для вершин и впадин зигзага. Первый вариант ущербный. При поиске вершин и впадин часто возникают ситуации, когда и вершина, и впадина будут найдены на одном баре. Этот бар называется внешним. То есть предшествующие этому бару один или несколько баров имеют хаи и ловы меньше хая и больше лова нашего внешнего бара. При нахождении вершины и впадины на одном баре в метатрейдеровском зигзаге оставляется только вершина. При этом получаются подряд несколько вершин. И зигзаг рисует эти вершины. Еще их называют горбы. Нужен еще один просчет зигзага для удаления этих горбов. При этом могут удалиться значимые вершины. И мы теряем счет вершин. Для волновой разметки, например, это не есть гуд. При втором варианте прорисовки зигзага вершины и впадины, найденные на одном баре, не теряются. При этом варианте можно создавать не только зигзаг, но индикатор, выводящий полноценные свинги Ганна. Сейчас свинги, частично реализующие свинги Ганна, в ZUP строятся по первому варианту. Свинги, реализованные в ZUP, из-за этого несколько ущербные.
В ZUP используется первый вариант построения зигзагов на графике. Так получилось. Исторически. Второй вариант вывода, как мне кажется, использует Profi_r в своем известном индикаторе при построении свингов Ганна. Но мне, к сожалению, не попадался индикатор Profi_r полностью отлаженный. В его индикаторе есть ошибка. Также по второму варианту сейчас реализовал зигзаг Николай Косицын (файл в аттаче). За основу ZigZag_new_nen3 был взят зигзаг Николая Косицына (ник Godzilla), но реализованный по первому варианту вывода. Сейчас Николай сделал версию с двумя буферами и выложил его на сайте <span class='inv'><![CDATA[<noindex>]]></span><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><a href="http://articles.mql4.com/139" target="_blank"><span class='inv'><![CDATA[<noindex>]]></span><a href="http://www.onix-trade.net/forum/go.php?http://articles.mql4.com/139" rel="nofollow" target="_blank">http://articles.mql4.com/139<span class='inv'><![CDATA[</noindex>]]></span><span class='inv'><![CDATA[</noindex>]]></span></a></a></a></a></a></a></a></a></a></a> В обоих вариантах Николая есть ошибка, не исправленная им в метатрейдеровском зигзаге. За основу его зигзага взят метатрейдеровский зигзаг. Ошибка - переломы зигзаг иногда рисует в воздухе. Николай посчитал, что так должно быть. Но разбор алгоритма зигзага, сделанный в ветке Gartley Patterns... , убедил меня, что это - ошибка. Эту ошибку попытался прошедшим летом исправить, кажется, Слава - программист из Метаквотес, один из разработчиков метатрейдера. К сожалению, его вариант перестал в некоторых случаях выводить зигзаг на график.
Еще один принципиальный момент хочу здесь затронуть. Часто бывает у нескольких расположенных рядом баров одинаковые хаи или ловы. Если зигзаг находит вершину на одном из этих хаев или впадину на одном из этих ловов, то вершина или впадина обязательно должны быть на первом по времени баре.
Могу уточнить: это одно и тоже, в Мт используют три буфера, с последующим слиянием. именно в алгоритме слияния и видны косяки. IMHO. но это лишь проблема реализации МТ. Здесь есть три варианта проблемы: - если внешний бар расположен в первых depth барах истории. Тут требуется принять решение о порядке вычисления начальной точки в зависимости от последующей истории. Но уж никак не волевым методом типа если что не так то главное верхнее значение. - как отрисовать такую ситуацию если примем возможным ситуацию когда между противоположными вершинами допустимо нулевое значение. Как вариант рисовать другиую вершину на соседнем баре (за неименеем лучшего). - это вообще не проблема , т.к. выбор точки отрисовки зависит от предыдущей истории.( Если был низ, то на этом баре выбираем верх и т.д.). IMHO. это лечится строгим условием чередования верх/низ.
Есть подозрение что это не ошибка индикатора или реализации, а самой формулировки индикатора. Попытаюсь объяснить: представим, что вершина 5 из верхнего рисунка находится на расстоянии меньшем depth, тогда ее не надо рисовать. Но в процессе перехода к вершине 6 может нарисоваться некий локальный хай для которого вершина 5 на глубину depth есть максимальная вершина и отстоит от 3 на величину большую depth. потому и рисует в воздух. Вопрос в том, правильно ли так делать и так понимать работу ЗЗ?
Это не одно и то же. Для прорисовки зигзага используется один или два буфера. Если используется один буфер, то нет возможности свинги Ганна создать. Если два, то есть возможность. Свинги Ганна часто рисуют вершину и впадину на одном баре. Обычный зигзаг на это не способен. Впрочем, я описал это выше. В МТ используется не три, а два буфера. И один из этих буферов используется для вывода зигзага. А второй вспомогательный. Вариант два предполагает использование двух буферов для вывода линии зигзага на график. В этом варианте оба буфера основные. Нет вспомогательных. Три буфера использовано в ZUP. На момент начала создания ZUP так виделось оптимально.
А что такое ЗЗ? А если серьезно, то если не чередование , то тогда что? Рисуем горбы? насчет 2 или 3 буфера - согласен, формально в Мт 2 буфера, но пытаются их использовать как три, создавая лишнюю сущность и внося путаницу. в нен3 это выведено в нормальный вид. З.Ы. интересно, кому-нибудь вообще интересно то что обсуждаем здесь вдвоем? Ведь по сути, пытаемся понят основу всей деятельности ZUP'a .....
Зигзаг нужен, чтобы уловить все существенные пики и впадины. Если задача получить чередование пиков и впадит, то будут пропущены существенные точки, на которые многие оринтируются при торговле. Я сейчас на КПК просто визуально выделяю последние пики и впадины. Строю от них фибы. И цена удивительным образом ходит четко по фибам. Иногда чередования пиков и впадин нет. И пик, и впадина находятся на одном баре. Нельзя такие ситуации исключать.
Не совсем в тему, но о зигзагах: <a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank"><a href="http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#" target="_blank">http://onix-trade.net/forum/index.php?act=...41&t=632&st=40#</a></a></a></a></a></a></a></a></a></a> Сегодня выложил только евро, завтра постараюсь остальные три пары. Это в принципе к теме, что должен и что не должен показывать зигзаг для разных целей его применения.
ОК, ЗЗ это чередование существенных пиков и впадин. Если они выпадают на один бар, то это тоже ОК, просто частный случай для backstep=0 , как отрисовывать это уже вторично. Я все больше прихожу к выводу, что значимы 2 параметра - depth & deviation.
можно проще: Код: bool newb() {static int knw; if (Time[0]==knw) return(false); knw=Time[0]; return(true); } использую примерно так: Код: int start(){ if(newb()){ //новый бар возник ZZ_calc(Bars,1); // пересчитаем }else{ return(0); //ни чего не надо - выходим } } т.е. здесь нулевой бар вообще не используется. кстати, большое спасибо за компанию в Москве! хороший пример показываешь своим отношением к жизни.. приехал домой отдохнувший, не смотря на 17 часов на плацкарте и разборки с пограничниками...
Товаровед, твой кусочек кода позволяет рассчитывать зигзаг (и любой другой индикатор) один раз на бар на первом тике бара. Но здесь есть маленькая некорректность. Все-таки на нулевом баре на первом тике идет расчет. А надо, в некоторых случаях, значения цены на нулевом баре вообще исключать из расчета. Это необходимо учитывать при исключении из расчета нулевого бара. Для зигзага, на мой взгляд, можно оставлять расчет и на нулевом баре с условием пересчета при выходе цены за минимум или максимум бара. При этом будем получать в реальном времени значение максимума или минимума, если они изменились. Все равно этот минимум или максимум будет найден, если не рассчитывать нулевой бар, на первом тике следующего бара. Но с потерей во времени.