English 中文 Español Deutsch 日本語 Português
Оптимизируем стратегию по графику баланса и сравниваем результаты с критерием "Balance + max Sharpe Ratio"

Оптимизируем стратегию по графику баланса и сравниваем результаты с критерием "Balance + max Sharpe Ratio"

MetaTrader 5Тестер | 31 августа 2017, 14:52
7 378 2
Vladimir Karputov
Vladimir Karputov

Содержание


1. Введение

В процессе работы у меня возникла следующая идея: нам уже недостаточно того, что график баланса растет на истории. Нужно еще и чтобы он был достаточно гладкий — то есть, чтобы среднеквадратичное отклонение от линии тренда было как можно меньше. Это значит, что помимо прибыльности мы хотим еще и стабильности. Для этого проверим еще один параметр оптимизации: проанализируем крутизну графика баланса и разброс отклонений его значений от линии регрессии.

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


2. Как вычислить линию тренда для графика баланса?

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

Коэффициенты уравнения вида y=ax+b для расчета линии находятся стандартным методом наименьших квадратов (МНК). Не будем приводить здесь все математические формулы для вычислений, просто воспользуемся готовой функцией в бибилиотеке ALGLIB и адаптируем её под наши нужды.

2.1. Алгоритм расчёта критерия оптимизации

Рассмотрим пример из пяти сделок:

Pic. 1. Balance and Linear regression.png

Рис. 1. График баланса и линейная регрессия

Эти пять сделок формируют линию баланса "Balance" 1-2-3-4-5. Методом наименьших квадратов рассчитывается и проводится линия регрессии Linear regression" (расчёты выполняет библиотека численного анализа ALGLIB).

2.2. Вводим первую переменную TrendProfit. 

Она означает прибыль на одну сделку для построенной линии регрессии:

Pic. 2. Parameter TrendProfit

Рис. 2. Параметр TrendProfit

Переменная рассчитывается как отношение высоты подъёма линии регрессии к количеству сделок. В свою очередь, высота подъема рассчитывается как разность между значениями линии регрессии в точке "B" и в точке "A".

Теперь нужно получить ошибку построения линии регрессии — то есть усредненное отклонение линии регрессии от линии баланса. Этот параметр мы назовем стандартным отклонением Баланса от линейной регрессии и обозначим как LR Standard error:

Pic. 3. LR Standard error

Рис. 3. LR Standard error

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

В случае, рассмотренном на рис. 1, эти ошибки будут такими:

error #1 error #2 error #3 error #4 error #5
10000 - 10600 = - 600 12000 - 11200 = 800 11000 - 11800 = - 800 14000 - 12400 = 1600 12000 - 13000 = - 1000

Соответственно LR Standard error будет равен:

Pic. 4. Calculated LR Standard error

Рис. 4. Рассчитанный LR Standard error

2.3. Переменная ProfitStability.

Этот параметр отвечает за сглаженность графика баланса. Наши задачи:

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

ProfitStability рассчитывается как отношение TrendProfit к LR Standard error:

Pic. 5. Variable ProfitStability

Рис. 5. Переменная ProfitStability 

Чтобы уменьшить влияние сделок с разными объёмами, можно переменную ProfitStability разделить на суммарный объём всех сделок.


3. Работаем с библиотекой ALGLIB

На данный момент (билд 1645) библиотека ALGLIB уже давно интегрирована в стандартную библиотеку: [date folder]\MQL5\Include\Math\Alglib\alglib.mqh

Pic. 6. alglib

Рис. 6. Путь к библиотеке ALGLIB в стандартной библиотеке

Классы библиотеки ALGLIB 

Для работы с линейной регрессией нам потребуются следующие классы:
  • класс CLinReg — основной класс расчёта линейной регрессии
    • метод CLinReg::LRBuild — построение (расчёт) модели линейной регрессии
    • метод CLinReg::LRUnpack — возврат коэффициентов линейной модели
  • класс CLinearModel — вспомогательный класс
  • класс CLRReport — структура, содержащая расширенную информацию о линейной модели. В частности, нас будет интересовать поле m_rmserror  (среднеквадратичная ошибка).

Класс "BalanceRegression.mqh"

Вся работа по расчёту линейной регрессии и расчёт параметров будет выполняться в классе "Balance regression.mqh".

Методы класса

 Установка параметров
 SetStartBalance   Устанавливаем начальный баланс
 SetFromDate  Устанавливаем начальную дату для запроса торговой истории
 SetVolumeNormalization  Устанавливает режим нормализации проторгованных объёмов
 Доступ к результатам расчётов
 GetProfitStability  Доступ к результатам расчётов 


Методика работы с классом CBalanceRegression следующая.

  1. Устанавливаем начальный баланс — вызываем метод SetStartBalance.
  2. Устанавливаем начальную дату для запроса торговой истории — вызываем метод SetFromDate.
  3. Устанавливаем режим нормализации проторгованных объёмов — вызываем метод SetVolumeNormalization. Если мы хотим использовать нормализацию по проторгованному объёму — передаём true, иначе — false. 
  4. Получаем результат расчёта — вызываем метод GetProfitStability, и полученный результат возвращаем в процедуре OnTester.

3.1. Шаги расчёта (метод GetProfitStability)

В массиве arr_profits  будут храниться результаты сделок, у которых (комиссия + своп + прибыль) > 0.0. В переменной total_volume будет суммироваться объём всех сделок.

//---
   double   arr_profits[];                            // array of results deals 
   double   total_volume=0;                           // total volume

Далее обходим все сделки —  заполняем массив arr_profits и суммируем объём сделок в переменную total_volume:

//--- request trade history 
   HistorySelect(m_from_date,to_date);
   uint total_deals=HistoryDealsTotal();
   ulong ticket_history_deal=0;
