
Разработка торговой системы на основе индикатора Gator Oscillator
Введение
Для детального изучения индикатора мы разобъем работу на несколько подразделов:
- Определение индикатора Gator Oscillator
- Стратегия по индикатору Gator Oscillator
- Схемы торговых стратегий по индикатору Gator Oscillator
- Торговые системы по Gator Oscillator
- Заключение
Для написания кодов в этой статье мы будем использовать язык программирования MQL5 (MetaQuotes Language), встроенный в торговую платформу MetaTrader 5, а также саму платформу для тестирования полученных стратегий. Если вы не знаете, как загрузить или использовать MetaTrader 5 и среду разработки MQL5, почитайте раздел "Как написать MQL5-код в редакторе MetaEditor" в одной из предыдущих статьей — там все подробно описано.
Внимание, все стратегии, о которых мы будем говорить в этой статье, нуждаются в тщательном тестировании и проработке. Если вы захотите далее использовать какую-либо стратегию, обязательно протестируйте ее, чтобы убедиться, что она подходит именно вам. Ведь не существует универсальных вещей, подходящих абсолютно всем. В любом случае, основная цель данной статьи — образовательная, то есть мы только изучаем суть индикатора. Также хочу порекомендовать всем самостоятельно пробовать писать все коды из этой статьи, ведь именно практика развивает навыки программирования.
Внимание! Все содержание настоящей статьи предоставляется "как есть", предназначено только для целей обучения и не является торговой рекомендацией. Статья не несет в себе каких-либо гарантий результатов. Все, что вы применяете на практике на основе этой статьи, вы делаете исключительно на свой страх и риск, автор не гарантирует никаких результатов.
Определение индикатора Gator Oscillator
В этом разделе подробно рассмотрим индикатор Gator Oscillator, чтобы понять концепцию, лежащую в его основе, и научиться правильно и эффективно его использовать. Индикатор Gator Oscillator разработал Билл Вильямс. Он должен определять, находится ли рынок в тренде или движется в неком боковом диапазоне, и если он в тренде, как долго этот тренд может продлится с точки зрения импульса. Эту информацию следует использовать для определения времени входа и выхода из сделки. Как все мы понимаем, эти две вещи очень важны в торговле. Gator Oscillator создан на основе индикатора Alligator, о котором мы уже подробно разговаривали в моей предыдущей статье Разработка торговой системы на основе индикатора Alligator.
Расчет индикатора Gator основан на схождении и расхождении балансовые линии Аллигатора. Ниже приведен расчет индикатора Gator:
- Шаг первый: рассчитываем медианную цену
Median Price = (High + Low) /2
- Шаг второй: вычисляем Челюсти (Jaw), Зубы (Teeth) и Губы (Lips) Аллигатора
Alligator Jaw = SMMA (Median Price, 13,8)
Alligator Teeth = SMMA (Median Price, 8, 5)
Alligator Lips = SMMA (Median Price, 5, 3)
- где:
Median Price — тип цены, используемой для расчетов (медианная)
High — максимальное значение цены
Low — минимальное значение цены
SMMA — сглаженное скользящее среднее, которое находит скользящее среднее цены с указанным сглаживанием и возможным сдвигом. Если у нас средняя SMMA (Median Price, 13, 5), это означае, что мы получили сглаженную скользящую среднюю от медианных цен с периодом сглаживания 13 и сдвигом в будущее равным 5.
Alligator Jaws — линия челюстей индикатора, отображается синим цветом
Alligator Teeth — линия зубов Аллигатора, красного цвета
Alligator Lips — линия губ Аллигатора, отображается зеленым
Используя все эти данные, можно вручную рассчитать значение индикатора Gator. Однако фактически вручную считать его не нужно, поскольку уже есть готовый к использованию индикатор в торговом терминале MetaTrader 5, и все, что нужно сделать, это выбрать его из списка.
Открываем торговый терминал MetaTrader 5, выбираем на меню "Вставка" --> Индикаторы --> Bill Williams --> Gator Oscillator
После выбора Gator Oscillator откроется окно параметров Gator как показано на рисунке ниже:
На предыдущем рисунке показано окно с настройками индикатора Gator Oscillator, в котором можно установить следующие параметры:
- Период линии челюстей
- Горизонтальный сдвиг линии челюстей
- Период расчета линии зубов
- Горизонтальный сдвиг линии зубов
- Период расчета линии губ
- Горизонтальный сдвиг линии губ
- Метод усреднения
- Тип цены, используемой для расчета индикатора Gator Oscillator.
- Цвет для показателей вверх
- Цвет для показателей вниз
- Толщина баров индикатора Gator.
Выбираем подходящие параметры индикатора, нажимаем кнопку OK, и индикатор запустится на графике, как показано ниже:
Как можно видеть на предыдущем графике, в нижней части появилось дополнительное окно индикатора, в котором значения осциллятора Gator отображены выше и ниже уровня нуля. Состоит индикатор из зеленых и красных баров, которые отображают соотношение между каждым текущим баром и предыдущим. Если текущий бар больше, чем предыдущий, цвет будет зеленым, если же он меньше предыдущего, текущий бар будет красным.
Стратегия по индикатору Gator Oscillator
В этом разделе мы рассмотрим несколько простых стратегий, основанных на показателях индикатора Gator Oscillator. Еще раз уточню, что мы их рассматриваем только в учебных целях. Очень важно тщательно тестировать и оптимизировать стратегии, прежде чем применять их для торговли.
Данная стратегия будет определять статус Gator на основе баров индикатора. В зависимости от цветов баров, Gator может иметь четыре статуса. Если оба бара с разных сторон нулевой линии красного цвета, аллигатор спит (спящая фаза индикатора Gator). Если оба бара по разные стороны от нулевой линии зеленые, аллигатор ест. Если цвета баров меняются с красного на зеленые, аллигатор просыпается. Если бар меняет цвет с зеленого на красный, аллигатор насыщается.
Таким образом имеем следующее:
Оба бара красные ==> Фаза сна
Оба бара зеленые ==> фаза еды
Бары сначала красные, затем становятся зелеными ==> фаза пробуждения
Бары были зеленые, становятся красными ==> фаза насыщения
Эта стратегия будет генерировать сигналы на основе показателей индикатора. Если аллигатор находится в фазе пробуждения, мы получим сигнал о нахождении хорошего входа. Если индикатор в фазе еды, стратегия будет генерировать сигнал на удержание текущей позиции. Если индикатор Gator находится в фазе насыщения, нужно найти хороший выход. При иных ситуациях не делаем ничего.
Если рассмотреть схематично:
Индикатор Gator в фазе пробуждения ==> Возможности входа
Индикатор Gator в фазе еды ==> Удержание текущей позиции
Индикатор Gator в фазе насыщения ==> Ищем выход
Если индикатор в любом другом состоянии ==> Не делаем ничего
Для этой стратегии мы объединим сигнал от индикатора Gator с сигналом скользящей средней. Если оба бара зеленые, а цена закрытия выше значения скользящей средней, это будет сигналом для возможного открытия сделки на покупку. В противоположном случае, если обе бара индикатора Gator красные, а цена закрытия ниже значения скользящей средней, это будет рассматриваться как возможность для продажи. При любых других показателях не делаем ничего.
Если рассмотреть схематично:
Два зеленых бара и цена закрытия > скользящей средней ==> возможность позиции на покупку
Два красных бара и цена закрытия < скользящей средней ==> возможность позиции на продажу
Другие сигналы ==> не делать ничего
Схемы торговых стратегий по индикатору Gator Oscillator
В этой части мы создадим пошаговые схемы для этих рассмотренных стратегий. На следующем этапе они помогут эффективно и легко создать торговые системы. Я считаю, что этот шаг очень важен и необходим для разработки торговой системы, поскольку он сэкономит много времени: потратив немного времени на создание таких схем, мы экономим время дальше, последовательно создавая все необходимые шаги, не пропуская и не повторяя их. Нужно четко определить, что должен делать компьютер, чтобы шаг за шагом воплотить наши идеи.
На основе этой стратегии создадим программу-советник, который будем использовать для автоматической проверки значений индикатора Gator на каждом тике. Программа будет определять два состояния: когда значения последовательно растут и когда значения последовательно понижаются. Советник проводит эту проверку и определяет положение значений, сравнивая их между собой. Сначала сравнивает верхние значения — текущее и предыдущее значение Gator и определяет, которое из них выше. Затем сравнивает нижние значения текущего и предыдущего бара, и определяет, какое из этих двух значений больше. Результатом такого сравнения и будут ожидаемые сигналы для определения статуса индикатора Gator.
Если текущее значение сверху меньше предыдущего, а текущее значение снизу выше предыдущего, советник или торговая система должны вернуть сигнал о спящей фазе в виде комментария к графике. Во втором варианте, если текущее значение сверху выше предыдущего, а текущее значение внизу ниже предыдущего, советник должен вернуть сигнал о фазе еды в индикаторе в виде комментария на графике. В третьем варианте, если первое предыдущее значение верху меньше второго предыдущего и первое предыдущее значение снизу выше второго предыдущего и при этом текущее значение сверху выше первого предыдущего и текущее значение снизу меньше, чем первое предыдущее, нужно, чтобы торговая система выводила на график комментарий с сигналом фазы пробуждения. В четвертом и последнем состоянии, если первое предыдущее значение сверху выше второго и первое предыдущее значение снизу ниже второго предыдущего, и в то же время текущее значение сверху ниже первого предыдущего и текущее значение снизу выше первого предыдущего, система должна вывести на график комментарий с сигналом фазы насыщения.
Ниже приведена схема работа такой торговой системы:
Стратегия вторая — сигналы от Gator
По этой стратегии мы создадим торговую систему, которую можно использовать для генерации сигналов на возможный вход, выход или удержание позиции. Для этого программам будет постоянно проверять значения трех последовательных баров сверху и снизу для определения текущей фазы самого индикатора Gator.
Первый сигнал будем получать в виде комментария на графике о возможности входа в позицию, когда советник определит, что аллигатор находится в фазе пробуждения.
Второй тип сигнала будем получать в виде комментария на графике о возможности удержания позиции, когда советник определит, что аллигатор находится в фазе еды.
Третий тип сигнала о хорошей возможности выхода из позиции будем получать, когда советник определит, что аллигатор находится в фазе насыщения.
В любой другой ситуации, кроме трех предыдущих, не нужно совершать никаких дейтсвий. Пошаговая схема для разработки торговой системы по этой стратегии:
Стратегия третья: Gator с MA
По этой стратегии мы будем получать сигналы о возможности совершения сделки на покупку или на продажу на основе фазы индикатора Gator и положения цены закрытия относительно скользящей средней.
Первый сигнал о возможности входа в позицию на покупку будем получать, когда советник определит, что текущее значение вверх индикатора больше первого предыдущее, а первое предыдущее больше второго предыдущего, и при этом текущее значение вниз ниже первого предыдущего, а первое предыдущее ниже второго предыдущего — при такой формации бары будут зелеными. Цена закрытия должна быть выше значения скользящей средней.
Второй сигнал о возможности входа в позицию на продажу будем получать, когда советник определит, что текущее значение вверх индикатора ниже первого предыдущее, а первое предыдущее ниже второго предыдущего, и при этом вверх текущее значение вниз выше первого предыдущего, а первое предыдущее выше второго предыдущего — при такой формации бары будут красными. При этом цена закрытия должна быть ниже значения скользящей средней.
Если же образовалась какая-либо иная ситуация, никаких сигналов не будет. Пошаговая схема для разработки торговой системы по этой стратегии:
Торговые системы по Gator Oscillator
Итак, мы подошли к самой интересной части статьи, в которой будем создавать торговые системы по рассмотренным выше стратегиям. Цель таких автоматических торговых систем — помощь в трейдинге. Для начала напишем простую программу, которая послужит основой для всех других систем.
Такая простая программа по осциллятору Gator будет возвращать текущие значения индикатора в виде комментария на графике. Рассмотрим по шагам, как написать код такой программы.
Создаем массивы upGator и downGator, используя функцию double. Double — это один вещественный тип, число с плавающей запятой, то есть значение с дробной частью.
double upGatorArray[]; double downGatorArray[];
Устанавливаем сортировку данных в массивах с помощью функции ArraySetAsSeries. Параметры функции:
ArraySetAsSeries(upGatorArray,true); ArraySetAsSeries(downGatorArray,true);
Создаем переменную типа integer gatorDef, определяем осциллятор Gator с помощью функции iGator. Функция возвращает хендл индикатора. Параметры функции:
- symbol — имя символа; у нас это _SYMBOL, то есть рассчитываем индикатор по символу текущего графика.
- period — таймфрейм для расчета; используемое значение _PERIOD означает, что индикатор будет рассчитываться на текущем таймфрейме.
- jaw_period — период усреднения для расчета линии челюсти, мы используем 13.
- jaw_shift — горизонтальный сдвиг линии челюстей при необходимости. Мы установим значение 8.
- teeth_period — период расчета линии зубов. Мы установим значение 8.
- teeth_shift — горизонтальный сдвиг линии зубов при необходимости. Мы установим значение 5.
- lips_period — период расчета линии губ. Мы установим значение 5.
- lips_shift — установим горизонтальный сдвиг для линии губ, у нас это 3.
- ma_method — метод сглаживания скользящей средней. Используем MODE_SMMA.
- applied_price — тип цены, используемой в расчетах. Установим значение PRICE_MEDIAN.
int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
Определяем данные и сохранение результатов с помощью функции CopyBuffer для upGatorArray и downGatorArray. Параметры функции:
- indicator_handle — хендл индикатора, gatorDef
- buffer_num — номер индикаторного буфера, установим 0 для upGator и 2 для downGator.
- start_pos — установим позицию начала расчета, укажем 0
- count — количество данных для копирования, укажем 3
- buffer[] — определяем ценовой массив для копирования, у нас это upGatorArray, downGatorArray.
CopyBuffer(gatorDef,0,0,3,upGatorArray); CopyBuffer(gatorDef,2,0,3,downGatorArray);
Получаем значения upGator и downGator в созданные для них переменных типа double. Затем используем функцию NormalizeDouble для округления.
- value — upGatorArray[0] текущее значение.
- digits — количество знаков после запятой, 6.
double gatorUpValue=NormalizeDouble(upGatorArray[0],6); double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
Используем функцию Comment для вывода текущих значений upGator and downGator.
Comment("gatorUpValue = ",gatorUpValue,"\n", "gatorDownValue = ",gatorDownValue);
Ниже приведен полный код для создания такой стратегии:
//+------------------------------------------------------------------+ //| Simple Gator Oscillator System.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double upGatorArray[]; double downGatorArray[]; ArraySetAsSeries(upGatorArray,true); ArraySetAsSeries(downGatorArray,true); int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); CopyBuffer(gatorDef,0,0,3,upGatorArray); CopyBuffer(gatorDef,2,0,3,downGatorArray); double gatorUpValue=NormalizeDouble(upGatorArray[0],6); double gatorDownValue=NormalizeDouble(downGatorArray[0],6); Comment("gatorUpValue = ",gatorUpValue,"\n", "gatorDownValue = ",gatorDownValue); } //+------------------------------------------------------------------+
После написания этого кода его нужно скомпилировать. При компиляции нужно убедиться, что нет ошибок и предупреждений. После этого скомпилированная программа должна появиться в Навигаторе в торговом терминале:
Запускаем двойным кликом на файле или перетаскиваем на график. После этого появится окно советника:
Разрешаем автоматическую торговлю (Allow Algo Trading), нажимаем ОК, и программа запустится на графике, как показано ниже:
Теперь мы готовы получать сигналы по этой стратегии. Примеры тестовых сигналов показаны ниже.
Стратегия первая — Gator Status
Ниже показан полный код торговой системы на основе этой стратегии:
//+------------------------------------------------------------------+ //| Gator Status Identifier.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double upGatorArray[]; double downGatorArray[]; ArraySetAsSeries(upGatorArray,true); ArraySetAsSeries(downGatorArray,true); int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); CopyBuffer(gatorDef,0,0,5,upGatorArray); CopyBuffer(gatorDef,2,0,5,downGatorArray); double gatorUpValue=NormalizeDouble(upGatorArray[0],6); double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6); double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6); double gatorDownValue=NormalizeDouble(downGatorArray[0],6); double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6); double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6); if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1) { Comment("Sleeping Phase"); } else if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1) { Comment("Eating Phase"); } if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&& gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1) { Comment("Awakening Phase"); } else if( gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&& gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1) { Comment("Sated Phase"); } } //+------------------------------------------------------------------+
Отличия в этом коде:
Определение и получение трех последних значений upGator
double gatorUpValue=NormalizeDouble(upGatorArray[0],6); double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6); double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
Определение и получение трех последних значений downGator
double gatorDownValue=NormalizeDouble(downGatorArray[0],6); double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6); double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
Условия стратегии:
Условия для определения фазы сна
if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1) { Comment("Sleeping Phase"); }
Условия для определения фазы еды
else if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1) { Comment("Eating Phase"); }
Условия для определения фазы пробуждения
if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&& gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1) { Comment("Awakening Phase"); }
Условия для определения фазы насыщения
else if( gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&& gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1) { Comment("Sated Phase"); }
После компиляции кода и запуска программы из Навигатора советник начнет работать на графике:
Как видите, в правом верхнем углу графика появилась индикация, что на графике работает советник Gator Status Identifier.
Сигналы от советника выводятся в следующем виде (примеры получены при тестировании).
Аллигатор в фазе сна:
В верхнем левом углу графика отображается комментарий о том, что индикатор находится в фазе сна.
Аллигатор ест:
В верхнем левом углу графика отображается комментарий с информацией о том, что индикатор находится в фазе еды:
Индикатор Gator в фазе пробуждения:
На графике отображается сигнал о фазе пробуждения от стратегии Gator Status Identifier.
Индикатор Gator в фазе насыщения:
Комментарий на графике показывает фазу насыщения.
Полный код торговой системы, работающей по этой стратегии, выглядит так.
//+------------------------------------------------------------------+ //| Gator signals.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double upGatorArray[]; double downGatorArray[]; ArraySetAsSeries(upGatorArray,true); ArraySetAsSeries(downGatorArray,true); int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); CopyBuffer(gatorDef,0,0,3,upGatorArray); CopyBuffer(gatorDef,2,0,3,downGatorArray); double gatorUpValue=NormalizeDouble(upGatorArray[0],6); double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6); double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6); double gatorDownValue=NormalizeDouble(downGatorArray[0],6); double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6); double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6); bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&& gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1; bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1; bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&& gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1; if(awakeningPhase) { Comment("Find a good entry"); } else if(eatingPhase) { Comment("Hold current position"); } else if(satedPhase) { Comment("Find a good exit"); } else Comment(""); } //+------------------------------------------------------------------+
Что изменилось в коде по сравнению с предыдущим:
Создаем логическую переменную для трех возможных фаз аллигатора: awakeningPhase, eatingPhase, and satedPhase;
bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&& gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1; bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1; bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&& gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;
Условия стратегии:
В случае фазы пробуждения
if(awakeningPhase) { Comment("Find a good entry"); }
Когда аллигатор ест
else if(eatingPhase) { Comment("Hold current position"); }
Индикатор в фазе насыщения
else if(satedPhase) { Comment("Find a good exit"); }
В остальных случаях
else Comment("");
После компиляции кода и запуска программы из окна Навигатора советник начнет работать на графике:
Как видите, в правом верхнем углу графика появилась индикация того, что на графике работает советник.
Значит, советник может генерировать сигналы по этой стратегии. Примеры тестовых сигналов показаны ниже.
В случае фазы пробуждения
На графике выше в верхнем левом углу отображается комментарий на вход "Find a good entry".
Когда аллигатор ест
На графике выше в верхнем левом углу отображается комментарий на удержание позиции "Hold current position".
Индикатор в фазе насыщения
На графике выше в верхнем левом углу отображается комментарий на выход из позиции "Find a good exit".
Стратегия третья: Gator с MA
Полный код торговой системы, работающей по этой стратегии, выглядит так:
//+------------------------------------------------------------------+ //| Gator with MA strategy.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double upGatorArray[]; double downGatorArray[]; MqlRates pArray[]; double maArray[]; ArraySetAsSeries(upGatorArray,true); ArraySetAsSeries(downGatorArray,true); ArraySetAsSeries(maArray,true); int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN); int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE); int data=CopyRates(_Symbol,_Period,0,13,pArray); CopyBuffer(gatorDef,0,0,3,upGatorArray); CopyBuffer(gatorDef,2,0,3,downGatorArray); CopyBuffer(maDef,0,0,3,maArray); double gatorUpValue=NormalizeDouble(upGatorArray[0],6); double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6); double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6); double gatorDownValue=NormalizeDouble(downGatorArray[0],6); double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6); double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6); double maValue=NormalizeDouble(maArray[0],5); double closingPrice=pArray[0].close; bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&& gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2; bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&& gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2; if(douleGreen&&closingPrice>maValue) { Comment("Find a good buy position"); } else if(douleRed&&closingPrice<maValue) { Comment("Find a good sell position"); } else Comment(""); } //+------------------------------------------------------------------+
Что изменилось в коде по сравнению с предыдущим:
Создаем два дополнительных массива pArray и maArray. Используем функцию MqlRates для массива pArray для хранения информации о ценах и "double" для массива maArray;
MqlRates pArray[]; double maArray[];
Устанавливаем сортировку данных в массивах с помощью функции ArraySetAsSeries.
ArraySetAsSeries(maArray,true);
Создаем переменную типа integer maDef и определяем скользящую среднюю с помощью функции iMA, которая возвращает хэндла индикатора. Параметры функции:
- symbol — имя символа Используем _SYMBOL — символ текущего графика.
- period — таймфрейм для расчета; используемое значение _PERIOD означает, что индикатор будет рассчитываться на текущем таймфрейме, то же самое, что PERIOD_CURRENT.
- ma_period — период расчета скользящей средней; 13.
- ma_shift — горизонтальный сдвиг MA. Установим 0, чтобы не сдвигать.
- ma_method — тип скользящей средней, у нас это EMA (Exponential Moving Average)
- applied_price — определяет тип цены, используемой для расчета; используем цену закрытия
int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);
Получаем исторические данные MqlRates с помощью функции CopyRates:
- symbol_name — имя символа для расчета индикатора, _Symbol — текущий символ.
- timeframe — таймфрейм для расчета, _Period означает текущий таймфрейм графика.
- start_pos — позиция начала расчета индикатора, укажем 0 для расчета от текущей позиции
- count — количество данных для копирования, 13.
- rates_array[] — массив, в который копируем данные, pArray
int data=CopyRates(_Symbol,_Period,0,13,pArray);
Определяем данные и сохранение результатов в maArray с помощью функции CopyBuffer
CopyBuffer(maDef,0,0,3,maArray);
Получаем значения текущей экспоненциальной скользящей средней и нормализуем его.
double maValue=NormalizeDouble(maArray[0],5);
Получение текущего значения цены закрытия.
double closingPrice=pArray[0].close;
Создадим логические переменных двойных зеленых и двойных красных баров индикатора Gator Oscillator.
bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2;
Условия стратегии:
Условия покупки
if(douleGreen&&closingPrice>maValue) { Comment("Find a good buy position"); }
Условия продажи
else if(douleRed&&closingPrice<maValue) { Comment("Find a good sell position"); }
В остальных случаях
else Comment("");
Компилируем код, находим получившийся файл в Навигаторе в терминале и запускаем советник на графике торгового символа:
Как видите, в правом верхнем углу графика появилась индикация того, что на графике работает советник.
Значит, советник может генерировать сигналы по этой стратегии. Примеры тестовых сигналов показаны ниже.
Условия покупки
На графике выше есть комментарий с сигналом на покупку (Find a good buy position).
Условия продажи
Здесь в комментарии сигнал на продажу (Find a good sell position).
Итак, мы посмотрели с вами как создавать торговые системы на основе различных стратегий. Возможно, вы найдете новые идеи, которые сможете применить, а это и есть основная цель этой статьи и всей серии.
Заключение
Мы рассмотрели все темы этой статьи, в которой учились разрабатывать торговые системы с помощью индикатора Gator Oscillator. Мы узнали, что из себя представляет индикатор Gator Oscillator, как его рассчитать и как его использовать, на примере трех простых торговых стратегий, а именно:
- Определение состояния Gator: эта стратегия определяет состояние осциллятора Gator (пробуждение, сон, еда, насыщение) в зависимости от различных условий.
- Сигналы по индикатору Gator: для получения сигналов о возможности принятия решения (поиск хорошей возможности входа, удержания текущей позиции или поиск выхода) на основе различных условий осциллятора Gator.
- Совместное использование Gator и MA: сигналы на открытие позиций на покупку или продажу на основе Gator Oscillator с индикатором скользящей средней.
Мы разработали пошаговые схемы для каждой рассмотренной стратегии, которые используются в разработке торговых систем на их основе. После этого собственно познакомились с разработкой торговых систем — создали советник на MQL5 по каждой стратегии, получили программу, которая может работать в торговой платформе MetaTrader 5, увидели примеры сгенерированных сигналов по этим стратегиям.
Надеюсь, вам понравилась статья и вы узнали из нее что-то новое для себя. Если вы считаете ее полезной, почитайте мои предыдущие статьи из этой же серии, чтобы узнать, как разработать торговые системы на основе популярных технических индикаторов. Если вам понравилась эта статья, если вы считаете ее полезной, почитайте мои предыдущие статьи из этой же серии, чтобы узнать, как разработать торговую систему на основе популярных технических индикаторов.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/11928





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования