Индикаторы для определения дивергенции.

Самые лучшие и честные брокеры бинарных опционов в 2020 году:
  • Бинариум
    Бинариум

    1 место! Лидер на рынке — самый честный брокер бинарных опционов!
    Идеально для новичков — предоставляется бесплатное онлайн-обучение и демо-счет!
    Получите бонус за регистрацию по ссылке:

  • Биномо
    Биномо

    2 место!

Автоматический поиск дивергенций и конвергенций

Содержание

Введение

Термин «дивергенция» происходит от латинского слова «divergere» («обнаруживать расхождение»). Обычно под дивергенцией понимается несоответствие в показаниях индикатора и направлении движения цены. Вместе с этим термином часто используется антонимичное ему слово — «конвергенция», происходящее от латинского слова «convergo» («сближаю»). Есть более широкие системы классификации дивергенций/конвергенций, включающих такие определения, как «скрытая дивергенция», «расширенная дивергенция», дивергенции классов A, B, C и т.д.

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

Дивергенция и конвергенция (определение понятия)

Итак, дивергенция — это несоответствие в показаниях индикатора и направлении движения цены. Если в этом определении несоответствие назвать расхождением, смыл определения не изменится. Но у нас есть второй термин — конвергенция, противоположный по смыслу первому. По вышеописанной логике, если дивергенция — это несоответствие или расхождение в показаниях индикатора и движении цены, то можно прийти к выводу, что конвергенция — это соответствие или схождение. Но это не так, ведь соответствие нельзя приравнивать к схождению.

Чтобы оба термина — дивергенция и конвергенция — имели равноправный смысл, нужны их более точные и узкие определения. Посмотрим на графики цены и индикатора. Если цена движется вверх, а индикатор вниз — это расхождение, или дивергенция. Если цена движется вниз, а индикатор вверх — это уже схождение, или или конвергенция (рис. 1).

Рис. 1. Несоответствие в направлениях движения цены и индикатора. Слева цена движется вверх,
индикатор вниз — расхождение. Справа: цена движется вниз, индикатор вверх — схождение

Все привыкли, что график индикатора расположен ниже графика цены, поэтому такое определение на первый взгляд приемлемое. Однако если бы график индикатора находился сверху, то положение бы зеркально изменилось: дивергенция превратилась бы в конвергенцию, и наоборот (рис. 2).

Рис. 2. Несоответствие в направлениях движения цены и индикатора. Слева: цена движется вверх,
индикатор вниз — схождение. Справа: цена движется вниз, индикатор вверх — расхождение

Теперь посмотрим на рис. 1 и 2. с точки зрения выбора направления торговли. Допустим, цена движется вверх, индикатор — вниз, и мы решили продавать. Следуя аналогии, покупка должна выполняться, когда цена движется вниз, а индикатор — вверх (рис. 3).

Рис 3. Слева: условия для продажи, цена и индикатор расходятся. Справа: условия
для покупки (идентичны условия для продажи), цена и индикатор сходятся

Получается, что в случае продажи цена и индикатор расходятся, а в случае покупки — сходятся, то есть в одном случае наблюдается дивергенция, а в другом — конвергенция. Но ведь условия продажи и покупки идентичны, только зеркально противоположны. Значит, одно из условий мы можем назвать медвежьим, а второе — бычьим. Значит, уточнения о том, что график индикатора должен располагаться ниже графика цены в определении дивергенции и конвергенции, недостаточно.

Можно добавить в определение, что все приведенные определения касаются направления продажи, а для покупок все зеркально противоположно. Но есть и более простой и точный вариант определения, основанный на самой сути технического анализа. Если добавить в определение дивергенции и конвергенции предположение о дальнейшем движении цены, то все встает на свои места, и определение становится простым и лаконичным.

Дивергенция — это сигнал разворота цены, представляющий собой несоответствие показаний индикатора и направления движения цены

Поскольку это сигнал разворота — значит, для продажи цена сначала должна двигаться вверх, а для покупки — вниз. А для того, чтобы появилось несоответствие движения цены с показаниями индикатора, индикатор должен двигаться, соответственно, вниз и вверх. Можно заметить, что в этом определении за эталонное направление принята продажа, а график индикатора должен быть расположен под графиком цены. По этому определению, на рис. 3 показана дивергенция.

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

Конвергенция — это сигнал продолжения тенденции, представляющий собой несоответствие показаний индикатора и направления движения цены

Поскольку это сигнал продолжения, значит, для продажи цена должна двигаться вниз, а для покупки — вверх. А чтоб движение цены не соответствовало показаниям индикатора, он должен двигаться вверх и вниз, соответственно (рис. 4).

Рис. 4. Сигналы конвергенции

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

Для закрепления анализа терминологии, проведенного в этом разделе, и в качестве удобной «шпаргалки» на рис. 5 одновременно показаны сигналы дивергенции и конвергенции.

Рис. 5. Сигналы дивергенции и конвергенции

Методы определения направления движения цены и индикатора

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

В общем случае сначала мы должны выявить на графике цены или индикатора пики и впадины, затем сравнить их значения. Бычью дивергенцию (сигналы на покупку) ищем по впадинам: если одна впадина выше предыдущей, значит, индикатор направлен вверх, и наоборот. Медвежью дивергенцию (сигналы на продажу) ищем по вершинам.

