English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Мастер MQL5: Создание эксперта без программирования

Мастер MQL5: Создание эксперта без программирования

MetaTrader 5Торговые системы | 15 декабря 2010, 12:54
24 919 14
MetaQuotes
MetaQuotes

Введение

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

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

В MQL5 использование объектно-ориентированного подхода позволяет значительно упростить задачу написания и тестирования автоматических торговых систем.

MetaQuotes Software Corp. разработала классы для реализации торговых стратегий, теперь код советников можно генерировать автоматически прямо в редакторе MetaEditor путем выбора необходимых модулей торговых сигналов (на текущий момент их 20), трейлинга (4) и управления капиталом (5). Комбинируя эти модули, можно получать множество вариантов готовых торговых систем.

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

В этой статье мы рассмотрим процесс автоматической генерации кода советника с использованием Мастера MQL5. И при этом ничего программировать не придется!


1. Создание торгового робота при помощи Мастера MQL5

Конструирование кода советника производится при помощи Мастера MQL5 редактора MetaEditor.

Базовые классы торговых стратегий расположены в каталоге \папка терминала\MQL5\Include\Expert\. Готовые алгоритмы классов торговых сигналов, классов сопровождения открытых позиций и классов управления капиталом и рисками находятся в подкаталогах Signal, Trailing и Money. Мастер MQL5 анализирует файлы в этих каталогах и использует их для генерации кода советника.

Для вызова Мастера MQL5 нужно нажать кнопку "Создать" в панели инструментов, либо выбрать пункт "Создать" в меню "Файл" главного меню (или при помощи Ctrl+N):

Рисунок 1. Запуск Мастера MQL5

Рис. 1. Запуск Мастера MQL5

Далее следует выбрать тип создаваемой программы. В нашем случае выбираем пункт генерации кода советника "Советник (сгенерировать)":

Рис. 2. Выбор типа создаваемой программы

Рис. 2. Выбор типа создаваемой программы

Шаг 1. Общие параметры советника

Появляется диалог настройки общих параметров советника:

Рис. 3. Общие параметры советника

Рис. 3. Общие параметры советника

Задаем наименование советника, имя автора и ссылку на сайт в полях "Имя", "Автор" и "Ссылка".

В советнике также присутствуют входные параметры:

  • Symbol (тип string) - рабочий символ советника (по умолчанию - текущий символ, на котором запущен советник);
  • TimeFrame (тип timeframe) - рабочий таймфрейм советника (по умолчанию - текущий таймфрейм, на котором запущен советник);

Следующим шагом выберем модуль торговых сигналов, по которым эксперт будет торговать.


Шаг 2. Выбор модуля торговых сигналов

Алгоритм открытия и закрытия позиций определяется модулем торговых сигналов. Модули торговых сигналов содержат правила открытия/закрытия/переворота позиций.

В Стандартной библиотеке есть готовые модули торговых сигналов:

  1. CSignalAC - Модуль сигналов на основе рыночных моделей индикатора Accelerator Oscillator;
  2. CSignalAMA - Модуль сигналов на основе рыночных моделей индикатора Adaptive Moving Average;
  3. CSignalAO - Модуль сигналов на основе рыночных моделей индикатора Awesome Oscillator;
  4. CSignalBearsPower - Модуль сигналов на основе рыночных моделей осциллятора Bears Power;
  5. CSignalBullsPower - Модуль сигналов на основе рыночных моделей осциллятора Bulls Power;
  6. CSignalCCI - Модуль сигналов на основе рыночных моделей осциллятора Commodity Channel Index;
  7. CSignalDeM - Модуль сигналов на основе рыночных моделей осциллятора DeMarker;
  8. CSignalDEMA - Модуль сигналов на основе рыночных моделей индикатора Double Exponential Moving Average;
  9. CSignalEnvelopes - Модуль сигналов на основе рыночных моделей индикатора Envelopes;
  10. CSignalFrAMA - Модуль сигналов на основе рыночных моделей индикатора Fractal Adaptive Moving Average;
  11. CSignalITF - Модуль фильтрации сигналов по времени;
  12. CSignalMACD - Модуль сигналов на основе рыночных моделей осциллятора MACD;
  13. CSignalMA - Модуль сигналов на основе рыночных моделей индикатора Moving Average;
  14. CSignalSAR - Модуль сигналов на основе рыночных моделей индикатора Parabolic SAR;
  15. CSignalRSI - Модуль сигналов на основе рыночных моделей осциллятора Relative Strength Index;
  16. CSignalRVI - Модуль сигналов на основе рыночных моделей осциллятора Relative Vigor Index;
  17. CSignalStoch - Модуль сигналов на основе рыночных моделей осциллятора Stochastic;
  18. CSignalTRIX - Модуль сигналов на основе рыночных моделей осциллятора Triple Exponential Average;
  19. CSignalTEMA - Модуль сигналов на основе рыночных моделей индикатора Triple Exponential Moving Average;
  20. CSignalWPR - Модуль сигналов на основе рыночных моделей осциллятора Williams Percent Range.

После нажатия на кнопку "Далее" появится окно выбора набора сигналов, по которым будет торговать советник.

Рис. 3. Выбор сигналов для советника

Рис. 4. Выбор сигналов для советника


Для того чтобы добавить модуль торговых сигналов в советник, нужно нажать "Добавить".  Тип торговых сигналов указывается в пункте "Имя".

Добавим модуль сигналов на основе рыночных моделей индикатора Moving Average;

Рис. 4. Добавление модуля торговых сигналов

Рис. 5. Добавление модуля торговых сигналов и настройка параметров

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

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

После добавления модуля он появится в списке:

Рис. 5. Модуль торговых сигналов успешно добавлен в советник

Рис. 6. Модуль торговых сигналов добавлен в советник


Шаг 3. Выбор модуля сопровождения открытых позиций

Следующим шагом является выбор алгоритма сопровождения открытых позиций (Trailing Stop). Использование трейлинга позволяет сохранить заработанную прибыль.

В Стандартной библиотеке имеется несколько способов сопровождения открытых позиций:

  1. Trailing Stop not used (отсутствие Trailing Stop)
  2. Trailing Stop based on fixed Stop Level (подтяжка защитного стопа на фиксированном "расстоянии");
  3. Trailing Stop based on MA (установка защитного стопа по значениям скользящей средней);
  4. Trailing Stop based on Parabolic SAR (трейлинг открытой позиции по значениям индикатора Parabolic SAR).

В нашем советнике выберем "Trailing Stop based on fixed Stop Level":

Рисунок 6. Выбор алгоритма сопровождения открытых позиций

Рис. 7. Выбор алгоритма сопровождения открытых позиций

Данный тип трейлинга подразумевает два параметра: уровни StopLevel и ProfitLevel (в пунктах для котировок с 2-мя и 4-мя знаками после запятой), которые будут использоваться в процессе сопровождения открытых позиций:

Рисунок 7. Установка параметров выбранного алгоритма сопровождения открытых позиций

Рис. 8. Установка параметров выбранного алгоритма сопровождения открытых позиций


Шаг 4. Выбор модуля управления капиталом и рисками

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

Предназначение данного алгоритма - определение величины торгового объема (в лотах) для торговых операций, а также риск-менеджмент. При возникновении убытков, величина которых превышает допустимые значения (например, 10% от капитала), модуль управления капиталом и рисками принудительно закроет убыточную позицию.

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

  1. Trading with fixed trade volume (торговля фиксированным количеством лотов);
  2. Trading with fixed margin (объем операций с фиксированным уровнем использования свободной маржи);
  3. Trading with fixed risk (вход в рынок с фиксированным уровнем риска);
  4. Trading with minimal allowed trade volume (торговые операции с минимальным количеством лотов);
  5. Trading with optimized trade volume (оптимизация торгового объема по результатам предыдущих сделок).

Рисунок 8. Выбор алгоритма управления капиталом и рисками

Рис. 9. Выбор алгоритма управления капиталом и рисками

Выберем алгоритм торговли фиксированным количеством лотов (Trading with fixed trade volume).

Выбранный нами модуль имеет два параметра:

  • Lots - торговый объем в лотах;
  • Percent - максимально допустимый процент риска.

Рисунок 9. Установка параметров выбранного алгоритма управления капиталом и рисками

Рис. 10. Установка параметров выбранного алгоритма управления капиталом и рисками

После нажатия кнопки "Готово" в папке \каталог терминала\MQL5\Experts\ появится файл TestExpert.mq5, его имя соответствует наименованию, заданному при создании советника.


2. Структура советника, созданного при помощи Мастера MQL5

Код эксперта, сгенерированный Мастером MQL5, выглядит следующим образом:

//+------------------------------------------------------------------+
//|                                                   TestExpert.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string              Expert_Title                  ="TestExpert"; // Document name
ulong                    Expert_MagicNumber            =23320;        // 
bool                     Expert_EveryTick              =false;        // 
//--- inputs for main signal
input int                Signal_ThresholdOpen          =10;           // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose         =10;           // Signal threshold value to close [0...100]
input double             Signal_PriceLevel             =0.0;          // Price level to execute a deal
input double             Signal_StopLevel              =50.0;         // Stop Loss level (in points)
input double             Signal_TakeLevel              =50.0;         // Take Profit level (in points)
input int                Signal_Expiration             =4;            // Expiration of pending orders (in bars)
input int                Signal_MA_PeriodMA            =85;           // Moving Average(85,0,...) Period of averaging
input int                Signal_MA_Shift               =0;            // Moving Average(85,0,...) Time shift
input ENUM_MA_METHOD      Signal_MA_Method              =MODE_SMA;      // Moving Average(85,0,...) Method of averaging
input ENUM_APPLIED_PRICE  Signal_MA_Applied             =PRICE_CLOSE;    // Moving Average(85,0,...) Prices series
input double             Signal_MA_Weight              =1.0;          // Moving Average(85,0,...) Weight [0...1.0]
//--- inputs for trailing
input int                Trailing_FixedPips_StopLevel  =30;           // Stop Loss trailing level (in points)
input int                Trailing_FixedPips_ProfitLevel=50;           // Take Profit trailing level (in points)
//--- inputs for money
input double             Money_FixLot_Percent          =10.0;         // Percent
input double             Money_FixLot_Lots             =0.1;          // Fixed volume
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMA
   CSignalMA *filter0=new CSignalMA;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodMA(Signal_MA_PeriodMA);
   filter0.Shift(Signal_MA_Shift);
   filter0.Method(Signal_MA_Method);
   filter0.Applied(Signal_MA_Applied);
   filter0.Weight(Signal_MA_Weight);
//--- Creation of trailing object
   CTrailingFixedPips *trailing=new CTrailingFixedPips;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Set trailing parameters
   trailing.StopLevel(Trailing_FixedPips_StopLevel);
   trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- Creation of money object
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Set money parameters
   money.Percent(Money_FixLot_Percent);
   money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(-8);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-9);
     }
//--- ok
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+

Код советника состоит из нескольких секций.

Секция, описывающая свойства программы:

#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

Включаемые файлы:

#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>

Код класса CExpert, экземпляр которого используется в советнике, располагается в файле Expert.mqh.

В файле SignalCrossEMA.mqh содержится код выбранного нами класса торговых сигналов CSignalMA, в файле TrailingFixedPips.mqh находится код используемого нами класса алгоритма сопровождения открытых позиций CTrailingFixedPips, управление капиталом и рисками будет осуществляться при помощи класса CMoneyFixedLot, содержащегося в файле MoneyFixedLot.mqh.

Далее следуют входные параметры советника:

//--- inputs for expert
input string              Expert_Title                  ="TestExpert"; // Document name
ulong                    Expert_MagicNumber            =23320;        // 
bool                     Expert_EveryTick              =false;        // 
//--- inputs for main signal
input int                Signal_ThresholdOpen          =10;           // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose         =10;           // Signal threshold value to close [0...100]
input double             Signal_PriceLevel             =0.0;          // Price level to execute a deal
input double             Signal_StopLevel              =50.0;         // Stop Loss level (in points)
input double             Signal_TakeLevel              =50.0;         // Take Profit level (in points)
input int                Signal_Expiration             =4;            // Expiration of pending orders (in bars)
input int                Signal_MA_PeriodMA            =85;           // Moving Average(85,0,...) Period of averaging
input int                Signal_MA_Shift               =0;            // Moving Average(85,0,...) Time shift
input ENUM_MA_METHOD      Signal_MA_Method              =MODE_SMA;      // Moving Average(85,0,...) Method of averaging
input ENUM_APPLIED_PRICE  Signal_MA_Applied             =PRICE_CLOSE;    // Moving Average(85,0,...) Prices series
input double             Signal_MA_Weight              =1.0;          // Moving Average(85,0,...) Weight [0...1.0]
//--- inputs for trailing
input int                Trailing_FixedPips_StopLevel  =30;           // Stop Loss trailing level (in points)
input int                Trailing_FixedPips_ProfitLevel=50;           // Take Profit trailing level (in points)
//--- inputs for money
input double             Money_FixLot_Percent          =10.0;         // Percent
input double             Money_FixLot_Lots             =0.1;          // Fixed volume

Первые три параметра (Expert_Title, Expert_MagicNumber и Expert_EveryTick) являются общими, они присутствуют всегда вне зависимости от выбранных алгоритмов торговых сигналов, трейлинга и управления капиталом и риском.

Строковой параметр Expert_Title определяет наименование советника, Expert_MagicNumber задает идентификатор советника (это значение будет использоваться в параметрах торговых запросов), при помощи параметра Expert_EveryTick задается режим работы советника. При Expert_EveryTick=true эксперт будет осуществлять вызов функции обработки (проверка торговых условий, проведение торговых операций, сопровождение открытой позиции) каждый раз при поступлении нового тика по рабочему символу.

После общих параметров советника располагаются входные параметры выбранного алгоритма торговых сигналов, они имеют префикс "Signal_". Например, в выбранном нами модуле CSignalMA период скользящей средней определяется значением параметра Signal_MA_PeriodMA.

Выбранный нами способ сопровождения открытых позиций СTrailingStopFixedPips осуществляет сопровождение открытой позиции на фиксированном расстоянии, определяемом уровнями Stop Loss и Take Profit, значения которых задаются в "обычных" 2/4 знаковых пунктах. При движении цены в направлении открытой позиции на расстояние, большее чем количество пунктов, заданных уровнем Trailing_FixedPips_StopLevel, эксперт модифицирует значение ценовых уровней Stop Loss и Take Profit (при Trailing_FixedPips_ProfitLevel>0).

Входные параметры Money_FixLot_Percent и Money_FixLot_Lots соответствуют параметрам алгоритма торговли с фиксированным лотом, реализованного в классе CMoneyFixedLot. В нашем случае торговля будет производится с фиксированным объемом, равным значению параметра Money_FixLot_Lots.

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

После входных параметров советника декларируется объект ExtExpert класса CExpert:

CExpert ExtExpert;

Это экземпляр класса торговой стратегии.

Объект ExtExpert, будучи экземпляром класса CExpert, содержит ссылки на объекты-потомки классов CExpertSignal (базовый класс торговых сигналов), CExpertMoney (базовый класс управления капиталом и рисками) и CExpertTrailing (базовый класс сопровождения открытых позиций). Помимо этого, класс CExpert содержит экземпляры классов CExpertTrade, СSymbolInfo, CAccountInfo, CPositionInfo, COrderInfo, а также контейнер CIndicators.

Настройка параметров советника заключается в создании экземпляров соответствующих классов и указании классу ExtExpert ссылок на созданные объекты.

Рассмотрим подробнее функцию инициализации советника OnInit, в которой производится инициализация и настройка свойств класса ExtExpert.


1. Инициализация класса ExtExpert:

//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }

Инициализация объекта ExtExpert производится вызовом метода Init, в котором устанавливается символ, таймфрейм, флаг вызова методов обработки на каждом тике, идентификатор эксперта, а также создаются и инициализируются внутренние объекты классов (на этом этапе в качестве объектов сигналов, трейлинга и управления капиталом используются базовые классы CExpertSignal, CExpertMoney, CExpertTrailing).