//--- for all deals 
   for(uint i=0;i<total_deals;i++)
     {
      //--- try to get deals ticket_history_deal 
      if((ticket_history_deal=HistoryDealGetTicket(i))>0)
        {
         long     deal_type         =HistoryDealGetInteger(ticket_history_deal,DEAL_TYPE);
         double   deal_volume       =HistoryDealGetDouble(ticket_history_deal,DEAL_VOLUME);
         double   deal_commission   =HistoryDealGetDouble(ticket_history_deal,DEAL_COMMISSION);
         double   deal_swap         =HistoryDealGetDouble(ticket_history_deal,DEAL_SWAP);
         double   deal_profit       =HistoryDealGetDouble(ticket_history_deal,DEAL_PROFIT);

         if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL)
            continue;

         if(deal_commission==0.0 && deal_swap==0.0 && deal_profit==0.0)
            continue;

         total_volume+=deal_volume;

         int arr_size=ArraySize(arr_profits);
         ArrayResize(arr_profits,arr_size+1,50);   // resize the aray

         if(arr_size==0)
            arr_profits[arr_size]=GetSetStartBalance()+deal_commission+deal_swap+deal_profit;
         else
            arr_profits[arr_size]=arr_profits[arr_size-1]+deal_commission+deal_swap+deal_profit;

         int d=0;
        }
     }

Обратите внимание: когда делаем самую первую запись в массив arr_profits, суммируем начальный баланс и финансовый результат сделки. Для всех последующих записей суммируем предыдущую запись и финансовый результат сделки.

Объявляем объект класса CMatrixDouble. По сути своей, это матрица. Заполним ее: номер сделки (начинаем в "1") и финансовый результат сделки.

//--- CMatrixDouble object
   CMatrixDouble xy(arr_size,2);
   for(int i=0;i<arr_size;i++)
     {
      xy[i].Set(0,i+1);
      xy[i].Set(1,arr_profits[i]);
      //Print(arr_profits[i]); // for debag
     }

Объявляем объекты нужных классов (CLinReg, CLinearModel, CLRReport) и строим (рассчитываем) линейную регрессию:

//--- linear regression construction
   CLinReg        linear_regression;
   CLinearModel   linear_model;
   CLRReport      linear_report;
   int retcode;
   linear_regression.LRBuild(xy,arr_size,1,retcode,linear_model,linear_report);
   if(retcode!=1)
     {
      Print("Linear regression failed, error code=",retcode);
      return(0.0);
     }
   int nvars;
   double coefficients[];
   linear_regression.LRUnpack(linear_model,coefficients,nvars);
   double coeff_a=coefficients[0];
   double coeff_b=coefficients[1];
   PrintFormat("y = %.1f x + %.1f",coeff_a,coeff_b);

Наконец, для получения заветных коэффициентов уравнения линии вида y = a*x + b вызываем метод LRUnpack. Наши искомые коэффициенты будут находиться в массиве coefficients.

Теперь, когда линейная регрессия при помощи библиотеки ALGLIB рассчитана и построена, можно приступить непосредственно к расчётам параметра, ради которого и задумывалась эта статья.

//--- сalculation of parameters
   double TrendProfit=((double)arr_size*coeff_a+coeff_b)-(1.0*coeff_a+coeff_b);  // the projection of the regression line on the "Y" axis 
   TrendProfit/=(double)arr_size;                                                // divided by the number of trades
   double TrendMSE=linear_report.m_rmserror;                                     // root mean square error on a training set
   double ProfitStability=TrendProfit/TrendMSE;
//--- normalize the trading volume
   if(GetVolumeNormalization())
      ProfitStability/=total_volume;
//--- we multiply by the number of deals - we aren't interested in passes which have few deals
   ProfitStability*=arr_size;
//---
   return(ProfitStability*10000.0);

В зависимости от начального параметра, задаваемого через метод SetVolumeNormalization, мы или делим параметр ProfitStability на суммарный проторгованный объём, или не делим. Результат умножаем на 10000 — это делается для лучшего представления результатов.


4. Подключение класса CBalanceRegression

Рассмотрим алгоритм подключения класса CBalanceRegression  для различных советников. 

4.1. Советник, сгенерированный Мастером MQL5

Мы хотим проверить влияние нормализации проторгованных объёмов на результаты. Значит, нам нужен советник, который будет динамически рассчитывать объёмы открываемых позиций. Это можно сделать в Мастере MQL5: выбрать пункт Советник (сгенерировать) и на странице "Управление капиталом" подключить один из модулей управления капиталом:

  • "Trading with fixed margin" — расчёт лота в процентом отношении от свободной маржи
  • "Trading with fixed risk" — расчёт лота в процентном отношении от баланса
  • "Trading with optimized trade volume" — расчёт лота в зависимости от торговой истории

Для этой статьи я выбрал модуль управления капиталом "Trading with fixed risk", а сам советник назвал "EA test balance regression.mq5". На его примере я покажу, как подключить включаемый файл класса CBalanceRegression.

Шаг 1. Подключаем файл класса CBalanceRegression и объявляем объект этого класса (m_balance_regression).

ВНИМАНИЕ: файл класса CBalanceRegression должен быть расположен в папке [data folder]\MQL5\Include\Balance regression.

//--- available money management
#include <Expert\Money\MoneyFixedRisk.mqh>
//--- available module Balance Regression
#include <Balance regression\BalanceRegression.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+

и

//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
CBalanceRegression m_balance_regression;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+

Шаг 2. Во входные параметры добавляем параметр, отвечающий за включение/отключение нормализации проторгованных объёмов:

input double             Money_FixRisk_Percent=10.0;                            // Percentage of risk
//--- inputs for balance normalization
input bool               InpVolumeNormalization=true;                           // Volume normalization
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+

Шаг 3. Устанавливаем параметры для объекта m_balance_regression класса CBalanceRegression: начальную дату для запроса торговой истории и режим нормализации проторгованных объёмов:

//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Set parameters of CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- Initializing expert

Шаг 4. Добавляем в самый конец файла процедуру OnTester. Здесь будем получать пользовательский критерий оптимизации (путем вызова GetProfitStability) и передавать параметр в тестер:

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

4.2. Советники на базе стандартного MACD Sample и Moving Average

Оригиналы советников находятся в [data folder]\MQL5\Experts\Examples\MACD\MACD Sample.mq5 и [data folder]MQL5\Experts\Examples\Moving Average\Moving Average.mq5 соответственно.

Как мы поступаем: необходимо взять оригинальные советники и сохранить их копии под другими именами. Я выбрал имена "MACD Sample balance regression.mq5" и "Moving Average balance regression.mq5".

Шаг 1. Подключаем файл класса CBalanceRegression и объявляем объект этого класса (m_balance_regression).

ВНИМАНИЕ: файл класса CBalanceRegression должен быть расположен в папке [data folder]\MQL5\Include\Balance regression.

MACD Sample balance regression.mq5Moving Average balance regression.mq5
#include <Trade\AccountInfo.mqh>
//--- available module Balance Regression
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;
//---
input double InpLots          =0.1; // Lots
#include <Trade\Trade.mqh>
//--- available module Balance Regression
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

Шаг 2. Во входные параметры добавляем параметр, отвечающий за включение/отключение нормализации проторгованных объёмов:

MACD Sample balance regression.mq5 Moving Average balance regression.mq5
input int    InpMATrendPeriod =26;  // MA trend period
//--- inputs for balance normalization
input bool   InpVolumeNormalization=true; // Volume normalization
//---
int ExtTimeOut=10; // time out in seconds between trade operations
input int    MovingShift        = 6;       // Moving Average shift
//--- inputs for balance normalization
input bool   InpVolumeNormalization=true;  // Volume normalization
//---
int    ExtHandle=0;

Шаг 3. Устанавливаем параметры для объекта m_balance_regression класса CBalanceRegression — начальную дату для запроса торговой истории и режим нормализации проторгованных объёмов:

MACD Sample balance regression.mq5  Moving Average balance regression.mq5
//+------------------------------------------------------------------+
//| Initialization and checking for input parameters                 |
//+------------------------------------------------------------------+
bool CSampleExpert::Init(void)
  {
//--- Set parameters of CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- initialize common information
  
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- Set parameters of CBalanceRegression
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- prepare trade class to control positions if hedging mode is active

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

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

5. Оптимизация на EURUSD, H4, без форвард-тестирования

Итак, у нас есть три советника, на которых проверим идею об оптимизации графика баланса методом регрессии. При этом два советника ("EA test balance regression.mq5" и "Moving Average balance regression.mq5") в процессе торговли рассчитывают объём позиции динамически, а советник "MACD Sample balance regression.mq5" при торговле использует фиксированный лот.

5.1. EA test balance regression.mq5, EURUSD, H4, без форвард-тестирования

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

Pic. 7. Tester, Inputs tab

Рис. 7. Тестер, вкладка Параметры

  • Тест № 1: оптимизация стандартного параметра "Balance + max Sharp Ratio", 
  • Тест № 2: оптимизация пользовательского параметра "Custom max", и при этом параметр оптимизации проторгованных объёмов false, 
  • Тест № 3: оптимизация пользовательского параметра "Custom max", и при этом параметр оптимизации проторгованных объёмов true.

5.1.1 Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio".

Настройки тестера для теста №1 (обратите внимание: параметр "Optimization" равен "Balance + max Sharpe Ratio"):

Pic. 8. Tester, Settings tab

Рис. 8. Тестер, вкладка Настройки

5.1.2. Сравнение скорости тестирования в домашней локальной сети из двух компьютеров и в облаке

В домашней сети используются два компьютера:

  1. ноутбук на базе четырехъядерного процессора Intel Core i3-3120M @2.50GHz, 8077 MB, при этом в тесте использовались только три из четырёх агентов, так как терминалу нужно ещё и общаться с агентами на втором компьютере;
  2. настольный компьютер на базе шестиядерного процессора AMD Phenom II X6 1075T Processor, 4058 MB, при этом из шести агентов в тестировании участвовали только четыре, чтобы не перегревать процессор.

Pic. 9. Optimization in the home network

Рис. 9. Оптимизация в домашней локальной сети

Тест1 в домашней сети прошёл за 21 минуту и 43 секунды.

Теперь кешированные результаты теста я удалю и запущу Тест №1 в облаке на MQL5 Cloud Europe 1. В облаке тестирование заняло 1 минуту 09 секунд. Стоимость тестирования составила $0.06.

Результат тестирования Тест №1, сортировка столбца "Result" по убыванию, пять лучших результатов:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
346 4349,76 17818,98 181,83 1,28 1,45 0,16 27989,31 60,48 98 30 100
345 4349,76 17818,98 181,83 1,28 1,45 0,16 27989,31 60,48 98 25 100
344 4349,76 17818,98 181,83 1,28 1,45 0,16 27989,31 60,48 98 20 100
343 4349,76 17818,98 181,83 1,28 1,45 0,16 27989,31 60,48 98 15 100
327 4349,76 17818,98 181,83 1,28 1,45 0,16 27989,31 60,48 98 30 95

Pic. 10. Test1, Optimization pass 346

Рис. 10. Тест1, Оптимизация проход 346

5.1.3. Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false.

Настройки тестера для Теста №2 (обратите внимание: параметр "Optimization" равен "Custom max"):

Pic. 11. Tester, Settings tab

Рис. 11. Тестер, вкладка Настройки

Параметры тестера для Теста №2 (обратите внимание: параметр "Volume normalization" в столбце "Value" равен "false"):

Pic. 12. Tester, Inputs tab

Рис. 12. Тестер, вкладка Параметры

Результат Теста №2, сортировка столбца "Result" по убыванию, пять лучших результатов:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
270 40085,45 11072,30 93,04 1,12 0,90 0,11 40085,45 41,18 119 30 80
269 40085,45 11072,30 93,04 1,12 0,90 0,11 40085,45 41,18 119 25 80
268 40085,45 11072,30 93,04 1,12 0,90 0,11 40085,45 41,18 119 20 80
267 40085,45 11072,30 93,04 1,12 0,90 0,11 40085,45 41,18 119 15 80
251 40085,45 11072,30 93,04 1,12 0,90 0,11 40085,45 41,18 119 30 75


Pic. 13. EURUSDH4, Test2 Optimization pass 270

Рис. 13. EURUSDH4, Тест2 Оптимизация проход 270

Оптимизация по пользовательскому параметру "Custom max" отобрала результаты с меньшей доходностью, но зато с меньшей просадкой по средствам (столбец "Equity DD %"). Также в Тест2 оказалась меньшая просадка по балансу, что видно даже визуально, если сравнить рис. 12. и рис. 13.

5.1.4. Тест №3: оптимизация пользовательского параметра "Custom max" и при этом параметр оптимизации проторгованных объёмов true:

Настройки тестера для теста №3 (настройки — как и для Теста №2):

Pic. 14. Tester, Settings tab

Рис. 14. Тестер, вкладка Настройки

Параметры тестера для Теста №3 (обратите внимание: параметр "Volume normalization" в столбце "Value" равен "true"):

Pic. 15. Tester, Inputs tab

Рис. 15. Тестер, вкладка Параметры

В облаке тестирование заняло 2 минуты 27 секунд, всё тестирование проходило на MQL5 Cloud Europe 1. Стоимость тестирования составила $0.08.

Результат Теста №3, сортировка столбца "Result" по убыванию, пять лучших результатов:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
346 92,11 17818,98 181,83 1,28 1,45 0,16 92,11253 60,48 98 30 100
345 92,11 17818,98 181,83 1,28 1,45 0,16 92,11253 60,48 98 25 100
344 92,11 17818,98 181,83 1,28 1,45 0,16 92,11253 60,48 98 20 100
343 92,11 17818,98 181,83 1,28 1,45 0,16 92,11253 60,48 98 15 100
327 92,11 17818,98 181,83 1,28 1,45 0,16 92,11253 60,48 98 30 95

Параметр проторгованных объёмов равный "true" в Тест3 определил те же лучшие варианты, что и Тест1. Это хороший показатель работы метода оптимизации графика баланса методом линейной регрессии.

Вывод: оптимизация графика баланса методом линейной регрессии позволила отобрать результаы не хуже или даже сопоставимые с методом оптимизации "Balance + max Sharp Ratio".

5.2. Moving Average balance regression.mq5, EURUSD, H4, без форвард-тестирования

Для оптимизации выбраны следующие параметры:

Pic. 16. Tester, Inputs tab

Рис. 16. Тестер, вкладка Параметры

Для советника Moving Average balance regression проведу три теста:

  • Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio", 
  • Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false, 
  • Тест №3: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов true.

Настройки тестера (валюта, метод генерации тиков, исторические рамки — такие же, как и на рис. 5).

5.2.1. Тест № 1 (оптимизация стандартного параметра "Balance + max Sharp Ratio") проведён в облаке. В облаке тестирование заняло 1 минуты 22 секунды, всё тестирование проходило на MQL5 Cloud Europe 1. Стоимость тестирования составила $0.03.

Результаты Тест1, сортировка столбца "Result" по убыванию, пять лучших результатов:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
19 3500,83 1209,31 28,79 2,89 2,74 0,31 280,3791 4,29 42 9 13
18 3500,83 1209,31 28,79 2,89 2,74 0,31 280,3791 4,29 42 8 13
17 3500,83 1209,31 28,79 2,89 2,74 0,31 280,3791 4,29 42 7 13
21 3438,91 1202,00 28,62 2,76 2,52 0,31 287,1098 4,59 42 11 13
20 3438,91 1202,00 28,62 2,76 2,52 0,31 287,1098 4,59 42 10 13

Проверим самый лучший проход №19:

Pic. 17. EURUSDH4, Test1 Optimization pass 19

Рис. 17. EURUSDH4, Тест1 Оптимизация проход 19

5.2.2. Тест №2 (оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false") проведён в облаке. В облаке тестирование заняло 0 минуты 00 секунд, так как результаты были подхвачены из кэша, хотя результаты и поменялись местами. Всё тестирование проходило на MQL5 Cloud Europe 2. Стоимость тестирования составила $0.00.

Результаты Теста №2, сортировка столбца "Result" по убыванию, пять лучших результатов:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
141 102076,24 1029,99 25,75 2,16 2,29 0,22 102076,2 3,93 40 14 22
140 102076,24 1029,99 25,75 2,16 2,29 0,22 102076,2 3,93 40 13 22
139 102076,24 1029,99 25,75 2,16 2,29 0,22 102076,2 3,93 40 12 22
142 101254,84 1037,87 25,95 2,15 2,31 0,22 101254,8 3,93 40 15 22
138 90936,41 960,67 24,02 2,09 2,08 0,21 90936,41 4,31 40 11 22

В самом верху таблицы проход 141 (у него максимальное значение в столбце "Result"):

Pic. 18. EURUSDH4, Test2 Optimization pass 141

Рис. 18. EURUSDH4, Тест2 Оптимизация проход 141

В Тесте №2 оптимизация графика баланса показала результат лучше, чем оптимизация по параметру "Balane + max Sharp Ratio".

5.2.3. Тест №3 (оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов true) проведён в облаке. В облаке тестирование заняло 1 минуту 13 секунд. Всё тестирование проходило на MQL5 Cloud Europe 2. Стоимость тестирования составила $0.05.

Результаты Теста №3, сортировка столбца "Result" по убыванию, пять лучших результатов:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
141 13869,05 1029,99 25,75 2,16 2,29 0,22 13869,05 3,93 40 14 22
140 13869,05 1029,99 25,75 2,16 2,29 0,22 13869,05 3,93 40 13 22
139 13869,05 1029,99 25,75 2,16 2,29 0,22 13869,05 3,93 40 12 22
142 13235,93 1037,87 25,95 2,15 2,31 0,22 13235,93 3,93 40 15 22
138 12542,95 960,67 24,02 2,09 2,08 0,21 12542,95 4,31 40 11 22

Тест №3 отобрал те же лучшие варианты, что и Тест №2. При этом параметр оптимизации проторгованных объёмов, равный "true" не внёс никаких корректив.

Вывод: оптимизация по пользовательскому параметру "Custom max" в обоих тестах (Тест №2 и Тест №3) смогла отобрать результаты лучше, чем в Тест №1. При этом в Тест №3 параметр оптимизации проторгованных объёмов, равный "true", не внёс никаких корректив.

5.3. MACD Sample balance regression.mq5, EURUSD, H4, без форвард-тестирования

Для оптимизации выбраны следующие параметры:

Pic. 19. Tester, Inputs tab

Рис. 19. Тестер, вкладка Параметры

Для советника MACD Sample balance regression проведу уже привычные три теста:

  • Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio"
  • Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false
  • Тест №3: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов true

Настройки тестера (валюта, метод генерации тиков, исторические рамки — такие же, как и на рис. 5).

5.3.1. Тест №1 (оптимизация стандартного параметра "Balance + max Sharp Ratio") проведён в облаке. В облаке тестирование заняло 3 минуты 55 секунд (так долго из-за того, что задание не было выполнено на некоторых медленных агентах, и поэтому 10 задач были розданы другим агентам), всё тестирование проходило на MQL5 Cloud Europe 1. Стоимость тестирования составила $0.04.

Результаты Теста №1:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 767049,82 363,32 24,22
3,87 74,02 24573559 0,91 15 25 50
136 767049,82 363,32 24,22
3,87 74,02 24573559 0,91 15 25 45
109 767049,82 363,32 24,22
3,87 74,02 24573559 0,91 15 25 40
82 767049,82 363,32 24,22
3,87 74,02 24573559 0,91 15 25 35
55 767049,82 363,32 24,22
3,87 74,02 24573559 0,91 15 25 30

На этом таймфрейме оказалось очень мало трейдов (от 13 до 16). Надеюсь, на более низком таймфрейме (M15) сделок будет больше — но эти тесты будут приведены ниже, в другом разделе, а пока лучший результат — №163:

Pic. 20. EURUSDH4, Test1 Optimization pass 163

Рис. 20. EURUSDH4, Тест1 Оптимизация проход 163

5.3.2. Тест №2 (оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false") проведён в облаке. В облаке тестирование заняло 0 минуты 00 секунд, так как результаты были подхвачены из кэша, хотя результаты и поменялись местами. Всё тестирование проходило на MQL5 Cloud Europe 2. Стоимость тестирования составила $0.00.

Результаты Теста №2:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 24573558,59 363,32 24,22
3,87 74,02 24573559 0,91 15 25 50
136 24573558,59 363,32 24,22
3,87 74,02 24573559 0,91 15 25 45
109 24573558,59 363,32 24,22
3,87 74,02 24573559 0,91 15 25 40
82 24573558,59 363,32 24,22
3,87 74,02 24573559 0,91 15 25 35
55 24573558,59 363,32 24,22
3,87 74,02 24573559 0,91 15 25 30

Тест №2 отобрал те же лучшие результаты (сравнивать нужно все столбцы, за исключением "Result"), что и Тест №1. 

5.3.3. Тест3 (оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов true") проведён в облаке. В облаке тестирование заняло 1 минуту 05 секунд. Всё тестирование проходило на MQL5 Cloud Europe 2. Cтоимость тестирования составила $0.05.

Результаты Теста №3:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
163 16382372,39 363,32 24,22
3,87 74,02 16382372 0,91 15 25 50
136 16382372,39 363,32 24,22
3,87 74,02 16382372 0,91 15 25 45
109 16382372,39 363,32 24,22
3,87 74,02 16382372 0,91 15 25 40
82 16382372,39 363,32 24,22
3,87 74,02 16382372 0,91 15 25 35
55 16382372,39 363,32 24,22
3,87 74,02 16382372 0,91 15 25 30
Тест №3 отобрал те же лучшие результаты (сравнивать нужно все столбцы, за исключением "Result"), что и Тесты №1 и №2.

Оптимизация графика баланса методом линейной регрессии сработала на уровне метода "Balance + max Sharp Ratio".


6. Оптимизация на EURUSD, M15, c форвард-тестированием

Итак, у нас есть всё те же три советника "EA test balance regression.mq5", "Moving Average balance regression.mq5 " и "MACD Sample balance regression.mq5". Отличие от предыдущих тестов: теперь тестируем на таймфрейме M15 и с включённым форвард-тестированием.

6.1. Советник "EA test balance regression.mq5", форвард тестирование, проведу три теста:

  • Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio"
  • Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false
  • Тест №3: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов true.

6.1.1. Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio". Настройки тестера:

Pic. 21. Tester, Settings tab

Рис. 21. Тестер, вкладка Настройки

Параметры тестера идентичны показанным на рис. 7.

В облаке тестирование заняло 2 минуты 14 секунд, всё тестирование проходило на MQL5 Cloud Europe 2. Стоимость тестирования составила $0.08.

Результаты оптимизации:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
352 23196,38 85836,92 721,32 1,47 2,03 0,24 2722,602 48,82 119 60 100
351 23196,38 85836,92 721,32 1,47 2,03 0,24 2722,602 48,82 119 55 100
333 23196,38 85836,92 721,32 1,47 2,03 0,24 2722,602 48,82 119 60 95
332 23196,38 85836,92 721,32 1,47 2,03 0,24 2722,602 48,82 119 55 95
314 23196,38 85836,92 721,32 1,47 2,03 0,24 2722,602 48,82 119 60 90

Pic. 22. EURUSDM15, Test1 Optimization pass 352

Рис. 22. EURUSDM15, Тест1 Оптимизация проход 352

Результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 216,48 11708,46 18,91 1,89 1,02 0,02 0,02 7172,395 9,33 10 100 80
283 216,48 11708,46 18,91 1,89 1,02 0,02 0,02 7172,395 9,33 10 95 80
282 216,48 11708,46 18,91 1,89 1,02 0,02 0,02 7172,395 9,33 10 90 80
281 216,48 11708,46 18,91 1,89 1,02 0,02 0,02 7172,395 9,33 10 85 80
265 216,48 11708,46 18,91 1,89 1,02 0,02 0,02 7172,395 9,33 10 100 75

Здесь лучшими оказались варианты, у которых всего 10 трейдов на форвард-участке. Конечно, это мало, но тест провести нужно:

Pic. 23. EURUSDM15, Test1 Forward pass 284

Рис. 23. EURUSDM15, Тест1 Форвард проход 284

6.1.2. Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false.

Лучшие результаты оптимизации (не форварда) :

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 180332,68 10820,37 309,15 4,67 6,80 0,56 180332,7 7,98 35 100 80
283 180332,68 10820,37 309,15 4,67 6,80 0,56 180332,7 7,98 35 95 80
282 180332,68 10820,37 309,15 4,67 6,80 0,56 180332,7 7,98 35 90 80
281 180332,68 10820,37 309,15 4,67 6,80 0,56 180332,7 7,98 35 85 80
265 180332,68 10820,37 309,15 4,67 6,80 0,56 180332,7 7,98 35 100 75

Pic. 24. EURUSDM15, Test2 Optimization pass 284

Рис. 24. EURUSDM15, Тест2 Оптимизация проход 284

Результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
284 -14294,76 180332,68 18,91 1,89 1,02 0,02 0,02 -14294,8 9,33 10 100 80
283 -14294,76 180332,68 18,91 1,89 1,02 0,02 0,02 -14294,8 9,33 10 95 80
282 -14294,76 180332,68 18,91 1,89 1,02 0,02 0,02 -14294,8 9,33 10 90 80
281 -14294,76 180332,68 18,91 1,89 1,02 0,02 0,02 -14294,8 9,33 10 85 80
265 -14294,76 180332,68 18,91 1,89 1,02 0,02 0,02 -14294,8 9,33 10 100 75

В Тесте №2 форвард-тестирование показало те же результаты, что и в Тесте №1.

Оптимизация графика баланса методом линейной регрессии в Тесте №2 позволила найти результаты не хуже, чем в Тесте №1 (метод "Balance + max Sharp Ratio").

6.1.3. Тест №3: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов "true". В облаке тестирование заняло 3 минуты 29 секунд, всё тестирование проходило на MQL5 Cloud Europe 1. Стоимость тестирования составила $0.07.

Лучшие результаты оптимизации (не форварда):

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
208 1660,90 10008,05 285,94 4,50 6,55 0,56 1660,901 7,98 35 100 60
207 1660,90 10008,05 285,94 4,50 6,55 0,56 1660,901 7,98 35 95 60
206 1660,90 10008,05 285,94 4,50 6,55 0,56 1660,901 7,98 35 90 60
205 1660,90 10008,05 285,94 4,50 6,55 0,56 1660,901 7,98 35 85 60
189 1660,90 10008,05 285,94 4,50 6,55 0,56 1660,901 7,98 35 100 55


Pic. 25. EURUSDM15, Test3 Optimization pass 208

Рис. 25. EURUSDM15, Тест3 Оптимизация проход 208

В Тесте №3 включение опции "Нормализация проторгованных объёмов" не внесло серьёзных корректив в результаты. Также на оптимизируемом участке был найден один из лучших результатов.

Лучшие результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades Signal_ThresholdOpen Signal_ThresholdClose
266 -103,43 -25,56 -7464,56 -24,64 0,66 -0,99 -0,11 -103,428 75,43 303 10 80
247 -103,43 -25,56 -7464,56 -24,64 0,66 -0,99 -0,11 -103,428 75,43 303 10 75
228 -103,43 -25,56 -7464,56 -24,64 0,66 -0,99 -0,11 -103,428 75,43 303 10 70
209 -103,43 -25,56 -7464,56 -24,64 0,66 -0,99 -0,11 -103,428 75,43 303 10 65
156 -120,35 -29,28 -8013,01 -22,76 0,63 -1,00 -0,13 -120,35 80,44 352 30 50

Форвард-тестирование в Тесте №3 (параметр оптимизации проторгованных объёмов "true") показало ТОЛЬКО ОТРИЦАТЕЛЬНЫЕ результаты (смотрите столбец "Forward Result"). Это очень хороший результат стратегии оптимизации графика баланса методом линейной регрессии, так как для форвард-тестирования были отобраны самые точные и реалистичные результаты.

Оптимизация графика баланса методом линейной регрессии (параметр оптимизации проторгованных объёмов "false") позволяет находить результаты, сопоставимые с методом "Balance max + Sharp Ratio". При этом, когда параметр оптимизации проторгованных объёмов "true", результы форвард-тестирования позволили показать реальную картинку тестирования на данном таймфрейме.

6.2. Советник "MACD Sample balance regression.mq5", форвард-тестирование

6.2.1. Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio" проведён в облаке. В облаке тестирование заняло 1 минуты 03 секунды, всё тестирование проходило на MQL5 Cloud Europe 1. Стоимость тестирования составила $0.06.

Результаты оптимизации:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
171 2094,29 479,93 8,57 1,81 2,03 0,20 -1,69249 2,30 56 65 50
144 2094,29 479,93 8,57 1,81 2,03 0,20 -1,69249 2,30 56 65 45
182 2078,33 489,23 8,74 1,82 2,07 0,20 -9,9625 2,29 56 120 50
155 2077,49 489,03 8,73 1,82 2,07 0,20 -9,90369 2,29 56 120 45
181 2066,17 484,13 8,65 1,81 2,05 0,20 -8,1109 2,29 56 115 50


Pic. 26. EURUSDM15, Test1 Optimization pass 171

Рис. 26. EURUSDM15, Тест1 Оптимизация проход 171

Результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 1182,13 1659,86 83,87 5,24 1,43 0,42 0,12 -44,8452 1,95 16 140 30
77 1134,97 1659,86 78,87 4,93 1,41 0,40 0,11 -53,5369 1,95 16 135 30
105 1107,99 1639,60 78,17 4,89 1,40 0,39 0,11 -26,6428 1,96 16 140 35
76 1085,51 1659,86 73,87 4,62 1,38 0,37 0,11 -62,5775 1,95 16 130 30
171 1060,24 2094,29 62,97 3,94 1,32 0,36 0,11 -347,982 1,70 16 65 50


Pic. 27. EURUSDM15, Test1 Forward pass 78

Рис. 27. EURUSDM15, Тест1 Форвард проход 78

6.2.2. Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false.

Результаты оптимизации:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
168 84498,76 442,03 7,89 1,74 2,08 0,19 84498,76 2,07 56 50 50
141 84498,76 442,03 7,89 1,74 2,08 0,19 84498,76 2,07 56 50 45
114 84498,76 442,03 7,89 1,74 2,08 0,19 84498,76 2,07 56 50 40
167 83473,95 442,03 7,89 1,74 2,08 0,19 83473,95 2,06 56 45 50
140 83473,95 442,03 7,89 1,74 2,08 0,19 83473,95 2,06 56 45 45


Pic. 28. EURUSDM15, Test2 Optimization pass 168

Рис. 28. EURUSDM15, Тест2 Оптимизация проход 168

Результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 1182,13 1659,86 83,87 5,24 1,43 0,42 0,12 6462,158 1,95 16 140 30
77 1134,97 1659,86 78,87 4,93 1,41 0,40 0,11 5018,77 1,95 16 135 30
105 1107,99 1639,60 78,17 4,89 1,40 0,39 0,11 5617,275 1,96 16 140 35
76 1085,51 1659,86 73,87 4,62 1,38 0,37 0,11 3525,665 1,95 16 130 30
171 1060,24 2094,29 62,97 3,94 1,32 0,36 0,11 -5131,93 1,70 16 65 50

Pic. 29. EURUSDM15, Test2 Forward pass 78

Рис. 29. EURUSDM15, Тест2 Форвард проход 78

Оптимизация графика баланса методом регрессии в Тесте №2 показала результаты, сопоставимые с методом "Balance + max Sharp Ratio".

6.2.3. Тест №3: (оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов "true") проведён в облаке. В облаке тестирование заняло 1 минуту 44 секунды. Всё тестирование проходило на MQL5 Cloud Europe 1. Стоимость тестирования составила $0.08.

Результаты оптимизации:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
168 15089,06 442,03 7,89 1,74 2,08 0,19 15089,06 2,07 56 50 50
141 15089,06 442,03 7,89 1,74 2,08 0,19 15089,06 2,07 56 50 45
114 15089,06 442,03 7,89 1,74 2,08 0,19 15089,06 2,07 56 50 40
167 14906,06 442,03 7,89 1,74 2,08 0,19 14906,06 2,06 56 45 50
140 14906,06 442,03 7,89 1,74 2,08 0,19 14906,06 2,06 56 45 45

Результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades InpTakeProfit InpTrailingStop
78 4038,85 13138,16 83,87 5,24 1,43 0,42 0,12 4038,849 1,95 16 140 30
105 3510,80 13026,26 78,17 4,89 1,40 0,39 0,11 3510,797 1,96 16 140 35
77 3136,73 13138,16 78,87 4,93 1,41 0,40 0,11 3136,731 1,95 16 135 30
132 3074,09 13598,05 73,17 4,57 1,38 0,37 0,10 3074,089 1,96 16 140 40
159 2658,84 13777,31 68,47 4,28 1,35 0,35 0,10 2658,844 1,96 16 140 45
В Тест3 результаты оптимизации и форварда полностью совпали с результатами Теста №2 — то есть параметр "оптимизации проторгованных объёмов "true" в Тесте №3 не внёс никаких корректив. Это объясняется тем, то советник "MACD Sample balance regression.mq5 " торгует постоянным лотом.

Метод оптимизации графика баланса методом линейной регрессии оказался сопоставимым со стандартным методом "Balance max + Sharp Ratio".

6.3. Советник "Moving Average balance regression.mq5", форвард тестирование

6.3.1. Тест №1: оптимизация стандартного параметра "Balance + max Sharp Ratio". Тестер, вкладка "Параметры" аналогичны рис. 15. Тестер, вкладка "Настройки" аналогичны рис. 23.

В облаке тестирование заняло 1 минуту 28 секунд, всё тестирование проходило на MQL5 Cloud Europe 1. Стоимость тестирования составила $0.05.

Результаты оптимизации:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 -1,29 -16,76 -0,03 0,99 -0,03 0,00 11966,34 5,92 525 4 16
52 -1,29 -16,76 -0,03 0,99 -0,03 0,00 11966,34 5,92 525 3 16
165 -6,17 -24,02 -0,05 0,99 -0,03 0,00 -37045,4 6,66 465 12 24
166 -26,36 -49,14 -0,11 0,99 -0,07 0,00 -38052,8 6,86 465 13 24
163 -39,47 -61,88 -0,13 0,98 -0,09 0,00 -39156,1 6,62 465 10 24


Pic. 30. EURUSDM15, Test1 Optimization pass 53

Рис. 30. EURUSDM15, Тест1 Оптимизация проход 53

Результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 409,74 -460,18 185,78 1,06 1,16 0,80 0,04 42602,76 2,26 175 12 15
49 364,79 -461,14 165,23 0,94 1,14 0,67 0,04 38508,36 2,41 175 13 15
50 362,45 -460,40 164,15 0,94 1,14 0,66 0,04 38292,53 2,42 175 14 15
51 353,14 -467,05 159,83 0,91 1,13 0,65 0,03 37460,15 2,42 175 15 15
47 350,60 -629,53 144,32 0,82 1,13 0,65 0,03 32767,39 2,17 175 11 15


Pic. 31. EURUSDM15, Test1 Forward pass 48

Рис. 31. EURUSDM15, Тест1 Форвард проход 48

6.3.2. Тест №2оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false

Результаты оптимизации: 

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 11966,34 -16,76 -0,03 0,99 -0,03 0,00 11966,34 5,92 525 4 16
52 11966,34 -16,76 -0,03 0,99 -0,03 0,00 11966,34 5,92 525 3 16
54 2465,75 -103,27 -0,20 0,96 -0,14 -0,01 2465,748 7,19 525 5 16
57 813,83 -91,78 -0,17 0,97 -0,13 -0,01 813,831 6,75 525 8 16
56 813,83 -91,78 -0,17 0,97 -0,13 -0,01 813,831 6,75 525 7 16

Результаты форварда:

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 42602,76 -73708,28 185,78 1,06 1,16 0,80 0,04 42602,76 2,26 175 12 15
49 38508,36 -74600,92 165,23 0,94 1,14 0,67 0,04 38508,36 2,41 175 13 15
50 38292,53 -74386,41 164,15 0,94 1,14 0,66 0,04 38292,53 2,42 175 14 15
51 37460,15 -75315,40 159,83 0,91 1,13 0,65 0,03 37460,15 2,42 175 15 15
47 32767,39 -107616,36 144,32 0,82 1,13 0,65 0,03 32767,39 2,17 175 11 15
Оптимизация графика баланса методом линейной регрессии в Тесте №2 нашла те же результаты, что и Тест №1.

6.3.3. Тест3: (оптимизация пользовательского параметра "Custom max" и при этом параметр оптимизации проторгованных объёмов "true") проведён в облаке. В облаке тестирование заняло 0 минут 42 секунд. Всё тестирование проходило на MQL5 Cloud Europe 1. Cтоимость тестирования составила $0.04. 

Результаты оптимизации:

Pass Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
53 243,32 -16,76 -0,03 0,99 -0,03 0,00 243,3172 5,92 525 4 16
52 243,32 -16,76 -0,03 0,99 -0,03 0,00 243,3172 5,92 525 3 16
54 45,69 -103,27 -0,20 0,96 -0,14 -0,01 45,68738 7,19 525 5 16
57 13,40 -91,78 -0,17 0,97 -0,13 -0,01 13,40301 6,75 525 8 16
56 13,40 -91,78 -0,17 0,97 -0,13 -0,01 13,40301 6,75 525 7 16

Результаты форварда: 

Pass Forward Result Back Result Profit Expected Payoff Profit Factor Recovery Factor Sharpe Ratio Custom Equity DD % Trades DecreaseFactor MovingPeriod
48 1772,90 -997,81 185,78 1,06 1,16 0,80 0,04 1772,899 2,26 175 12 15
49 1591,91 -994,94 165,23 0,94 1,14 0,67 0,04 1591,912 2,41 175 13 15
50 1577,12 -987,34 164,15 0,94 1,14 0,66 0,04 1577,123 2,42 175 14 15
51 1537,14 -972,44 159,83 0,91 1,13 0,65 0,03 1537,142 2,42 175 15 15
47 1473,35 -1540,90 144,32 0,82 1,13 0,65 0,03 1473,354 2,17 175 11 15

Оптимизация графика баланса методом линейной регрессии в Тесте №3 полностью повторила результаты Теста №1. То есть включение опции оптимизации проторгованных объёмов "true" никак не повлияло на результат, хотя советник "Moving Average balance regression.mq5" использует в торговле динамический расчёт лота.

Метод оптимизации графика баланса методом линейной регрессии оказался сопоставимым со стандартным методом "Balance max + Sharp Ratio".


7. Заключение

Результаты оптимизации графика баланса методом линейной регрессии оказались на уровне метода оптимизации "Balance + max Sharp Ratio". Интересные результаты показали советники, которые торгуют динамическим лотом: для них в некоторых случаях настройка "нормализации проторгованных объёмов" в сочетании с форвард-тестированием позволяет увидеть более реальную картину.

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



Прикрепленные файлы |
MQL5.zip (11.35 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (2)
Aleksey Vyazmikin
Aleksey Vyazmikin | 18 нояб. 2017 в 06:46

Статья интересна примером использования стандартных библиотек для достижения цели. Использую анализ СКО баланса уже более двух лет на MT4 - очень нужный метод для советников с усреднением позиции.

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

СанСаныч Фоменко
СанСаныч Фоменко | 18 нояб. 2017 в 08:14

Недавно была опубликована статья (лень искать), в которой также использовалась "линейная регрессия". По ней я давал развернутый комментарий, повторю.

Оба автора совершают идентичные ошибки: они путают качественно разные понятие "линейная регрессия" и "линейная аппроксимация". Первая относится к случайным величинам, а вторая к детерминированным. Уравнения у них разнятся на случайную величину, которая суть ошибка. Не знаю как в Алглибе, но в любом нормальном пакете статистики учет ошибки выливается в ОЦЕНКУ коэффициентов регрессии, так как для них существует ошибка, которая может быть кратно больше номинала вычисленного коэффициента, что приводит к печальному результату: значение коэффициента вычислили, видим его, а в реальности его нет, и  использовать то, что видим, нельзя Это обстоятельство не учитывается в статье и для терминологии "линейная регрессия" статья совершенно не верна.


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

Создание и тестирование пользовательских символов в MetaTrader 5 Создание и тестирование пользовательских символов в MetaTrader 5
Возможность создавать собственные символы открывает новые горизонты в разработке торговых систем и анализе любых финансовых рынков. Теперь трейдеры могут строить графики и тестировать торговые стратегии на неограниченном количестве финансовых инструментов.
Оценка риска в последовательности сделок с одним активом Оценка риска в последовательности сделок с одним активом
В статье описано использование методов теории вероятностей и математической статистики при анализе торговых систем.
Треугольный арбитраж Треугольный арбитраж
Статья посвящена популярному методу торговли - треугольному арбитражу. Тема разобрана максимально подробно, рассмотрены положительные и отрицательные стороны стратегии, разработан готовый код эксперта.
Кроссплатформенный торговый советник: Временные фильтры Кроссплатформенный торговый советник: Временные фильтры
В статье обсуждается реализация различных методов временной фильтрации в кроссплатформенном торговом советнике. Классы временных фильтров отвечают за проверку того, попадает ли конкретное время в определенный период, заданный в настройках.