Можно выделить три способа поиска экстремумов на графике.

  1. По барам.
  2. По преодолению порогового значения от последнего минимума/максимума.
  3. Максимальное/минимальное значение при положении выше/ниже центральной линии индикатора.

Определение пиков/впадин по барам. Используется количество баров пика/впадины. Например, если значение этого параметра 2, то значение индикатора на баре вершины должно быть выше, чем у двух баров слева и у двух баров справа от вершины. Соответственно, для впадины значение должно быть ниже, чем у соседних баров (рис. 6).

Рис. 6. Определение вершин и впадин по двум барам. Слева определение вершины. На баре, обозначенном стрелкой, стало
известно о формировании вершины, обозначенной птичкой. Справа определение впадины

Необходимое количество баров слева и справа от вершины/впадины может быть разным: например, 5 слева и 2 справа (рис. 7).

Рис. 7. Вершина по пяти барам слева и двум барам справа

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

Рис. 8. Определение вершин и впадин по пороговому значению. В левом верхнем углу показана величина порога.
До бара 2 индикатор двигался вверх, на баре 2 было зафиксировано максимальное значение, на баре 5 значение
снизилось на пороговое значение, что означало смену направления индикатора. На баре 6 индикатор снова
преодолел пороговое значение и изменил направление и т.д.

Вариант по барам удобнее всех, поскольку он совершенно не зависит от характера индикатора. Напротив, величина порогового значения зависит от типа индикатора. Например, для RSI с диапазоном колебаний 0 — 100 пороговое значение может быть около 5. Для Momentum порог будет от 0.1 до 1, ведь индикатор незначительно колеблется вокруг уровня 100, к тому же величина этих колебаний зависит от таймфрейма. Это еще сильнее усложняет использование порогового значения.

Максимальное/минимальное значение при положении выше/ниже центральной линии индикатора. Этот способ используется реже остальных. Он тоже зависит от используемого индикатора, ведь не у всех индикаторов среднее значение находится на уровне 0 (например у индикатора RSI это уровень 50). Но главный его недостаток — сильное запаздывание (рис. 9).

Рис. 9. Определения пиков и впадин по пересечению центральной линии. О вершине, отмеченной цифрой 1, станет известно
только после пересечения центральной линии на баре, обозначенном цифрой 2. О впадине, обозначенной цифрой 3, станет
известно после пересечения на баре, обозначенном цифрой 4

Системы классификаций дивергенции

Множество статей в Сети посвящены дивергенции. В них описаны разнообразные подходы, которые отличаются и терминологией, и принципами систематизации дивергенции и конвергенции. Можно обнаружить как простую, так и классическую, скрытую, расширенную дивергенцию. Кто-то разделяет ее на классы А, В и С. В наши задачи не входит подробный анализ первоисточников — просто разберем некоторые из выделяемых типов.

Классическая дивергенция. Это явление уже описано выше и показано на рис. 5.

Скрытая дивергенция. Скрытая дивергенция отличается от классической направлением движения цены и индикаторов. То есть, скрытая дивергенция — это то же, что определено выше как конвергенция.

Расширенная дивергенция. До сих пор мы говорили о направлении движения цены и индикатора только вверх и вниз. Если добавить в рассмотрение горизонтальное движение, вариантов становится больше. Несмотря на множество вариантов, которые теоретически можно получить, сочетая три направления движения цены и три направления движения индикатора, был выделен только один вариант расширенной дивергенции:

  • Горизонтальное движение цены, индикатор падает — расширенная медвежья дивергенция (сигнал на продажу)
  • Горизонтальное движение цены, индикатор растет — расширенная бычья дивергенция (сигнал на покупку).

Классы: A, B, C. Класс А — это классическая дивергенция, а классы B и C — варианты расширенной дивергенции.

    • Горизонтальное движение цены, индикатор падает — медвежья (сигнал на продажу).
    • Горизонтальное движение цены, индикатор растет — бычья (сигнал на покупку).
    • Цена растет, вершины индикатора на одном уровне — медвежья (сигнал на продажу).
    • Цена падает, впадины индикатора на одном уровне — бычья (сигнал на покупку).

Как видим, классы B и С — варианты расширенной дивергенции, причем вариант B полностью повторяет вышеописанное определение.

Основное впечатление и главный вывод от всех доступных материалов посвященных дивергенции — отсутствие четкой терминологии и неполный охват вариантов. Поэтому проанализируем различные варианты сочетания направлений движения цены и индикатора и систематизируем их.

Полная систематизация вариантов движения цены и индикатора

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

  1. Два направления движения: вверх и вниз.
  2. Три направления движения: вверх, вниз и горизонтально.

В первом случае возможны только 4 варианта сочетаний. Рассмотрим их на примере сигналов продажи.

  1. Цена вверх, индикатор вверх.
  2. Цена вверх, индикатор вниз (дивергенция).
  3. Цена вниз, индикатор вверх (конвергенция).
  4. Цена вниз, индикатор вниз.

Разобравшись в предыдущем разделе статьи со способами определения направлений, визуализируем эти варианты (рис. 10).

Рис. 10. Все варианты сочетаний различных направления движения цены и индикатора при двух вариантах движения

В случае с тремя вариантами движения цены и индикатора возможны уже девять сочетаний.

  1. Цена вверх, индикатор вверх.
  2. Цена вверх, индикатор горизонтально.
  3. Цена вверх, индикатор вниз (дивергенция).
  4. Цена горизонтально, индикатор вверх.
  5. Цена горизонтально, индикатор горизонтально.
  6. Цена горизонтально, индикатор вниз.
  7. Цена вниз, индикатор вверх (конвергенция).
  8. Цена вниз, индикатор горизонтально.
  9. Цена вниз, индикатор вниз.

Графически эти варианты показаны на рис. 11.

Рейтинг надежности площадок для торговли бинарных опционов:
  • Бинариум
    Бинариум

    1 место! Лидер на рынке — самый честный брокер бинарных опционов!
    Идеально для новичков — предоставляется бесплатное онлайн-обучение и демо-счет!
    Получите бонус за регистрацию по ссылке:

  • Биномо
    Биномо

    2 место!

Рис. 11. Все варианты сочетаний различных направления движения цены и индикатора при трех вариантах движения

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

Тройная дивергенция

До сих пор направление движения цены и индикатора определялось по двум точкам: вверх, вниз, горизонтально. Можно добавить третью точку, и возможных вариантов движения цены или индикатора станет больше. Всего получится девять вариантов:

  1. Вверх, вверх.
  2. Вверх, горизонтально.
  3. Вверх, вниз.
  4. Горизонтально, вверх.
  5. Горизонтально, горизонтально.
  6. Горизонтально, вниз.
  7. Вниз, вверх.
  8. Вниз, горизонтально.
  9. Вниз, вниз.

В этом случае правильнее говорить не о направлении, а о форме движения. Графически варианты различных форм движения, определяемые по трем вершинам, показаны на рис. 12.

Рис. 12. Различные формы движения, образуемого тремя вершинами

Соответствующие им формы движения, определяемые по впадинам, показаны на рис. 13.

Рис. 13. Различные формы движения, образуемого тремя впадинами

Комбинируя 9 вариантов формы движения цены и 9 вариантов формы движения индикатора, можно получить 81 вариант тройной дивергенции.

Таким образом, определять форму движения можно по любому количеству точек. Если добавить четвертую точку, получится 81 вариант формы движения цены или индикатора, и, соответственно 6561 (81*81) вариант их сочетания. Конечно, чем больше возможных вариантов, тем реже они будут встречаться. Может быть, использование четвертой точки для определения формы движения не имеет смысла, однако индикатор в этой статье будет создан без ограничения на количество точек, по которым определяется форма движения.

Универсальный индикатор определения дивергенции

Разобравшись с теорией, приступим к созданию индикатора.

Выбор осциллятора. Чтобы не ограничиваться одним осциллятором для определения дивергенции, используем универсальный осциллятор из этой статьи. К ней приложены iUniOsc (универсальный осциллятор) и iUniOscGUI (он же, но с графическим интерфейсом). Мы будем использовать базовый вариант — iUniOsc.

Создание нового индикатора. В MetaEditor создаем новый индикатор iDivergence. При его создании выбираем функцию OnCalculate. Функция OnTimer() не потребуется. Отмечаем галочку «Индикатор в отдельном окне». Создаем три буфера: линию отображения осциллятора и два стрелочных буфера для отрисовки стрелок при возникновении дивергенции. После того, как новый файл откроется в редакторе, изменим имена буферов: 1 — buf_osc, 2 — buf_buy, 3 — buf_sell. Имена изменить нужно там, где выполняется объявление массивов и в функции OnInit(). Еще можно подправить свойства буферов: indicator_label1, indicator_label2, indicator_label3 — значения этих свойства отображаются во всплывающей подсказке при наведении мышки на линии или значок индикатора и отображаются в окне данных. Назовем их «osc», «buy», «sell».

Применение универсального осциллятора. Вставляем в новый индикатор все внешние параметры индикатора iUniOsc. Параметры ColorLine1, ColorLine2, ColorHisto не нужны в окне свойств, скроем их. Параметр Type имеет пользовательский тип OscUni_RSI описанный в файле UniOsc/UniOscDefines.mqh. Подключим этот файл. По умолчанию значение параметра Type выставлено на OscUni_ATR — выбор индикатора ATR. Но индикатор ATR не зависит от направления движения цены, а значит, не подходит для определения дивергенции. Поэтому установим по умолчанию OscUni_RSI — индикатор RSI:

Чуть ниже внешних переменных объявим переменную для хэндла универсального осциллятора:

В начале функции OnInit() выполним загрузку универсального осциллятора:

В функции OnCalculate() скопируем данные универсального осциллятора в буфер buf_osc:

На этом этапе можно проверить правильность выполненных действий, прикрепив индикатор iDivergence на график. Если все сделано правильно, в подокне можно увидеть линию осциллятора.

Определение экстремумов осциллятора. Выше мы рассмотрели три варианта определения экстремумов. Впишем все эти варианты в создаваемый индикатор и предусмотрим возможность выбора любого из них (внешняя переменная с выпадающим списком). В папке Include создадим папку UniDiver, где будем создавать все дополнительные файлы с кодом. Создадим включаемый файл UniDiver/UniDiverDefines.mqh, в нем напишем перечисление EExtrType:

  • ExtrBars — по барам;
  • ExtrThreshold — по преодолению порога от последнего минимума/максимума;
  • ExtrMiddle — максимальное или минимальное значение при положении индикатора выше или ниже его середины.

