Обсуждение статьи "ZigZag всему голова (Часть I). Разработка базового класса индикатора"

 

Опубликована статья ZigZag всему голова (Часть I). Разработка базового класса индикатора:

Многие исследователи не уделяют должного внимания определению характера поведения цены. При этом используются сложные методы, которые очень часто являются просто «чёрными ящиками», такие как: машинное обучение или нейронные сети. В таких случаях самым важным является такой — «Какие данные подать на вход для обучения той или иной модели?»

Обычно индикаторы типа ZigZag строятся по максимумам и минимумам баров без учёта спреда. В этой статье будет показана модифицированная версия, когда спред будет учитываться в построении сегментов для нижних экстремумов ZigZag’а. Предполагается, что в торговой системе сделки будут осуществляться внутрь ценового канала. Это важно, так как очень часто бывает (например, в ночное время), что цена покупки (ask) существенно превышает цену продажи (bid), поэтому строить индикатор только по bid-ценам в данном случае будет неправильно. Ведь нет смысла строить нижние экстремумы индикатора по минимумам баров, если нет возможности осуществить покупку по этим ценам. Конечно же, спред можно учитывать в торговых условиях, но лучше, когда сразу на графике всё будет видно. Это упростит разработку торговой стратегии, так как всё изначально будет более правдоподобным.

Кроме этого, хотелось бы видеть все точки, на которых экстремумы ZigZaga’а обновлялись. Тогда картина будет ещё более полной. Далее рассмотрим код этого индикатора. Остановимся только на основных моментах и функциях.

 Рис. 6 – Демонстрация получения данных внутри трёх указанных сегментов.

Автор: Anatoli Kazharski

 
Только давайте святое (МО), включая эконометрику, не будем очернять всякими зигагулями :) Это как-то не серьезно. Там совсем другой уровень абстракций.
 

Предыдущие работы автора по визуализации известны и интересны.

Идея учитывать спред при построении индикаторов - совершенно правильная, так как это важный параметр цены, который почему-то не учитывается в классических индикаторах.

Что касается индикатора ZigZag, даже в вашем варианте, то на рисунках (визуализация) ясно видно, что тренд (если я правильно понял- зелёная линия) иногда имеет критическое запаздывание.

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

Интересно посмотреть результаты теста вашего советника (вероятно мы их увидим в продолжениях к статье).

Статья полезная, как всегда наглядная визуализация. Спасибо автору за работу.

 

ZigZag позволяет находить абстракции любого уровня сложности.

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

 

В статье нужно заменить архив с файлами. Были некоторые критические исправления. 

Файлы:
Files.zip  19 kb
 
Боюсь, это неверно
low_ask_buffer[i]  =low[i]+(spread[i]*_Point);


По реальным тикам прогоните для сравнения.

 

fxsaber:
Боюсь, это неверно

low_ask_buffer[i]  =low[i]+(spread[i]*_Point);

По реальным тикам прогоните для сравнения.

Согласен. Не факт, что минимальный спред был именно тогда, когда цена bid достигала своего минимального уровня.

А в исторических данных (в барах) содержится именно минимальный спред. 

Значит нужно получать реальные тики - CopyTicks(), и определять минимальную разницу (ask-bid) на минимальном bid минимальный ask (Low Ask). 

Вы это хотели сказать?

 
Anatoli Kazharski:

Согласен. Не факт, что минимальный спред был именно тогда, когда цена bid достигала своего минимального уровня.

А в исторических данных (в барах) содержится именно минимальный спред. 

Значит нужно получать реальные тики - CopyTicks(), и определять минимальную разницу (ask-bid) на минимальном bid минимальный ask (Low Ask). 

Вы это хотели сказать?

Наверное, CopyTicks - дороговато для такого. Проще просто по реальным тикам гнать и строить ЗигЗаг по тикам. Честно говоря, не понимаю, почему Вы решили зацепиться за индикаторное исполнение ЗЗ... Визуализация при написании ТС все равно не нужна.

Когда-то выкладывал ровно такой же ЗЗ прямо в советнике. Работает быстро, а больше, наверное, ничего и не нужно.

 

Если нужно, чтобы был реальный Low Ask, то добавьте вот такой код в индикатор.

Внешний параметр для включения режима:

input bool  RealTicksMode  =false;   // Real ticks mode

Метод для получения минимального ask из реальных тиковых данных:

//+------------------------------------------------------------------+
//| Возвращает минимальную ask-цену из тиковых данных                |
//+------------------------------------------------------------------+
double GetLowAsk(const int i,const datetime &time[])
  {
//--- Выйти, если отключен режим реальных тиков
   if(!RealTicksMode)
      return(0.0);
//--- Исключаем последний (текущий) бар
   if(i>=g_rates_total)
      return(0.0);
//---
   MqlTick  ticks[];
   double   low_ask  =0.0;
   datetime end_time =time[i]+PeriodSeconds();
//--- Получим тики в указанном диапазоне
   int copied_total=CopyTicksRange(_Symbol,ticks,COPY_TICKS_ALL,(ulong)time[i]*1000,(ulong)end_time*1000);
   if(copied_total>0)
     {
      low_ask=ticks[0].ask;
      for(int k=1; k<copied_total; k++)
        {
         if(ticks[k].ask<low_ask)
            low_ask=ticks[k].ask;
        }
     }
//---
   return(low_ask);
  }

//---

Если минимальный ask не получен, то используется минимальный спред.

//+------------------------------------------------------------------+
//| Заполняет индикаторные буферы High Bid и Low Ask                 |
//+------------------------------------------------------------------+
void FillAskBidBuffers(const int i,const datetime &time[],const double &high[],const double &low[],const int &spread[])
  {
//--- Выйти, если не дошли до начальной даты
   if(time[i]<first_date)
      return;
//--- Получим минимальный ask из тиковых данных
   double low_ask=GetLowAsk(i,time);
//--- Сохраним значения
   high_bid_buffer[i] =high[i];
   low_ask_buffer[i]  =(low_ask>0)? low_ask : low[i]+(spread[i]*_Point);
  }
 

Результат:


 
fxsaber:

Честно говоря, не понимаю, почему Вы решили зацепиться за индикаторное исполнение ЗЗ... 

Для изучения и исследований.

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