Как быстро написать советник для Automated Trading Championship 2010
Введение
Для того чтобы разработать эксперт для участия в чемпионате Automated Trading Championship 2010, воспользуемся шаблоном советника из статьи "Прототип торгового робота". Данная задача будет по силам даже новичку в программировании на MQL5, т.к. для ваших стратегий уже разработаны базовые классы, функции, шаблоны. Достаточно написать минимум кода, чтобы реализовать свою торговую идею.
Что нам будет необходимо для подготовки:- Выбор стратегии;
- Написание советника;
- Тестирование;
- Оптимизация в тестере стратегий;
- Оптимизация самой стратегии;
- Тестирование на разных интервалах.
1. Выбор стратегии
Считается, что торговля по тренду является более прибыльной, чем торговля в диапазоне, и отскок от внутридневных уровней происходит чаще, чем пробой границ канала.
Исходя из этих предположений, будем открывать позицию в направлении существующего тренда на отскоке от границ канала (Envelopes). Закрывать позицию будем по сигналу к закрытию позиции или по достижению уровней Stop Loss или Take Profit.
В качестве трендового сигнала будем использовать прирост или убывание MACD на дневном графике, а торговлю на отскоке от границ канала будем производить на часовом таймфрейме.
Рисунок 1. Индикатор MACD на дневном графике EURUSD
Если индикатор MACD растет на двух барах подряд - это сигнал к покупке, убывает также на двух барах - сигнал к продаже.
Рисунок 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. Результаты тестирования торговой системы с начальными параметрами
Результаты нас не очень-то впечатляют, поэтому для начала оптимизируем уровни 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
Далее оптимизируем период и отклонение Envelopes.
Период Envelopes будем изменять от 10 до 40 с шагом 4, а отклонение от 0.1 до 1 с шагом 0.1.
Лучшими результатами оптимизации будут: период Envelopes=22, отклонение Envelopes=0.3. Уже сейчас мы получили чистую прибыль 14418.92$ и 79% прибыльных сделок.
Рисунок 5. Результаты тестирования торговой системы с оптимизироваными параметрами периода и отклонения Envelopes
Если мы увеличим риск до 0.8, то получим чистую прибыль 77330.95$.
Рисунок 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. Изменение торговых условий
В качестве эксперимента изменим также и торговые условия.
- Сделаем систему разворотной. Покупать будем на отскоке от нижней границы конверта, продавать на отскоке от верхней линии Envelopes.
- Проверим работу системы без следования дневному тренду. Сделать это достаточно просто, вставив в торговый блок следующий код:
//------------------------------------------------------------------ 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.50 | 76.92% |
1.02.2010 - 30.04.2010 | -6577.50 | 0% |
1.03.2010 - 30.05.2010 | -8378.50 | 50% |
1.04.2010 - 30.06.2010 | -6608.00 | 0% |
1.05.2010 - 30.07.2010 | 41599.50 | 80% |
1.06.2010 - 30.08.2010 | 69835.50 | 85% |
Заключение
Краткий вывод таков: на основе данного шаблона можно с минимумом затрат времени и сил можно довольно таки быстро реализовать свою торговую идею.
Оптимизировать параметры системы и торговые критерии также не составляет большого труда.
Чтобы создать более стабильно работающую торговую систему, желательно оптимизировать все параметры на более длительных интервалах времени.
Список использованных источников:- Статья "20 торговых сигналов на MQL5".
- Статья "Прототип торгового робота".
- Статья "Несколько способов определения тренда на MQL5".
- Статья "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота".
- Статья "Ограничения и проверки в экспертах".
- Статья "Написание советника в MQL5 с использованием объектно-ориентированного подхода".
- Статья "Функции для управления капиталом в экспертах".
- Сафин В.И. - Создание и оптимизация торговых систем в Metastock.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
ни понил. каковы вааще реальные шансы с такой ТС (предложенной в статье) занять призовое место на чампе ?