В индикаторе создадим внешний параметр ExtremumType, вставим его выше всех других внешних параметров. При определении экстремумов по барам потребуются два параметра — количество баров слева и справа от экстремума, а для варианта по порогу потребуется параметр для определения величины порога:

Cделаем так, чтобы можно было использовать не только два параметра сразу, но и какой-то один: RightBars или LeftBars. У параметра RightBars по умолчанию стоит значение -1. Это значит, что он не используется и ему будет присвоено значение второго параметра.

Классы определения экстремумов. В процессе работы индикатора менять способ определения экстремума не потребуется, поэтому вместо оператора if или switch рациональнее использовать ООП. Создадим базовый класс и три дочерних для трех вариантов определения экстремума. Один из этих дочерних классов будет выбираться при запуске индикатора. Фактически, в этих классах будут определяться не только экстремумы, но и выполняться вся работа по поиску дивергенции. Различаются в них только способы определения экстремумов, а само определение дивергенции совершенно идентично во всех случаях. Поэтому функция определения дивергенции будет находиться в базовом классе и вызываться из дочерних классов. Но сначала надо будет обеспечить легкий доступ ко всем экстремумам индикатора (как это сделано в статье «Волны Вульфа» с вершинами зигзага).

Для хранения данных об одной вершине будет использоваться структура SExtremum, описание структуры располагается в файле UniDiverDefines:

Назначение полей структуры:

  • SignalBar — бар, на котором стало известно о формировании экстремума
  • ExtremumBar — бар с экстремумом
  • ExtremumTime — время бара с экстремумом
  • IndicatorValue — значение индикатора на экстремуме
  • PriceValue — значение цены на баре с экстремумом индикатора

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

Классы определения экстремумов находятся в файле UniDiver/CUniDiverExtremums.mqh, имя базового класса — CDiverBase. Рассмотрим структуру класса, но пока только с основными методами. Остальные добавятся потом, по мере необходимости.

Виртуальный метод Calculate() обеспечивает выбор варианта определения экстремумов. Методы AddExtremum() и CheckDiver() располагаются в секции protected — они будут вызываться из метода Calculate() дочерних классов. Метод AddExtremum() собирает данные о вершинах и впадинах в массивы m_upper[] и m_lower[]. Метод CheckDiver() проверяет, выполнено ли условие дивергенции, и устанавливает индикаторные стрелки. Ниже рассмотрим все эти методы подробнее, а пока познакомимся с дочерними классами для других способов определения экстремумов.

Определение экстремумов по барам. Класс для определения экстремумов по барам:

В конструктор класса передаются параметры определения экстремумов (внешние переменные LeftBars, RightBars), выполняется проверка правильности их значений, коррекция в случае необходимости и вычисляются дополнительные параметры:

Сначала проверяются значения параметров. Если какое-то из них не положительно (то есть, не задано), то ему присваивается значение второго параметра. Если не задан ни один параметр, им присваиваются значения по умолчанию (числа 2). Затем вычисляется величина отступа начального бара для поиска экстремума (m_start) и общее количество баров экстремума (m_period).

Метод Calculate() идентичен стандартной функции OnCalculate(), но в нее передаются не все ценовые массивы, а только нужные: time[], high[], low[] и индикаторные буферы osc[] (данные осциллятора), buy[] и sell[] (стрелки). Как и всегда в функции OnCalculte(), вычисляется диапазон обсчитываемых баров. Затем в стандартном индикаторном цикле определяются экстремумы индикатора (функции ArrayMaximum() и ArrayMinimum()). При обнаружении экстремума вызывается метод AddExtremum() для добавления данных в массив m_upper[] или m_lower[]. В завершение вызывается метод CheckDiver(), анализирующий данные из массивов с экстремумами. Если дивергенция найдена, устанавливаются стрелки.

Рассмотрим более подробно этот код. В самом начале индикаторного цикла:

переменная m_LastTime объявлена в базовом классе. Если время бара time[i] больше значения этой переменной — значит, бар обсчитывается впервые. При этом переменной m_LastTime присваивается время бара, а переменной Pre — значение переменной Cur. При повторном обсчете этого же бара, наоборот, переменной Cur выполняется присвоение переменной Pre. Прием с переменными Cur и Pre подробно рассматривался в этой статье. Переменные Pre и Cur имеют тип SPseudoBuffers1, описанный в файле UniDiverDefines:

Структура включает два поля:

  • UpperCount — количество используемых элементов массива m_upper[];
  • LowerCount — количество используемых элементов массива m_lower[];

Метод Reset() создан для быстрого обнуления всех полей структуры.

После манипуляций с переменными Cur и Pre вычисляются индексы баров для поиска экстремумов:

Переменной sb присваивается индекс бара, с которого выполняется поиск максимума или минимума. Переменной mb присваивается индекс бара, на котором должен находиться максимум или минимум.

Определяем пик или впадину с помощью функций ArrayMaximum() и ArrayMinimum():

Если функция ArrayMaximum() или ArrayMinimum() возвращает значение mb, значит, слева и справа от пика/впадины находится заданное количество баров. В свою очередь, это свидетельствует о том, что образовался искомый пик/впадина. При этом вызывается метод AddExtremum(), и данные добавляются в массив m_upper[] или m_lower[].

Разберем простой метод AddExtremum():

