Размер
Способ построения уровней сопротивления и поддержки средствами MQL5
Play

Способ построения уровней сопротивления и поддержки средствами MQL5

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

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

Таким образом, можно предположить, что точки максимума формируются, когда валюта перекуплена, а точки минимума — когда перепродана. Именно поэтому для построения линий сопротивления и поддержки я использую такой стандартный индикатор из набора MetaTrader, как Relative Strength Index (RSI), разработанный и опубликованный Дж. Уилдером в 1978 году. Данный индикатор определяет зоны перекупленности и перепроданности валюты.

Я использую индикатор RSI с периодом 8; данное значение не есть результат моих наблюдений — этот порядок RSI рекомендовал Эрик Л. Найман в книге под названием "Малая энциклопедия трейдера" для всех периодов графика за исключением дневного и больших. Меня полностью устраивает результат работы моего индикатора при работе с RSI(8).

Существует два расхожих мнения о том, стоит ли при поиске максимальных и минимальных цен учитывать "тени" свечей (цены High и Low). Я их учитываю и при поиске точек-экстремумов сравниваю именно High и Low цены. Если вы не захотите принимать их во внимание, то можете просто внести незначительные изменения в представленный ниже код индикатора.

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

Рис.1. Сигнал на покупку

Я считаю второй способ неэффективным, особенно если факт "отскока" цены от одной из линий играет основополагающую роль в принятии торговых решений. На рисунке №1 показан как раз тот случай, когда цена после "отскока" от линии сопротивления не достигает линии поддержки, разворачивается и "пробивает" линию сопротивления, данная ситуация делает сигнал на покупку более сильным. Анализируя углы наклона линий к оси времени, мы определяем общее направление тренда, а когда цена финансового инструмента пересекает одну из линий, то данный факт позволяет сделать вывод об усилении существующего тренда или его развороте. Зачастую перед тем как пересечь, например, линию поддержки, цена доходит только до середины линии сопротивления (данный фактор усиливает торговый сигнал).

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

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

Рис.2. Замедление бычьего тренда

Рис.3. Замедление медвежьего тренда

Замедление трендов говорит о возможном скором их развороте.

Цель написания статьи

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

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

Кратко о ранее представленных способах построения уровней сопротивления и поддержки

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

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

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

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

Принцип нахождения экстремумов

Определение максимальных и минимальных цен на заданном промежутке времени не представляет никакой сложности. Здесь важно правильно выбрать анализируемый отрезок графика (промежуток времени), который постоянно изменяется и потому не может быть задан вручную. Для нахождения этого участка валютного графика я буду использовать индикатор Relative Strength Index (RSI), входящий в стандартный набор индикаторов терминала MetaTrader 5.

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

В качестве уровня перепроданности я буду принимать значение индикатора RSI, равное 35; перекупленности — 65 (нижний и верхний уровни равноудалены от середины RSI = 50). Период индикатора RSI равен 8.

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

Рис.4. Зоны поиска баров-экстремумов

На рисунке, приведенном выше, цифрами 1, 2, 3 и 4 я обозначил зоны поиска баров-экстремумов: первого, второго, третьего и четвертого соответственно. Поскольку прежде чем пересечь нижнюю границу (RSI = 35), индикатор RSI, начиная с текущего бара, входит в зону перекупленности (RSI >= 65) трижды, то и отрезков времени, на которых осуществляется поиск первого экстремума, будет три. Далее по порядку определяются зоны для поиска последующих трех баров.

В 1 и 3 зонах я буду искать бары с наибольшими ценами, во 2 и 4 зонах — с наименьшими. В результате мы получим 4 точки-экстремума — если соединить их лучами, то мы получим восходящий канал цен.

Рис.5. Восходящий канал

Если вы обратили внимание, то наверняка заметили, что баров для поиска минимумов было немного, всего 4 (2 для каждой зоны). По причине преобладания восходящего тренда индикатор RSI едва касался минимального уровня, в то время как за границей уровня RSI = 65 индикатор находился практически столько же времени, сколько и в канале 35 < RSI < 65. Поэтому индикатор, код которого я представил в этой статье, для нахождения точек №2 и 4 будет использовать уровень RSI, смещенный ближе к середине (к 50). Будет это верхний или нижний уровень RSI, зависит от того, каким был первый экстремум (минимальным или максимальным).

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

Функция для нахождения бара-экстремума с наименьшим индексом (первого бара) Ext_1

Функция для нахождения баров-экстремумов, которую я назвал "Ext_1", имеет следующие входные параметры:

Первые два входных параметра функции — это параметры самого индикатора RSI. Они не играют никакой роли при расчете линии индикатора и используются в нем только для удобства визуальной оценки значения индикаторной линии (ее расположения относительно данных уровней). Я использую эти уровни для определения интервалов цен, среди которых буду искать минимальные и максимальные значения. Параметры "low" и "high" получают значения соответствующих внешних переменных, заданных в коде индикатора на глобальном уровне:

Входной параметр "bars" определяет количество элементов, копируемых в массивы, содержащие цены "Low" и "High" баров, а также значения индикатора RSI:

Массивы m_rsi[],m_high[] и m_low[] имеют обратный порядок индексации:

Как я уже говорил, при преобладании бычьего тренда линия индикатора RSI, имеющая диапазон значений от 0 до 100, большую часть времени будет иметь значение от > 50. В моменты, когда формируется точка минимума, значение RSI будет менее удаленным от середины (50), нежели при формировании точки максимума. Поэтому при первом пересечении одного из уровней индикатора (low или high) другой уровень нужно сместить ближе к середине. Величину смещения определяет входной параметр "distans", которому передается значение соответствующей внешней переменной:

Входной параметр "h_rsi" функции "Ext_1" получает значение хэндла индикатора RSI, полученного при инициализации индикатора с помощью функции iRSI():

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

После того как мы создали и заполнили массивы, содержащие цены low и high баров, а также соответствующее этим барам значение индикатора RSI, можно приступать собственно к поиску первого экстремума. Для того чтобы определить, где будет находиться первый экстремум (на линии поддержки или сопротивления) и в нужный момент остановить анализ баров, потребуются две переменные типа bool:

Значение ext_max = true разрешает производить поиск максимального экстремума, значение ext_min = true, соответственно, разрешает производить поиск минимального экстремума. То есть при первом пересечении линии индикатора RSI одного из уровней (low или high) значение одной из переменных типа bool меняется на false, а пересечение уровня RSI, анализ баров которого запрещен, означает, что необходимое количество баров проанализировано, и первый экстремум уже найден.

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

Рис.6. Запрет анализа на неполном диапазоне цен

Для реализации такого алгоритма работы потребуется создание еще одной переменной типа bool:

Для определения максимальных и минимальных цен среди анализируемых баров нужно дополнительно создать следующие переменные типа double:

Весь цикл для поиска бара с первым экстремумом примет вид:

Общая функция для нахождения всех последующих экстремумов Ext_2

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

  1. Параметр, содержащий ссылку на структуру, в которой будут храниться индексы баров-экстремумов. Необходим для определения индекса бара, с которого будет начинаться поиск экстремума.
  2. Порядковый номер бара-экстремума, который требуется найти (принимает значения от 2 до 4). Нужен для того, чтобы, собственно, выбрать из структуры индекс нужного бара, а также определить, на какой линии (сопротивления или поддержки) будет лежать искомый экстремум.
  3. Параметр типа bool, определяющий, на какой линии (сопротивления или поддержки) лежит первый бар-экстремум. Не зная этого, нельзя по порядковому номеру определить, на какой линии должен лежать искомый бар.

На глобальном уровне создаем переменную типа структуры, которая будет содержать индексы всех 4 баров-экстремумов:

Для определения линии индикатора, на которой будет лежать искомый экстремум, нужно предварительно создать две переменные типа bool:

Если порядковый номер искомого бара-экстремума равен 2 или 4, а первый бар-экстремум лежит на линии поддержки, то искомый бар должен лежать на линии сопротивления и, соответственно, анализировать нужно бары, значение RSI на которых больше либо равно верхнему уровню (параметр high). Если порядковый номер искомого бара-экстремума равен 3, а первый бар-экстремум лежит на линии поддержки, то искомый бар также должен лежать на этой линии. Если первый бар-экстремум лежит на линии сопротивления, то положение искомого бара определяем по аналогии.

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

Значение данной переменной меняем на true, когда в истории находим нужный диапазон баров для анализа. Анализ баров прекращается, если _start = true, и при low_level = true индикаторная линия RSI пересекает уровень high, а при high_level = true индикаторная линия RSI пересекает уровень low.

Цикл для поиска бара-экстремума примет вид:

Переменная bar_1 содержит индекс предыдущего бара-экстремума, который вычисляется с помощью оператора switch:

Чтобы узнать на какой линии индикатора (сопротивления или поддержки) лежит первый бар-экстремум, достаточно получить его индекс и значение индикатора RSI на баре с полученным индексом:

Обработка полученных результатов

Теперь мы знаем индексы всех четырех баров и цены (low или high) которые им соответствуют. Для того чтобы заполнить массивы, которые будут соответствовать значением индикаторных линий на каждом баре, нужно получить уравнения двух прямых, соответствующих линиям сопротивления и поддержки. Всем известное уравнение прямой имеет вид: y = kx + b. В нашем случае "x" — индекс бара, "y" — цена (для линии поддержки цена low свечи, для линии сопротивления — high).

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

это глобальные переменные "K" и "B", которые соответствуют значениям коэффициентов "k" и "b" уравнения прямой;

это индексы баров, расположенных на одной линии;

это цены low соответствующих баров, если нужно определить "K" и "B" для линии поддержки, либо цены high соответствующих баров, если нужно определить "K" и "B" для линии сопротивления.

Функция, представленная ниже, задает значения глобальных переменных "K" и "B" для линии поддержки, если параметр "_line" равен false, и для линии сопротивления, если параметр "_line" равен true:

Уравнение прямой имеет вид: y = kx + b, в качестве значений оси "y" используется цена финансового инструмента, в качестве значений оси "x" — индекс бара. Если использовать в качестве значений оси "x" количество секунд, прошедших с 1 января 1970 года, то в районе выходных дней график прямой будет "скакать", поэтому я использовал индексы баров.

Из функции "OnCalculate" функция "Level" вызывается дважды: первый раз перед тем, как заполнить массив для линии сопротивления, второй раз для заполнения массива со значениями цен для линии поддержки:

Пример индикатора, отображающего уровни сопротивления и поддержки

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

Рис.7. Результат работы индикатора

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

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

Заключение

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

📎📎📎📎📎📎📎📎📎📎