В случае неудачной инициализации объекта ExtExpert советник закончит работу с кодом возврата -1.

Далее следует инициализация объекта CExpertSignal. В случае ошибки инициализации советник закончит работу с кодом возврата -2.


2. Создание и настройка свойств объекта Signal

//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalMA
   CSignalMA *filter0=new CSignalMA;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodMA(Signal_MA_PeriodMA);
   filter0.Shift(Signal_MA_Shift);
   filter0.Method(Signal_MA_Method);
   filter0.Applied(Signal_MA_Applied);
   filter0.Weight(Signal_MA_Weight);

Настройка объекта торговых сигналов состоит из нескольких этапов:

  • Создание объекта торговых сигналов и установка его параметров;
  • Создание объекта модуля торговых сигналов, установка его параметров и добавление в экземпляр класса CExpertSignal;

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

В зависимости от того как были заданы параметры при создании советника через Мастер MQL5, генерируется соответствующий код.

//--- Set signal parameters
   filter0.PeriodMA(85);                      //--- параметр был задан фиксированным в Мастере MQL5
                                                    //--- (серая иконка - фиксированное значение, равное 85)
   filter0.SlowPeriod(Signal_MA_Shift;        //--- параметр был задан input-переменной
                                                    //--- (голубая иконка - входной параметр эксперта)

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


3. Создание и настройка свойств объекта Trailing

//--- Creation of trailing object
   CTrailingFixedPips *trailing=new CTrailingFixedPips;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Set trailing parameters
   trailing.StopLevel(Trailing_FixedPips_StopLevel);
   trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);

Настройка объекта трейлинга также состоит из 4 этапов:

  • Создание объекта трейлинга (Creation of trailing object);
  • Инициализация созданного объекта трейлинга в объекте ExtExpert (Add trailing to expert);
  • Установка параметров объекта трейлинга (Set trailing parameters);

В случае неудачной инициализации объекта трейлинга советник закончит работу с кодом возврата (от -4 до -5), зависящем от этапа, на котором произошла ошибка.


4. Создание и настройка свойств объекта money

//--- Creation of money object
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Set money parameters
   money.Percent(Money_FixLot_Percent);
   money.Lots(Money_FixLot_Lots);

Настройка объекта управления капиталом и рисками также состоит из 4 этапов:

  • Создание объекта money (Creation of money object);
  • Инициализация созданного объекта money в объекте ExtExpert (Add money to expert);
  • Установка параметров объекта money (Set money parameters);

В случае неудачной инициализации объекта money советник закончит работу с кодом возврата (от -6 до -7), зависящем от этапа, на котором произошла ошибка.


5. Инициализация всех индикаторов, используемых в классах

//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(-8);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-9);
     }
//--- ok
   return(0);

После создания и инициализации объектов торговых сигналов, трейлинга и управления капиталом вызывается метод ValidationSettings() объекта ExtExpert, в котором производится проверка настроек и метод InitIndicators(), в котором производится инициализация индикаторов, используемых в объектах signal, trailing и money.

Обработка событий OnDeinit, OnTick, OnTrade и OnTimer осуществляется вызовом соответствующих методов класса ExtExpert.

С подробностями реализации методов класса CExpert можно ознакомится в коде индикатора, расположенном в файле \папка терминала\MQL5\Include\Expert\expert.mqh


3. Проверка созданного советника в тестере стратегий MetaTrader 5

Если все компоненты Стандартной библиотеки присутствуют, код сгенерированного эксперта успешно компилируется:

Рис. 10. Успешная компиляция кода эксперта, созданного Мастером MQL5

Рис. 11. Успешная компиляция кода эксперта, созданного Мастером MQL5

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

Работу построенной торговой системы можно проверить при помощи Тестера стратегий терминала MetaTrader 5. На рис. 11 приведены результаты тестирования на исторических данных с параметрами по умолчанию (EURUSD, H1, период тестирования: 2010.01.01-2011.06.01):