Через параметры в метод передается массив a[], в который нужно добавить новые данные. Это может быть массив m_upper[] или m_lower[]. Через переменную cnt передается количество занятых элементов массива a[]. Это может быть переменная Cur.UpperCnt или Cur.LowerCnt. Массив a[] и переменная cnt передаются по ссылкам, поскольку изменяются в методе.

Переменная iv — значение индикатора на баре экстремума, pv — значение цены на баре с экстремумом, mb — индекс бара с экстремумом, sb — сигнальный бар (на котором стало известно о появлении экстремума), et — время бара с экстремумом.

В начале метода AddExtremum() проверяется размер массива. Если он полностью заполнен, его размер вырастает на 1024 элемента, затем выполняется добавление данных и увеличение переменной cnt.

Метод CheckDiver() мы рассмотрим чуть позже.

Определение экстремума по пороговому значению.

Класс определения по пороговому значению отличается от класса определения по барам, в первую очередь, типом переменных Cur и Pre: это тип SPseudoBuffers2, описанный в файле UniDiverDefines.mqh:

Структура SPseudoBuffers2 имеет все те же поля, что и структура SPseudoBuffers1, и еще несколько дополнительных:

  • MinMaxVal — переменная для максимального или минимального значения индикатора
  • MinMaxBar — переменная для индекса бара, на котором найдено максимальное или минимальное значение индикатора
  • Trend — переменная для направления движения индикатора. Если значение 1, значит индикатор движется вверх и отслеживается его максимальное значение. При -1 отслеживается минимальное значение.

В конструктор класса передается внешний параметр с величиной порога — переменная MinMaxThreshold. Ее значение сохраняется в переменной m_threshold, объявленной в секции private.

Метод Calculate() этого класса отличается только способом определения экстремума:

Если значение переменной Cur.Trend 1, сравнивается значение осциллятора со значением переменной Cur.MinMaxValue. Если новое значение осциллятора выше значения из переменной, то значение переменной обновляется. При этом переменной Cur.MinMaxBar присваивается индекс бара, на котором выявлен новый максимум. Тут же проверяется, не опустилось ли значение осциллятора от последнего известного максимума на величину m_threshold. Если да, значит осциллятор изменил направление. Вызывается метод AddExtremum(), данные о новом экстремуме сохраняются в массиве, значение переменной Cur.Trend меняется на противоположное, а в переменных Cur.MinMaxVal и Cur.MinMaxBar фиксируются начальные параметры нового минимума. Поскольку значение переменной Cur.Trend изменилось, с этого момента выполняется другая секция case — слежение за минимальными значениями осциллятора и за преодолением порога вверх.

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

Для Моментума это 100, для RSI и Стохастика это 50, для WPR -50, для остальных осцилляторов 0.

Сам способ определения экстремума во многом подобен способу с пороговым значением:

Единственное отличие в том, что смена направления выполняется через сравнение с серединным уровнем осциллятора: osc[i] m_level.

Способ задания типа дивергенции. Добавим во внешние параметры переменную для выбора типа распознаваемой дивергенции:

По умолчанию значение переменной 3, что в соответствии с рис. 11 означает классическую дивергенцию. Всего на рис. 11 показано 9 вариантов сочетаний движения цены и индикатора. Добавим еще один вариант — «не проверяется». Получится 10 вариантов. Таким образом, используя привычное десятичное число, можно описать любое сочетание различных движений в любом количестве (в том числе тройную дивергенцию). Получается, что однозначное число соответствует простой дивергенции (по двум вершинам/впадинам), двухзначное число — тройной и т.д. Например, число 13 будет соответствовать сочетанию, показанному на рис. 14.

Рис. 14. Сочетание движений индикатора и
цены при Number=13 для продажи

Классы для проверки условий дивергенции. Для проверки условий дивергенции будут созданы базовый и дочерние классы. На запуске индикатора будет анализироваться значение параметра Number. В первую очередь это его длина, в соответствии с которой будет изменяться размер массива указателей на классы. Затем для каждого элемента массива, в соответствии с типом условия, будет создан соответствующий объект.

Классы проверки условия располагаются в файле UniDiver/CUniDiverConditions.mqh. Базовый класс имеет имя CDiverConditionsBase, разберем его:

У класса два виртуальных метода для сравнения двух соседних вершин, в них передаются параметры этих вершин:

  • i1 — значение индикатора в точке 1
  • p1 — значение цены в точке 1
  • i2 — значение индикатора в точке 2
  • p2 — значение цены в точке 2

Точки отсчитываем справа налево, начиная с единицы.

Метод SetParameters() используем для установки дополнительных параметров сравнения: pt — допустимая разница значений цены, при которой считается, что точки цены находятся на одном уровне. it — аналогичный параметр для сравнения вершин индикатора. Значения этих параметров задаются через окно свойств:

Ниже приведен код одного из дочерних классов:

В методе для CheckBuy() проверяется, превышает ли цена точки 1 цену точки 2. Так же и с индикатором: значение в точке 1 должно превышать значение в точке 2. Метод CheckSell() зеркально симметричен методу CheckBuy(). Все остальные классы подобны и отличаются только логическими выражениями, за исключением CDiverConditions0. В нем методы CheckSell() и CheckBuy() сразу возвращают true. Он используется при отключенной проверке условий (возможен любой вариант).

Подготовка к проверке условий дивергенции. В секции protected класса CDiverBase объявлен массив и переменная для его размера:

В методе SetConditions() выполняется изменение размера массива m_conditions и создание объектов проверки условия дивергенции:

В метод передаются параметры:

  • num — внешний параметр Number;
  • pt — внешний параметр PriceLevel;
  • it — внешний параметр IndLevel.

Сначала проверяется параметр num:

Затем массив m_conditions увеличивается до максимально возможного размера (10 — длина максимального значения переменной int). Затем в цикле while, в зависимости от значения каждого из разрядов числа num, создается объект проверки условия методом CreateConditions() и устанавливаются параметры методом SetParameters(). После цикла размер массива меняется в соответствии с реальным количеством используемых условий.

Разберем метод CreateConditions():

Метод прост: в зависимости от значения параметра i, выполняется создание соответствующего объекта и возвращается ссылка на него.

Определение дивергенции. Теперь можно рассмотреть метод CheckDivergence() класса CDiverBase. Сначала приведем весь код метода, затем рассмотрим его построчно:

В метод передаются параметры:

  • i — индекс текущего обсчитываемого бара;
  • ucnt — количество используемых элементов массива m_upper[];
  • lcnt — количество используемых элементов массива m_lower[];
  • time[] — массив со временем баров;
  • high[] — массив с ценами high баров;
  • low[] — массив с ценами low баров;
  • buy[] — индикаторный буфер для стрелок на покупку;
  • sell[] — индикаторный буфер для стрелок на продажу;
  • osc[] — индикаторный буфер со значениями осциллятора.

В первую очередь очищаются буферы со стрелками:

Удаляются графические объекты, соответствующие обсчитываемому бару:

Кроме стрелок, индикатор iDivergence будет рисовать графическими объектами стрелки на графике цены и линии, соединяющие экстремумы на графике цены с вершинами/впадинами на графике осциллятора.

Затем идут два идентичных участка кода для проверки условий на продажу и на покупку. Рассмотрим первый участок для продажи. Количество доступных вершин осциллятора должно быть на 1 больше, чем количество проверяемых условий. Поэтому выполняется проверка:

Далее выполняется проверка существования вершины на обсчитываемом баре. Это определяется соответствием индекса обсчитываемого бара и индекса из массива с данными вершин/впадин:

Потребуется вспомогательная переменная для результатов проверки условий:

В цикле for проходим по всем условиям, передавая в них данные о вершинах:

Если какое-то из условий не выполняется, выходим из цикла. Переменной check присваивается значение false. Если все условия выполнены, check сохраняет значение true, при этом устанавливается стрелка и создается графический объект:

Отображение графических объектов может включаться/выключаться в окне свойств индикатора, для этого объявлены переменные:

  • ArrowsOnChart — включение стрелок из графических объектов на графике цены
  • DrawLines — включение рисования линий, соединяющих вершины и впадины цены и индикатора
  • ColBuy и ColSell — цвета графических объектов для сигналов покупки и продажи.

В секции protected класса CDiverBase объявлены соответствующие переменные:

Значения этих переменных устанавливаются в методе SetDrawParmeters():

Рассмотрим методы, работающие с графическими объектами. Удаление:

Линии, соединяющие вершины/впадины, и стрелки удаляются раздельно. Имена всех графических объектов начинаются с имени индикатора, затем добавляется время бара, на котором была выявлена дивергенция. В цикле, соответствующем количеству условий m_ccnt, выполняется дальнейшее формирование имен. Для сигналов покупки на графике цены добавляется «bp», для сигналов покупки на графике индикатора — «bi», аналогично для сигналов продажи добавляется «sp» и «ip». К концам имен добавляется индекс j. К именам стрелок добавляется «_ba» — стрелка сигнала покупки или «_sa» — стрелка сигнала продажи.

Создание графических объектов выполняется в методах DrawSellObjects() и DrawBuyObjects(), рассмотрим один из них:

Имена объектов формируются точно так же, как и при удалении, затем создаются графические объекты посредством функций fObjTrend() и fObjArrow(). Они располагаются в подключаемом файле UniDiver/UniDiverGObjects.mqh. Функции достаточно просты, нет смысла их разбирать.

Завершение индикатора. Остается применить в индикаторе созданные классы. В функции OnInit(), в зависимости от выбранного типа определения экстремумов, создаем соответствующий объект:

Один из внешних параметров — PriceLevel — измеряется в пунктах, поэтому удобно выполнять его коррекцию в зависимости от количества знаков после запятой у котировок. Для этого объявим еще одну переменную, чтоб иметь возможность отключать эту коррекцию:

Далее в функции OnInit() объявляем вспомогательную переменную для откорректированного параметра и корректируем его:

Устанавливаем параметры дивергенции и рисования:

Осталось несколько строк в функции OnCalculate(). Вызов основного метода Calculate():

В случае рисования графическими объектами необходимо ускорить их отрисовку:

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

На этом основной этап создания индикатора закончен. На рис. 15 показан график с прикрепленным на него индикатором (в подокне) с включенным отображением стрелок на графике цены и с рисованием линий между вершинами.

Рис. 15. Индикатор дивергенции на графике цены с отображением стрелок на графике цены и линий меду экстремумами

Остается добавить функцию алертов, но она очень проста и уже рассматривалась в других статьях. В приложении к статье можно найти полностью готовый индикатор с функцией алерта и вместе со всеми нужными для индикатора файлами.

Заключение

Несмотря на высочайшую универсальность индикатора, можно отметить и его недостатки. Основной недостаток — зависимость параметра IndLevel от типа используемого осциллятора, а параметра PriceLevel — от таймфрейма. Чтобы исключить эту зависимость, для этих параметров установлены значения по умолчанию 0. Но при этом практически нереально выполнение условий при некоторых сочетаниях движения цены и индикатора. Если в условие проверки дивергенции входит проверка на горизонтальное движение, ее выполнение маловероятно. При этом остаются варианты дивергенции 1, 3, 7 и 9. Это может представлять собой проблему только в тестере при оптимизации эксперта, использующего индикатор.

При правильном подходе к оптимизации это не будет проблемой, поскольку обычно оптимизация выполняется на одном символе и таймфрейме. Сначала надо определиться с используемым символом и таймфреймом и установить подходящее для них значение параметра PriceLevel. Затем нужно определиться с используемым осциллятором и установить подходящее для него значение параметра IndLevel. Не следует стремиться к автоматической оптимизации типа используемого осциллятора и значений параметров PriceLevel и IndLevel: кроме них, есть достаточно других параметров для оптимизации. В первую очередь, это тип дивергенции (переменная Number) и период осциллятора.

Файлы приложения

Для работы индикатора iDivergence необходим универсальный осциллятор из статьи «Универсальный осциллятор с графическим интерфейсом». Он и все нужные для него файлы также находятся в приложении.

Применяем индикатор дивергенции Awesome Oscillator Divergence в своих стратегиях

Знаменитый трейдер Билл Вильямс оставил огромное наследство для всех трейдеров практикующих технический анализ, а созданные им индикаторы, стали неотъемлемой частью любой профессиональной торговой платформы.

Одним из этих знаменитых инструментов является индикатор дивергенции Awesome Oscillator Divergence, который обладает широким спектром применения и позволяет находить сильные разворотные точки рынка на основе сигнала дивергенции.

Изначально Awesome Oscillator применялся, как составная часть знаменитой стратегии Profitunity, однако трейдеры начали замечать полезные свойства индикатора AO, что привело к тому, что инструмент начали включать в самые различные торговые стратегии.

Индикатор дивергенции Awesome Oscillator Divergence

Сам Б. Вильямс писал, что Awesome Oscillator настолько точен, что торговать по нему можно «даже не глядя на график» -) То есть утверждал, что Awesome Oscillator — индикатор дивергенции без перерисовки .

Однако на практике, для того чтобы выявлять этот сигнал, необходимо обладать немалым опытом и наблюдательностью!

Поэтому умелые программисты создали модифицированную версию индикатора Awesome Oscillator Divergence, который находит самостоятельно это состояние рынка и показывает визуально на графике возможные точки разворота цены.

Одним из самых сильных сигналов который дает индикатор – это дивергенция. И, основываясь на этой аномалии, индикатор АО выдает еще массу полезных для трейдера сигналов!

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

Или дополнять его сигналами чужие, по которым уже торгуете.

Установка Awesome Oscillator

Для того чтобы применить индикатор вам потребуется скачать файл индикатора по этой ссылке, а затем установить его в ваш торговый терминал МТ4.

Процесс установки довольно простой, а именно найдите папку под названием Indicators в каталоге данных торгового терминала МТ4 и сбросьте в нее скачанный файл. Если у вас возникли какие либо трудности с установкой, рекомендую прочитать детальную инструкцию по установке индикаторов в торговый терминал МТ4, тут.

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

Индикатор, на графике, выглядит так:

Варианты применения индикатора Awesome Oscillator. Сигналы

Индикатор дивергенции для бинарных опционов Awesome Oscillator Divergence является мультизадачным индикатором и может применяться на любой валютной паре и таймфрейме.

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

Итак, давайте более детально рассмотрим варианты применения инструмента.

Сигнал дивергенции

Как уже отмечалось, основная цель модификации индикатора – поиск дивергенции на графике.

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

Итак, сигналы на вход в рынок можно понимать:

  1. Покупка опциона на повышение: когда появляется стрелка вверх;
  2. Покупка опциона на понижение: в случае появления стрелки вниз.

Глобальное изменение тренда

Индикатор дивергенции Awesome Oscillator представляет собой гистограмму, которая разделена на две части центральной, нулевой, линией.

Так, если гистограмма находится над 0.00 – на рынке восходящий тренд, а если под ней – на рынке глобальный нисходящий тренд.

Из-за разделения тренда на две глобальные части возникает сильный сигнал на его изменение.

Так, если гистограмма АО пересекает уровень 0:

  • Снизу вверх – покупаем опцион на повышение;
  • Сверху вниз – покупаем опцион на понижение.

Вход на откате или паттерн «Блюдце»

Как вы могли заметить, столбики гистограммы окрашиваются в зеленый и красный цвет.

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

Итак, входим в рынок:

  1. На повышение — в случае если гистограмма, находящаяся над уровнем ноль сменила цвет с красного на зелёный.
  2. На понижение следует покупать опцион, в случае, если находящаяся под уровнем 0 гистограмма, сменила цвет с зеленого на красный.

Как правило, входить в сделку следует при втором появившемся столбике необходимого цвета.

В заключение стоит отметить, что индикатор Awesome Oscillator Divergence является отличным помощником в поисках дивергенции для любого трейдера, в независимости, каким вы опытом обладаете.

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

