English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Как быстро написать советник для Automated Trading Championship 2010

Как быстро написать советник для Automated Trading Championship 2010

MetaTrader 5Примеры | 26 августа 2010, 14:39
5 700 3
Andrey Kornishkin
Andrey Kornishkin

Введение

Для того чтобы разработать эксперт для участия в чемпионате Automated Trading Championship 2010, воспользуемся шаблоном советника из статьи "Прототип торгового робота". Данная задача будет по силам даже новичку в программировании на MQL5, т.к. для ваших стратегий уже разработаны базовые классы, функции, шаблоны. Достаточно написать минимум кода, чтобы реализовать свою торговую идею.

Что нам будет необходимо для подготовки:
  • Выбор стратегии;
  • Написание советника;
  • Тестирование;
  • Оптимизация в тестере стратегий;
  • Оптимизация самой стратегии;
  • Тестирование на разных интервалах.

1. Выбор стратегии

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

Исходя из этих предположений, будем открывать позицию в направлении существующего тренда на отскоке от границ канала (Envelopes). Закрывать позицию будем по сигналу к закрытию позиции или по достижению уровней Stop Loss или Take Profit.

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

Рисунок 1. Индикатор MACD на дневном графике EURUSD 

Рисунок 1. Индикатор MACD на дневном графике EURUSD

Если индикатор MACD растет на двух барах подряд - это сигнал к покупке, убывает также на двух барах - сигнал к продаже.


Рисунок 2. Отскок цены от границ конверта Envelopes

Рисунок 2. Отскок цены от границ конверта Envelopes


2. Написание советника 

2.1. Включаемые модули

Эксперт будет использовать класс ExpertAdvisor, находящийся в модуле ExpertAdvisor.mqh.

#include <ExpertAdvisor.mqh>

2.2. Входные переменные

input int    SL        =  50; // Расстояние до Stop Loss
input int    TP        = 100; // Расстояние до Take Profit
input int    TS        =  50; // Расстояние трейлинг стопа
input int    FastEMA   =  15; // Быстрое EMA
input int    SlowEMA   =  26; // Медленное EMA
input int    MACD_SMA  =   1; // Сигнальная линия MACD
input int    EnvelPer  =  20; // Период Envelopes
input double EnvelDev  = 0.4; // Отклонение Envelopes
input double Risk      = 0.1; // Риск

2.3. Создадим класс, наследуемый от CExpertAdvisor

class CMyEA : public CExpertAdvisor
  {
protected:
   double            m_risk;          // размер риска
   int               m_sl;            // Stop Loss
   int               m_tp;            // Take Profit
   int               m_ts;            // трейлинг
   int               m_pFastEMA;      // Быстрое EMA
   int               m_pSlowEMA;      // Медленное EMA
   int               m_pMACD_SMA;     // Сигнальная линия MACD
   int               m_EnvelPer;      // Период Envelopes     
   double            m_EnvelDev;      // Отклонение Envelopes     
   int               m_hmacd;         // хэндл индикатора МАCD
   int               m_henvel;        // хэндл индикатора Envelopes   
public:
   void              CMyEA();
   void             ~CMyEA();
   virtual bool      Init(string smb,ENUM_TIMEFRAMES tf); // инициализация
   virtual bool      Main();                              // главная функция
   virtual void      OpenPosition(long dir);              // открыть позицию по сигналу
   virtual void      ClosePosition(long dir);             // закрыть позицию по сигналу
   virtual long      CheckSignal(bool bEntry);            // проверить сигнал
  };
//------------------------------------------------------------------

2.4. Удаляем индикаторы
//------------------------------------------------------------------    
void CMyEA::~CMyEA()
  {
   IndicatorRelease(m_hmacd);  // удаляем индикатор МАCD
   IndicatorRelease(m_henvel); // удаляем индикатор Envelopes
  }
