Смотри, как бесплатно скачать роботов
Ищи нас в Facebook!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Советники

Мастер MQL5 - Торговые сигналы по пересечению двух EMA с фильтрацией сделок по времени - эксперт для MetaTrader 5

Просмотров:
8333
Рейтинг:
(39)
Опубликован:
2011.01.12 20:39
Обновлен:
2018.04.04 13:32
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

В статье Создание эксперта без программирования с помощью Мастера MQL5 описаны шаги по автоматическому созданию кода советника при помощи Мастера MQL5.

Принципы работы модуля торговых сигналов на пересечении двух скользящих средних рассмотрены в "Мастер MQL5 - Торговые сигналы по пересечению двух экспоненциальных скользящих средних". Системы, основанные на скользящих средних, эффективно работают лишь при наличии трендовых движений, в противном случае множество ложных сигналов значительно снизит эффективность торговли. Одним из методов улучшения торговых показателей является фильтрация сделок по времени, ограничивая вход в рынок заданными временными рамками (например, открывать позиции только в течение европейской сессии).

Здесь мы расскажем о трендовой стратегии, основанной на пересечении двух (быстрой и медленной) экспоненциально сглаженных скользящих средних с фильтрацией сделок по времени. Эта стратегия включена в стандартную поставку терминала и называется "Signals based on crossover of two EMA with intraday time filter".

Основные положения стратегии:

  • Открытие позиции на покупку: когда быстрая скользящая средняя пересекает медленную снизу вверх и при этом не выполняется условие фильтрации сделок по времени.
  • Открытие позиции на продажу: когда быстрая скользящая средняя пересекает медленную сверху вниз и при этом не выполняется условие фильтрации сделок по времени.
Торговая стратегия реализована в классе CSignal2EMA_ITF.
Механизм фильтрации сделок по времени реализован в классе CSignalITF. Класс торговых сигналов CSignal2EMA_ITF (содержащий в себе экземпляр класса CSignalITF), который мы рассмотрим далее, является примером реализации фильтрации входов в рынок по времени в модуле торговых сигналов.

Другой отличительной особенностью данного модуля торговых сигналов является то, что он работает с отложенными ордерами, ценовые уровни которых вычисляются относительно текущего значения скользящей средней и задаются в единицах диапазона ATR (Average True Range).


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

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

Торговые сигналы

Модуль с торговыми сигналами по данной стратегии реализован в классе  CSignal2EMA_ITF, для удобства в нем есть несколько защищенных (protected) методов, которые используются для доступа к значениям индикаторов:

 double  FastEMA(int ind)      // возвращает значение быстрой EMA на заданном баре
 double  SlowEMA(int ind)      // возвращает значение медленной EMA на заданном баре
 double  StateFastEMA(int ind) // возвращает положительное/отрицательно число, если быстрая EMA возрастает/убывает
 double  StateSlowEMA(int ind) // возвращает положительное/отрицательно число, если медленная EMA возрастает/убывает
 double  StateEMA(int ind)     // возвращает разность между быстрой и медленной EMA
 double  ATR(int ind)          // возвращает значение ATR на заданном баре


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

  1. Limit>0. Вход будет производится на коррекции с ложным пробоем (проколом) скользящей средней по цене лучше рыночной (будут выставлены отложенные ордера Buy Limit и Sell Limit в зависимости от направления входа)
  2. Limit<0. Вход будет производится на продолжении движения цены в предполагаемом направлении по цене хуже текущей рыночной цены (будут выставлены отложенные ордера Buy Stop и Sell Stop в зависимости от направления входа).
  3. Limit=0. Вход будет производится по текущей рыночной цене.


1. Открытие длинной позиции

Сначала проверяются условия открытия длинной позиции: оно выполнено, если разность между быстрой и медленной на последнем завершенном баре сменила знак с "-" на "+" (StateEMA(1)>0 && StateEMA(2)<0).

Затем проверяются условия временного фильтра путем вызова функции CheckOpenLong() класса CSignalITF.  Если не удовлетворяются условия фильтра входа в рынок по времени, указанные во входных параметрах, то далее производится расчет базового ценового уровня (значение скользящей средней) и диапазона ATR на последнем завершенном баре. 

Выставление ордера на покупку производится по цене, которая определяется значением входного параметра Limit, указанного в единицах ATR. Значения уровней Take Profit и Stop Loss также определяются относительно базовой цены и задаются во входных параметрах в единицах ATR. "Время жизни" устанавливаемого ордера определяется входным параметром Expiration и задается в барах текущего таймфрейма.

//+------------------------------------------------------------------+
//| Метод проверки выполнения условий для открытия длинной позиции   |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)>0 && StateEMA(2)<0))                    return(false);
   if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
   sl   =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp   =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

2. Закрытие длинной позиции

В данной реализации функция проверки закрытия длинной позиции всегда возвращает false, т.е. предполагается, что позиция будет закрыта по Take Profit или Stop Loss. При необходимости можно добавить другие правила закрытия позиции.

//+------------------------------------------------------------------+
//| Метод проверки выполнения условий для закрытия длинной позиции   |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseLong(double& price)
  {
   return(false);
  }


3. Открытие короткой позиции

Также как и в случае проверки условий для покупки сначала проверяются условия открытия длинной позиции: оно выполнено, если разность между быстрой и медленной на последнем завершенном баре сменила знак с "+" на "-" (StateEMA(1)<0 && StateEMA(2)>0).