Тем не менее, стоит понимать, что несмотря на уверенность Б. Вильямса, индикатор дивергенции для бинарных опционов Awesome Oscillator Divergence, является в первую очередь помощником в трейдинге !

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

Понравилась статья? Расскажи друзьям!

Индикаторы дивергенции на Форекс – контроль несоответствий

Узнайте всё о расхождении графиков Форекс и способах заработка на этом! Изучите наиболее надёжные индикаторы для отслеживания дивергенции на рынке! В данном материале мы поговорим о таком явлении, как дивергенция, её видах, и способах отслеживания. Кроме того, мы рассмотрим несколько наиболее эффективных индикаторов, созданных, чтобы анализировать графики и обнаруживать несоответствия.

Индикаторы дивергенции – заработайте на расхождении в графиках

Дивергенцией называют ситуацию, когда показания используемого торгово-анализирующего инструмента и графика стоимости имеют значительные расхождения.

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

Формирование дивергенции — явный признак того, что текущий курс значительно слабеет, что может спровоцировать реверс существующей на бирже тенденции. В комплексе с грамотно составленной торговой стратегией инструменты отслеживания этого явления способны предоставить высокоинформативные данные для последующего анализа и составления прогнозов. Кроме того, контроль в случае формирования подобных графиков позволит участникам глубже понять принципы работы некоторых элементов рынка, что будет особенно актуально для не слишком опытных участников рынка.

Классификация

Для регистрации и отслеживания подобного явления трейдеры пользуются различными инструментами — от индикаторов и осцилляторов до паттернов. Хотя самыми эффективными, как на тестах, так и в условиях реальной торговли, себя показали MACD, осциллятор Stochastic, RSI и CCI.

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

Классическая дивергенция

Чаще всего возникает при реверсном либо коррекционном движении текущей тенденции.

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

Скрытая дивергенция

Обычно формирование этого типа дивергенции является одним из основных признаков продолжения текущей тенденции. Давайте рассмотрим пару примеров.

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

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

Расширенная дивергенция

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

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

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

Далее мы рассмотрим несколько наиболее эффективных и популярных инструментов для определения и отслеживания расхождений в рабочих схемах на бирже Форекс.

MACD Histogram

Гистограмма MACD — это модифицированная версия классического МАКДи, которая на сегодняшний день является одним из наиболее мощных инструментов для регистрации явления дивергенции. Данная версия осциллятора из стандартного набора терминала для торговли на бирже MetaTrader 4 состоит из графика кривой MACD, сигнальную кривую, а также гистограмму, отвечающую за мониторинг поведения графиков и обнаружения расхождений, которые были описаны выше. Histogram предоставляет инвестору возможность без проблем находить все три вида дивергенции, известных на сегодняшний день — классическая, скрытая и расширенная.
Этот торговый инструмент хорош тем, что допускает достаточно тонкую настройку множества параметров, а также включает в себя систему извещений о возникновении несоответствий.

CCI Divergence M5M15

Это ещё один из мощнейших инструментов для работы с рынком Форекс путём отслеживания расхождений на графиках, основой для которого послужила стандартная версия Commodity Channel Index. Основной особенностью данного инструмента является то, что он адаптирован специально для работы на минутных временных интервалах M5 и M15.

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

Как утверждают исследователи рынка и профессиональные трейдеры, пользующиеся данной версией, CCI Divergence особенно хорошо показывает себя при использовании в ходе торгов внутри дня, а грамотное конфигурирование параметров инструмента позволит использовать его и на более крупных таймфреймах.

Relative Strength Index

Индекс относительной силы или RSI, как он более известен, был создан как раз для анализа возникающих дивергенций. Формула расчёта этого инструмента следующая: RSI=100-(100/(1+P/O)), где P/O — это среднее значение временных интервалов с возрастающей/снижающейся стоимостью.

По умолчанию для Relative Strength Index используется период, равный тринадцати, временной интервал же может быть любым, но по результатам тестов он чуть хуже работает на кратких таймфреймах вроде одной либо пяти минут.

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

Stochastic Divergence

Стохастик — это инструмент технического анализа, главной функцией которого является мониторинг позиций существующего курса по отношению к общему разбросу котировок в течение определённого интервала времени; имеет три важных опции:

  • Быстрая кривая для кратких интервалов (8);
  • Медленная кривая для старших периодов (3);
  • Замедление (3).

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

Лучшие результаты Stochastic демонстрировал при торгах внутри дня на часовых и четырёхчасовых временных интервалах (H1, H4). Но рекомендуем выставлять достаточно жёсткие значения для Stop-Loss.

Заключение

На самом деле достаточно проблематично сделать однозначный вывод — какой индикатор лучше всех подойдёт для определения дивергенции. Хотя бы потому, что использовать только один инструмент почти всегда нецелесообразно, какой бы сферы это не касалось. Выше приведены далеко не все существующие способы регистрации расхождений, но это, пожалуй, самые эффективные, проверенные временем инструменты. При грамотном их сочетании с продуманной торговой системой можно добиться по-настоящему высоких результатов при торговле на бирже Forex.

Список надежных брокеров бинарных опционов на русском языке:
  • Бинариум
    Бинариум

    1 место! Лидер на рынке — самый честный брокер бинарных опционов!
    Идеально для новичков — предоставляется бесплатное онлайн-обучение и демо-счет!
    Получите бонус за регистрацию по ссылке:

  • Биномо
    Биномо

    2 место!

Добавить комментарий