//------------------------------------------------------------------    
2.5. Инициализация переменных
//------------------------------------------------------------------    Init
bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf)
  {
   if(!CExpertAdvisor::Init(0,smb,tf)) return(false);    // инициализация родительского класса
   // копируем параметры
   m_risk=Risk; 
   m_tp=TP; 
   m_sl=SL; 
   m_ts=TS;
   m_pFastEMA=FastEMA; 
   m_pSlowEMA=SlowEMA; 
   m_pMACD_SMA=MACD_SMA;
   m_EnvelPer = EnvelPer;
   m_EnvelDev = EnvelDev;
   m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE);      // создаем индикатор МАCD
   m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // создаем индикатор Envelopes
   if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false);             // если ошибка то выходим
   m_bInit=true; 
   return(true);                                                                      // "торговля разрешена"
  } 

2.6. Торговая функция

//------------------------------------------------------------------    CheckSignal
long CMyEA::CheckSignal(bool bEntry)
  {
   double macd[4],   // Массив значений индикатора MACD
         env1[3],    // Массив значений верхней границы Envelopes
         env2[3];    // Массив значений нижней границы Envelopes
   MqlRates rt[3];   // Массив значений цен для 3-х последних баров
   
   if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Копируем в массив значения цен 3-х последних баров
     {
       Print("CopyRates ",m_smb," не загружена история"); 
        return(WRONG_VALUE);
     }
   // Копируем в массив значения индикаторов
   if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2)
     { 
        Print("CopyBuffer - нет данных"); 
       return(WRONG_VALUE);
     }
   // Покупаем, если MACD растет и отскок от нижней границы Envelopes
   if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] &&  macd[2]<macd[3])
      return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // условие для покупок
   // Продаем, если MACD убывает и отскок от верхней границы Envelopes   
   if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] &&  macd[2]>macd[3])
      return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // условие для продаж

   return(WRONG_VALUE); // если сигнала нет
  }

CMyEA ea; // экземпляр класса

И вот, после написания кода, получившийся эксперт отправляем прямиком в тестер стратегий.


3. Тестирование 

В тестере стратегий на периоде "Last year" по паре EURUSD получаем следующий график:

Рисунок 3. Результаты тестирования торговой системы с начальными параметрами

Рисунок 3. Результаты тестирования торговой системы с начальными параметрами

Результаты нас не очень-то впечатляют, поэтому для начала оптимизируем уровни Stop Loss и Take Profit.


4. Оптимизация в тестере стратегий

Оптимизировать параметры Stop Loss и Take Profit будем на интервале 10-500 с шагом 50.

Лучшие результаты: Stop Loss=160, Take Profit=310. После оптимизации параметров Stop Loss и Take Profit мы получили уже 67% прибыльных сделок против прошлых 36% и чистую прибыль 1522.97$. Таким образом, путем простейших манипуляций мы вывели нашу систему в безубыток и даже получили некоторую прибыль.

Рисунок 4. Результаты тестирования торговой системы с оптимизированными параметрами Stop Loss и Take Profit

Рисунок 4. Результаты тестирования торговой системы с оптимизированными параметрами Stop Loss и Take Profit

Далее оптимизируем период и отклонение Envelopes.

Период Envelopes будем изменять от 10 до 40 с шагом 4, а отклонение от 0.1 до 1 с шагом 0.1.

Лучшими результатами оптимизации будут: период Envelopes=22, отклонение Envelopes=0.3. Уже сейчас мы получили чистую прибыль 14418.92$ и 79% прибыльных сделок.

Рисунок 5. Результаты тестирования торговой системы с оптимизироваными параметрами периода и отклонения Envelopes

Рисунок 5. Результаты тестирования торговой системы с оптимизироваными параметрами периода и отклонения Envelopes

Если мы увеличим риск до 0.8, то получим чистую прибыль 77330.95$.

Рисунок 6. Результаты тестирования торговой системы с оптимизированными параметрами риска

Рисунок 6. Результаты тестирования торговой системы с оптимизированными параметрами риска

 

