Руководство к продукту "MT5 Optimization Booster"

Руководство к продукту "MT5 Optimization Booster"

30 августа 2024, 14:49
Andrey Dik
0
12

Уважаемые трейдеры и инвесторы! Представляем вам MT5 Optimization Booster – инновационный продукт, который перевернет ваши представления об оптимизации на MetaTrader 5!

MT5 Optimization Booster предназначен для расширения возможностей штатного оптимизатора. Booster позволяет использовать очень точное торговое окружение штатного тестера/оптимизатора и при этом "выключить" все его ограничения:

  1. Неограниченное количество параметров для оптимизации.
  2. Неограниченный шаг параметров для оптимизации.
  3. Неограниченное количество прогонов.
  4. Непревзойденная скорость и точность схождения.
  5. Легкость использования.
  6. Полная загрузка всех ядер процессора.

Для того чтобы воспользоваться преимуществами оптимизации Вашего советника с помощью  MT5 Optimization Booster Вам потребуется внести небольшие изменения в код советника.

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

//+----------------------------------------------------------------------------+
//|                                                  Copyright 2024, Your Name |
//|                                       https://login.mql5.com/ru/users/user |
//+----------------------------------------------------------------------------+
#property copyright "Copyright 2024, Your Name"
#property link      "https://login.mql5.com/ru/users/user"

//------------------------------------------------------------------------------
#import "..\..\..\Market\MT5 Optimization Booster.ex5"
void AddRange     (double rangeMin, double rangeStep, double rangeMax);
bool AddRangeDone ();
bool GetInputs    (double &inputs []);
void SaveResult   (double ff);
#import
//------------------------------------------------------------------------------

Код выше предназначен для вызова функций бустера (который по умолчанию расположен в папке \MQL5\Experts\Market\) из советника. Если Вы переместили Бустер в другую папку, то поправьте путь к нему в коде выше.

Далее, вставьте в код строку с параметром-счетчиком, который будет перебирать штатный оптимизатор вместо Ваших параметров:

//------------------------------------------------------------------------------
input int    CNT_P   = 0;
//------------------------------------------------------------------------------

Предположим, в советнике есть следующие параметры, которые требуется оптимизировать:

//------------------------------------------------------------------------------
enum Timeframe
{
  M1, M5, M15, H1, D1
};

input Timeframe ChartTimeframe  = H1;
input int       IndPeriod       = 10;
input double    IndAlpha        = 0.1;
input bool      UseTrailingStop = true;
//------------------------------------------------------------------------------

Сделайте эти параметры простыми глобальными переменными, убрав перед их объявлением "input", после этой операции код будет выглядеть так:

//------------------------------------------------------------------------------
enum Timeframe
{
  M1, M5, M15, H1, D1
};
/*
input Timeframe ChartTimeframe  = H1;
input int       IndPeriod       = 10;
input double    IndAlpha        = 0.1;
input bool      UseTrailingStop = true;
*/
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
Timeframe ChartTimeframe  = H1;
int       IndPeriod       = 10;
double    IndAlpha        = 0.1;
bool      UseTrailingStop = true;
//------------------------------------------------------------------------------

Далее, вставьте в функцию OnInit () в самом начале следующий код:

//——————————————————————————————————————————————————————————————————————————————
int OnInit ()
{
  //For EA in the "Optimization" mode-------------------------------------------
  if (MQLInfoInteger (MQL_OPTIMIZATION))
  {
    AddRange (0, 1, 4);                //Timeframe ChartTimeframe  = H1;
    AddRange (6, 3, 30);               //int       IndPeriod       = 10;
    AddRange (0.0001, 0.0000001, 0.2); //double    IndAlpha        = 0.1;
    AddRange (0, 1, 1);                //bool      UseTrailingStop = true;

    if (!AddRangeDone ())
    {
      return INIT_FAILED;
    }
  }
  //----------------------------------------------------------------------------

В функцию AddRange () передайте параметры оптимизации соответствующих оптимизируемых параметров (минимум диапазона, шаг, максимум диапазона). Этот код передаст команду Бустеру о конфигурации Ваших оптимизируемых параметров. Устанавливайте значения диапазона и шага в любых пределах, ограничений нет.

Далее вставьте к код следующие строки сразу за предыдущими, описанными выше:

//——————————————————————————————————————————————————————————————————————————————
int OnInit ()
{
  //For EA in the "Optimization" mode-------------------------------------------
  if (MQLInfoInteger (MQL_OPTIMIZATION))
  {
    AddRange (0, 1, 4);                //Timeframe ChartTimeframe  = H1;
    AddRange (6, 3, 30);               //int       IndPeriod       = 10;
    AddRange (0.0001, 0.0000001, 0.2); //double    IndAlpha        = 0.1;
    AddRange (0, 1, 1);                //bool      UseTrailingStop = true;

    if (!AddRangeDone ())
    {
      return INIT_FAILED;
    }
  }
  //----------------------------------------------------------------------------

  //For EA in all modes---------------------------------------------------------
  double inputs [4];

  if (!GetInputs (inputs))
  {
    return INIT_FAILED;
  }
  else
  {
    ChartTimeframe  = (Timeframe)inputs [0];
    IndPeriod       = (int)inputs       [1];
    IndAlpha        = inputs            [2];
    UseTrailingStop = inputs            [3];
  }
  //----------------------------------------------------------------------------

Код выше получает из файла значения настроек оптимизируемых параметров в массив "inputs [4]" (здесь 4 - количество оптимизируемых параметров).

Пропишите присвоение каждой переменной оптимизируемого параметра значения массива  "inputs" в том же порядке, что и при задании их диапазона и шага как показано выше.

Проверьте, теперь код функции OnInit должен выглядеть так:

//——————————————————————————————————————————————————————————————————————————————
int OnInit ()
{
  //For EA in the "Optimization" mode-------------------------------------------
  if (MQLInfoInteger (MQL_OPTIMIZATION))
  {
    AddRange (0, 1, 4);                //Timeframe ChartTimeframe  = H1;
    AddRange (6, 3, 30);               //int       IndPeriod       = 10;
    AddRange (0.0001, 0.0000001, 0.2); //double    IndAlpha        = 0.1;
    AddRange (0, 1, 1);                //bool      UseTrailingStop = true;

    if (!AddRangeDone ())
    {
      return INIT_FAILED;
    }
  }
  //----------------------------------------------------------------------------

  //For EA in all modes---------------------------------------------------------
  double inputs [4];

  if (!GetInputs (inputs))
  {
    return INIT_FAILED;
  }
  else
  {
    ChartTimeframe  = (Timeframe)inputs [0];
    IndPeriod       = (int)inputs       [1];
    IndAlpha        = inputs            [2];
    UseTrailingStop = inputs            [3];
  }
  //----------------------------------------------------------------------------

  /*
  Here is the rest of your advisor's code.
  ...
  ...
  ...
  */

  return (INIT_SUCCEEDED);
}
//——————————————————————————————————————————————————————————————————————————————

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

//——————————————————————————————————————————————————————————————————————————————
double OnTester ()
{
  double ret = TesterStatistics (STAT_COMPLEX_CRITERION);
  
  //-----------------------------------------------------------------------------
  SaveResult (ret);
  //-----------------------------------------------------------------------------
  return ret;
}
//——————————————————————————————————————————————————————————————————————————————

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

Итак, больше никаких правок в советнике делать не нужно.

Работа с Бустером происходит в таком порядке:

1. Зайти в оптимизатор (тестер) МТ5 и настраиваете даты начала и окончания оптимизации на истории, а так же все остальные параметры, которые необходимы (символ и другие).

2. Установить режим оптимизации (медленный, полный перебор параметров), так как теперь оптимизацией будет управлять Бустер.

3. Зайти в настройки советника и установить галочку для параметра CNT_P и установить значения и шаг таким образом, чтобы обеспечить необходимое количество прогонов.

 

4. Запустить оптимизацию, выбрав все локальные агенты. Если ядер процессора 4 и менее, то рекомендуется оставить один агент не включенным.

5. Запустить Бустер на любом графике любого символа любого таймфрейма. Бустер выведет окно с запросом выбора папки советника. Выбрать папку советника и Бустер начнет свою работу! После этого на чарте появится окно Бустера:

Окно Бустера показывает красным цветом свою активность (бегущий счетчик), Лучший найденный результат, Количество отправленных заданий и Количество выполненных заданий, а так же Количество выполненных заданий на каждом агенте.

6. Если результаты устраивают, можно остановить оптимизацию в любой момент: Сначала остановить оптимизатор МТ5, а после этого остановить Бустер, нажав кнопку с крестиком.


Если запустить советник, подготовленный по рекомендации выше в работу на чарт, то советник прочитает лучшие настройки, подготовленные после оптимизации Бустером, и приступит к работе.

Успехов Вам в оптимизации и достижении наилучших результатов в торговле!