Затем проверяются условия временного фильтра путем вызова функции CheckOpenLong() класса CSignalITF.  Если не удовлетворяются условия фильтра входа в рынок по времени, указанные во входных параметрах, то далее производится расчет базового ценового уровня (значение скользящей средней) и диапазона ATR на последнем завершенном баре. 

Выставление ордера на продажу производится по цене, которая определяется значением входного параметра Limit, указанного в единицах ATR. Значения уровней Take Profit и Stop Loss также определяются относительно базовой цены и задаются во входных параметрах в единицах ATR. "Время жизни" устанавливаемого ордера определяется входным параметром Expiration и задается в барах текущего таймфрейма.

//+------------------------------------------------------------------+
//| Метод проверки выполнения условий для открытия короткой позиции   |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)<0 && StateEMA(2)>0))                     return(false);
   if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price      =m_symbol.NormalizePrice(ema+m_limit*atr);
   sl         =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp         =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

4. Закрытие короткой позиции

В данной реализации функция проверки закрытия короткой позиции всегда возвращает false, т.е. предполагается, что позиция будет закрыта по Take Profit или Stop Loss. При необходимости можно добавить другие правила закрытия позиции.

//+------------------------------------------------------------------+
//| Проверяет выполнение условий для закрытия короткой позиции       |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseShort(double& price)
  {
   return(false);
  }


5. Сопровождение отложенного ордера на покупку

При наличии отложенного ордера на покупку производится его сопровождение: цена ордера корректируется в зависимости от текущих значений скользящей средней и диапазона ATR.

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

//+--------------------------------------------------------------------+
//| Определяет необходимость модификации отложенного ордера на покупку |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price)
  {
//--- check
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
//---
   return(true);
  }


6. Сопровождение отложенного ордера на продажу

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

//+--------------------------------------------------------------------+
//| Определяет необходимость модификации отложенного ордера на покупку |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price)
  {
//--- check
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price=m_symbol.NormalizePrice(ema+m_limit*atr);
//---
   return(true);
  }

Создание эксперта на основе торговых сигналов при помощи Мастера MQL5

Чтобы создать торгового робота по данной стратегии при помощи Мастера MQL5, выберите на втором шаге тип сигналов "Signals based on crossover of two EMA with intraday time filter":

Рисунок 2. Выбор модуля сигналов пересечения двух экспоненциально сглаженных скользящих средних с временным фильтром в Мастере MQL5

Рисунок 2. Выбор модуля сигналов пересечения двух экспоненциально сглаженных скользящих средних с временным фильтром в Мастере MQL5

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


Результаты тестирования

Результаты тестирования советника на исторических данных приведены на рис. 3:

  • EURUSD H1,
  • период тестирования: 1.1.2010-05.01.2011,
  • PeriodFastEMA=5,
  • PeriodSlowEMA=30,
  • PeriodATR=7,
  • Limit=1.2,
  • StopLoss=5,
  • TakeProfit=8,
  • Expiration=4,
  • GoodMinuteOfHour=-1,
  • BadMinutesOfHour=0,
  • GoodHourOfDay=-1,
  • BadHoursOfDay=0,
  • GoodDayOfWeek=-1,
  • BadDaysOfWeek=0.

В данном советнике использовался модуль торговли фиксированным объемом 0.1 лота (Trading Fixed Lot), трейлинг не использовался (Trailing not used).

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

Рисунок 3. Результаты тестирования советника, использующего стратегию пересечения двух EMA без использования фильтра ITF

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

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

Для того чтобы указать временной фильтр, следует "разрешить" торговлю в течение первых 6 часов при помощи установки параметра BadHoursOfDay=16777152=111111111111111111000000b. Все часы суток после первых 6 часов считаются нежелательными для входа в рынок.

Установка фильтра входов в рынок по часам (BadHoursOfDay=16777152) позволяет улучшить результаты торговли:

Рисунок 3. Результаты тестирования советника, использующего стратегию пересечения двух EMA с фильтрацией входов по часам (BadHoursofDay=16777152)

Рисунок 3. Результаты тестирования советника, использующего стратегию пересечения двух EMA с фильтрацией входов по часам (BadHoursofDay=16777152)


Класс CSignalITF позволяет также настроить и более сложные временные фильтры ("хорошие" и "плохие" для торговли минуты внутри часа, часы внутри дня или конкретные дни недели).

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

Файл Signal2EMA-ITF.mqh, содержащий класс торговых сигналов CSignal2EMA_ITF нужно скопировать в папку каталог_данных_терминала\MQL5\Include\Expert\Signal.

Код советника, созданного Мастером MQL5, прилагается в файле expert_2ema_itf.mq5.


Мастер MQL5 - Торговые сигналы по пересечению двух экспоненциальных скользящих средних Мастер MQL5 - Торговые сигналы по пересечению двух экспоненциальных скользящих средних

Торговые сигналы по пересечению двух экспоненциально сглаженных скользящих средних "Signals based on crossover of two EMA".

SelfGenerator SelfGenerator

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

Мастер MQL5 - Торговые сигналы по пересечению основной и сигнальной линий индикатора MACD Мастер MQL5 - Торговые сигналы по пересечению основной и сигнальной линий индикатора MACD

Торговые сигналы по пересечению основной и сигнальной линий индикатора MACD "Signals based on crossover of main and signal MACD lines" (класс CSignalMACD из Стандартной библиотеки).

Профессиональный ZigZag Профессиональный ZigZag

ZigZag, лишенный большинства недостатков типового.