5. Оптимизация самой стратегии

Оптимизация стратегии может состоять из следующих этапов:

  • Смена трендового индикатора;
  • Выбор другого конверта;
  • Выбор другого таймфрейма;
  • Изменение торговых условий.

5.1. Смена трендового индикатора

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

Давайте заменим индикатор MACD простой скользящей средней. Код эксперта можно посмотреть в приложенном файле Macena.mq5.

5.2. Выбор другого конверта

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

Пример эксперта с использованием МА и Bollinger Bands можно найти в приложенном файле Maboll.mq5.

5.3. Выбор другого таймфрейма

Изменим таймфрейм на более старший и на более младший. В качестве старшего таймфрейма возьмем Н4, младший пусть будет М15 и затем протестируем и оптимизируем нашу систему. 

Для этого в коде заменим всего лишь одну строку:

m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // создаем индикатор Envelopes

В случае таймфрейма Н4:

m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // создаем индикатор Envelopes 

Для таймфрейма М15: 

m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // создаем индикатор Envelopes

5.4. Изменение торговых условий

В качестве эксперимента изменим также и торговые условия.

  1. Сделаем систему разворотной. Покупать будем на отскоке от нижней границы конверта, продавать на отскоке от верхней линии Envelopes.
  2. Проверим работу системы без следования дневному тренду. Сделать это достаточно просто, вставив в торговый блок следующий код:
    //------------------------------------------------------------------ CheckSignal
    long CMyEA::CheckSignal(bool bEntry)
      {
       double env1[3],   // Массив значений верхней границы Envelopes
             env2[3];    // Массив значений нижней границы Envelopes
       MqlRates rt[3];   // Массив значений цен для 3-х последних баров
    
       if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Копируем в массив значения цен 3-х последних баров
         {
          Print("CopyRates ",m_smb," не загружена история");
          return(WRONG_VALUE);
         }
    // Копируем в массив значения индикаторов
       if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2)
         {
          Print("CopyBuffer - нет данных");
          return(WRONG_VALUE);
         }
    // Покупаем на отскоке от нижней границы Envelopes
       if(rt[1].open<env2[1] && rt[1].close>env2[1])
          return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // условие для покупок
    // Продаем на отскоке от верхней границы Envelopes   
       if(rt[1].open>env1[1] && rt[2].close<env1[1])
          return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // условие для продаж
    
       return(WRONG_VALUE); // если сигнала нет
      }
    
    CMyEA ea; // экземпляр класса
    //------------------------------------------------------------------    OnInit
    

     3.  Будем закрывать короткую позицию, когда цена не пошла далеко вниз, а развернулась и пошла вверх.

     4.  Будем закрывать длинную позицию, когда цена не пошла далеко вверх, а развернулась и пошла вниз.

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

Дальнейшие исследования писателям экспертов предлагается провести самостоятельно.


6. Тестирование на разных интервалах

Протестируем наш советник на равных интервалах времени со сдвигом в 1 месяц. Период тестирования возьмем Last year. Отрезок времени - 3 месяца.

Интервал тестирования
Прибыль, USD
Прибыльных сделок
 1.01.2010 - 30.03.2010
7239.5076.92%
 1.02.2010 - 30.04.2010-6577.50 0%
 1.03.2010 - 30.05.2010-8378.5050%
 1.04.2010 - 30.06.2010-6608.000%
 1.05.2010 - 30.07.2010 41599.5080%
  1.06.2010 - 30.08.2010 69835.50 85%
Вывод: нежелательно использовать советник с таким агрессивным мани-менеджментом. Уменьшаем риск.


Заключение

Краткий вывод таков: на основе данного шаблона можно с минимумом затрат времени и сил можно довольно таки быстро реализовать свою торговую идею.

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

Чтобы создать более стабильно работающую торговую систему, желательно оптимизировать все параметры на более длительных интервалах времени.

