Уважаемые трейдеры и инвесторы! Представляем вам MT5 Optimization Booster – инновационный продукт, который перевернет ваши представления об оптимизации на MetaTrader 5!
MT5 Optimization Booster предназначен для расширения возможностей штатного оптимизатора. Booster позволяет использовать очень точное торговое окружение штатного тестера/оптимизатора и при этом "выключить" все его ограничения:
- Неограниченное количество параметров для оптимизации.
- Неограниченный шаг параметров для оптимизации.
- Неограниченное количество прогонов.
- Непревзойденная скорость и точность схождения.
- Легкость использования.
- Полная загрузка всех ядер процессора.
Для того чтобы воспользоваться преимуществами оптимизации Вашего советника с помощью 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, а после этого остановить Бустер, нажав кнопку с крестиком.
Если запустить советник, подготовленный по рекомендации выше в работу на чарт, то советник прочитает лучшие настройки, подготовленные после оптимизации Бустером, и приступит к работе.
Успехов Вам в оптимизации и достижении наилучших результатов в торговле!