Рис. 11. Результаты тестирования советника на исторических данных (EURUSD, H1)

Рис. 12. Результаты тестирования советника на исторических данных (EURUSD, H1)


Наилучший набор параметров советника можно найти при помощи оптимизации в тестере стратегий терминала MetaTrader 5.


Заключение

Использование классов торговых стратегий значительно упрощает создание и проверку торговых идей. Теперь код эксперта можно конструировать прямо в редакторе MetaEditor при помощи Мастера MQL5 на базе готовых модулей Стандартной библиотеки либо при помощи своих собственных модулей.

Если же вы не хотите или не можете написать собственный модуль торговых сигналов, то всегда можно обратиться в сервис Работа и заказать даже не сам код торгового робота, а только необходимый модуль. Такой подход дает дополнительные преимущества:

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

Прикрепленные файлы |
testexpert__3.mq5 (7.49 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (14)
Victor Kirillin
Victor Kirillin | 24 дек. 2010 в 11:52
Jager:

Вот и я про то... 

GBPUSD, H1, верно.

 

Вот на другом компе, тоже самое.

 

Виноват. Нашли ошибку. Результаты улучшения кода. Исправлено. Скоро будет.
Jager
Jager | 24 дек. 2010 в 14:05
uncleVic:
Виноват. Нашли ошибку. Результаты улучшения кода. Исправлено. Скоро будет.
Хорошо, будем ждать.
Denis Kirichenko
Denis Kirichenko | 22 дек. 2011 в 15:52

Обработка событий OnDeinit, OnTick, OnTrade и OnTimer осуществляется вызовом соответствующих методов класса ExtExpert.

Наверное правильнее так:

"Обработка событий Deinit, NewTick, Trade и Timer осуществляется вызовом соответствующих методов класса ExtExpert."

bivmail
bivmail | 12 мар. 2012 в 07:13

Добрый!

Для начинающих, расшифруйте, пожалуйста, вот этот способ инициализации переменной:

   CExpertSignal *signal=new CExpertSignal;

а то плаваю много...Спасибо!

Механическая Торговая Система "Вилка Чувашова" Механическая Торговая Система "Вилка Чувашова"
В данной статье вашему вниманию предлагается краткий обзор методики и программный код стратегии механической торговой системы по методике Станислава Чувашова. Рассматриваемый анализ состояния рынка перекликается с подходом Т. Демарка к построению линий тренда для последнего ближайшего отрезка времени, в качестве опорных точек для построения трендовых линий используются фракталы.
Андрей Войтенко: "Ошибки программирования стоили мне 15 000" (ATC 2010) Андрей Войтенко: "Ошибки программирования стоили мне 15 000" (ATC 2010)
Андрей Войтенко впервые принимает участие в Чемпионате Automated Trading Championship 2010, но торгует его эксперт вполне по-взрослому. Уже которую неделю советник Андрея идет в первой десятке и не собирается уступать завоеванные позиции конкурентам. В интервью разработчик рассказывает об особенностях своего эксперта, допущенных им ошибках и цене, которую пришлось за них заплатить.
Мастер MQL5: Как написать свой модуль торговых сигналов Мастер MQL5: Как написать свой модуль торговых сигналов
Генератор торговых стратегий Мастера MQL5 значительно упрощает проверку торговых идей. В статье рассказывается о том, как написать и подключить в Мастер MQL5 свой собственный класс торговых сигналов с реализацией сигналов по пересечению ценой скользящей средней, рассматривается структура и формат описания созданного класса для Мастера MQL5.
Создание мульти-экспертов на основе торговых моделей Создание мульти-экспертов на основе торговых моделей
Использование объектно-ориентированного подхода в MQL5 значительно упрощает создание мультивалютных/мультисистемных/мультитаймфреймовых экспертов. Только представьте, ваш один единственный эксперт торгует сразу по нескольким десяткам торговых стратегий, сразу на всех доступных инструментах и сразу на всех возможных таймфреймах! К тому же этот эксперт прекрасно тестируется в тестере, а для всех стратегий, входящих в его состав, действует одна или сразу несколько систем управления капиталом.