Список использованных источников:
  1. Статья "20 торговых сигналов на MQL5".
  2. Статья "Прототип торгового робота".
  3. Статья "Несколько способов определения тренда на MQL5".
  4. Статья "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота".
  5. Статья "Ограничения и проверки в экспертах".
  6. Статья "Написание советника в MQL5 с использованием объектно-ориентированного подхода".
  7. Статья "Функции для управления капиталом в экспертах".
  8. Сафин В.И. - Создание и оптимизация торговых систем в Metastock.
Прикрепленные файлы |
macena.mq5 (6.97 KB)
maena.mq5 (6.61 KB)
mabol.mq5 (6.69 KB)
expertadvisor.mqh (18.14 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (3)
hryak
hryak | 26 авг. 2010 в 15:22
ни понил. каковы вааще реальные шансы с такой ТС (предложенной в статье) занять призовое место на чампе ?
Rashid Umarov
Rashid Umarov | 26 авг. 2010 в 15:38
hryak:
ни понил. каковы вааще реальные шансы с такой ТС (предложенной в статье) занять призовое место на чампе ?
Мы, конечно, стараемся публиковать материалы, которые в доступной форме объясняют все тонкости программирования на MQL5. Но все же исходим из того, что читатели могут самостоятельно не только складывать буквы в слова, но и понимать смысл прочитанного.
Vladislav Andruschenko
Vladislav Andruschenko | 28 авг. 2010 в 15:47
Хахаха. Извините за оффтоп. До написания этой статьи я именно так и сделал. и Воспользовался 2 статьями, прототип и 20 торговых сигналов и нашел свою стратегию, немного изменил код, добавил пару функций, и результаы получились отличные.
Адаптивные торговые системы и их использование в терминале MetaTrader 5 Адаптивные торговые системы и их использование в терминале MetaTrader 5
В статье предложен вариант адаптивной системы, состоящей из множества стратегий, каждая из которых производит свои "виртуальные" торговые операции. Реальная торговля происходит в соответствии с сигналами стратегии, которая на текущий момент является самой прибыльной. За счет использования объектно-ориентированного подхода, классов для работы с данными и торговых классов Стандартной библиотеки, архитектура системы получилась простой и масштабируемой, теперь вы легко сможете создавать и исследовать адаптивные системы, включающие сотни торговых стратегий.
Фрактальный анализ совместного движения валют Фрактальный анализ совместного движения валют
Насколько независимы валютные котировки? Движутся ли они согласованно или информация о направлении движения одной валюты ничего не скажет о движении другой? В этой статье предпринята попытка разобраться в этом вопросе, используя методы нелинейной динамики и фрактальной геометрии.
Интервью с Александром Топчило (ATC 2010) Интервью с Александром Топчило (ATC 2010)
Александр Топчило (Better) - победитель Чемпионата Automated Trading Championship 2007. Коньком Александра являются нейронные сети - именно нейроэксперт со значительным отрывом опередил конкурентов в Чемпионате 2007 года. Интересный собеседник и успешный разработчик экспертов рассказывает в этом интервью о своей жизни после Чемпионатов, собственном бизнесе и новых алгоритмах для создания торговых систем.
Интервью с Леонидом Величковским: &quot;Главный миф о нейронных сетях – сверхприбыльность&quot; (ATC 2010) Интервью с Леонидом Величковским: &quot;Главный миф о нейронных сетях – сверхприбыльность&quot; (ATC 2010)
Герой нашего интервью - Леонид Величковский (LeoV) – уже принимал участие в Чемпионатах по автоматическому трейдингу. В 2008 году его мультивалютная нейронная сеть ярко вспыхнула на небосклоне, заработав в определенный момент 110 000 $, но в итоге пала жертвой собственного агрессивного мани-менеджмента. В интервью двухлетней давности Леонид говорил о собственном опыте трейдинга и особенностях работы его советника. В преддверии же Чемпионата ATC 2010 наш герой рассказывает о самых распространенных мифах и заблуждениях, связанных с нейросетями.