Оптимизируем стратегию по графику баланса и сравниваем результаты с критерием "Balance + max Sharpe Ratio"
Vladimir Karputov | 31 августа, 2017
Содержание
- 1. Введение
- 2. Как вычислить линию тренда для графика баланса?
- 2.1. Алгоритм расчёта критерия оптимизации
- 2.2. Вводим первую переменную TrendProfit
- 2.3. Переменная ProfitStability
- 3. Работаем с библиотекой ALGLIB
- 4. Подключение класса CBalanceRegression
- 4.1. Советник, сгенерированный Мастером MQL5
- 4.2. Советники на базе стандартного MACD Sample и Moving Average
- 5. Оптимизация на EURUSD, H4, без форвард-тестирования
- 5.1. EA test balance regression.mq5, EURUSD, H4, без форвард-тестирования
- 5.1.1 Тест #1
- 5.1.2. Сравнение скорости тестирования в домашней локальной сети из двух компьютеров и в облаке
- 5.1.3. Тест #2
- 5.1.4. Тест #3
- 5.2. Moving Average balance regression.mq5, EURUSD, H4, без форвард-тестирования
- 5.3. MACD Sample balance regression.mq5, EURUSD, H4, без форвард-тестирования
- 6. Оптимизация на EURUSD, M15, c форвард-тестированием
- 6.1. Советник "EA test balance regression.mq5", форвард-тестирование
- 6.2. Советник "MACD Sample balance regression.mq5", форвард-тестирование
- 6.3. Советник "Moving Average balance regression.mq5", форвард-тестирование
- 7. Заключение
1. Введение
В процессе работы у меня возникла следующая идея: нам уже недостаточно того, что график баланса растет на истории. Нужно еще и чтобы он был достаточно гладкий — то есть, чтобы среднеквадратичное отклонение от линии тренда было как можно меньше. Это значит, что помимо прибыльности мы хотим еще и стабильности. Для этого проверим еще один параметр оптимизации: проанализируем крутизну графика баланса и разброс отклонений его значений от линии регрессии.
Чтобы получить коэффициенты уравнения линейной регрессии и некоторые другие статистические характеристики, используем библиотеку численного анализа ALGLIB.
2. Как вычислить линию тренда для графика баланса?
Нам необходимо построить линию тренда для графика баланса таким образом, чтобы сумма квадратов отклонений от данной прямой была минимальной.
Коэффициенты уравнения вида y=ax+b для расчета линии находятся стандартным методом наименьших квадратов (МНК). Не будем приводить здесь все математические формулы для вычислений, просто воспользуемся готовой функцией в бибилиотеке ALGLIB и адаптируем её под наши нужды.
2.1. Алгоритм расчёта критерия оптимизации
Рассмотрим пример из пяти сделок:
Рис. 1. График баланса и линейная регрессия
Эти пять сделок формируют линию баланса "Balance" 1-2-3-4-5. Методом наименьших квадратов рассчитывается и проводится линия регрессии Linear regression" (расчёты выполняет библиотека численного анализа ALGLIB).
2.2. Вводим первую переменную TrendProfit.
Она означает прибыль на одну сделку для построенной линии регрессии:
Рис. 2. Параметр TrendProfit
Переменная рассчитывается как отношение высоты подъёма линии регрессии к количеству сделок. В свою очередь, высота подъема рассчитывается как разность между значениями линии регрессии в точке "B" и в точке "A".
Теперь нужно получить ошибку построения линии регрессии — то есть усредненное отклонение линии регрессии от линии баланса. Этот параметр мы назовем стандартным отклонением Баланса от линейной регрессии и обозначим как 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 будет равен:
Рис. 4. Рассчитанный LR Standard error
2.3. Переменная ProfitStability.
Этот параметр отвечает за сглаженность графика баланса. Наши задачи:
- чтобы линия регрессии была расположена к горизонту как можно более круто — это означает больше прибыли;
- чтобы среднеквадратичное отклонение линии баланса от линии регрессии было как можно меньше — это предполагает, что торговля более стабильна.
ProfitStability рассчитывается как отношение TrendProfit к LR Standard error:
Рис. 5. Переменная ProfitStability
Чтобы уменьшить влияние сделок с разными объёмами, можно переменную ProfitStability разделить на суммарный объём всех сделок.
3. Работаем с библиотекой ALGLIB
На данный момент (билд 1645) библиотека ALGLIB уже давно интегрирована в стандартную библиотеку: [date folder]\MQL5\Include\Math\Alglib\alglib.mqh
Рис. 6. Путь к библиотеке ALGLIB в стандартной библиотеке
Классы библиотеки ALGLIB
Для работы с линейной регрессией нам потребуются следующие классы:- класс CLinReg — основной класс расчёта линейной регрессии
- метод CLinReg::LRBuild — построение (расчёт) модели линейной регрессии
- метод CLinReg::LRUnpack — возврат коэффициентов линейной модели
- класс CLinearModel — вспомогательный класс
- класс CLRReport — структура, содержащая расширенную информацию о линейной модели. В частности, нас будет интересовать поле m_rmserror (среднеквадратичная ошибка).
Класс "BalanceRegression.mqh"
Вся работа по расчёту линейной регрессии и расчёт параметров будет выполняться в классе "Balance regression.mqh".
Методы класса
Установка параметров | |
---|---|
SetStartBalance | Устанавливаем начальный баланс |
SetFromDate | Устанавливаем начальную дату для запроса торговой истории |
SetVolumeNormalization | Устанавливает режим нормализации проторгованных объёмов |
Доступ к результатам расчётов | |
GetProfitStability | Доступ к результатам расчётов |
Методика работы с классом CBalanceRegression следующая.
- Устанавливаем начальный баланс — вызываем метод SetStartBalance.
- Устанавливаем начальную дату для запроса торговой истории — вызываем метод SetFromDate.
- Устанавливаем режим нормализации проторгованных объёмов — вызываем метод SetVolumeNormalization. Если мы хотим использовать нормализацию по проторгованному объёму — передаём true, иначе — false.
- Получаем результат расчёта — вызываем метод 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.mq5 | Moving 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, без форвард-тестирования
Чтобы не пропустить никаких вариантов и в то же время ускорить тестирование, я выбрал для оптимизации два параметра — граничные параметры для сигналов на открытие и на закрытие позиций:
Рис. 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"):
Рис. 8. Тестер, вкладка Настройки
5.1.2. Сравнение скорости тестирования в домашней локальной сети из двух компьютеров и в облаке
В домашней сети используются два компьютера:
- ноутбук на базе четырехъядерного процессора Intel Core i3-3120M @2.50GHz, 8077 MB, при этом в тесте использовались только три из четырёх агентов, так как терминалу нужно ещё и общаться с агентами на втором компьютере;
- настольный компьютер на базе шестиядерного процессора AMD Phenom II X6 1075T Processor, 4058 MB, при этом из шести агентов в тестировании участвовали только четыре, чтобы не перегревать процессор.
Рис. 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 |
Рис. 10. Тест1, Оптимизация проход 346
5.1.3. Тест №2: оптимизация пользовательского параметра "Custom max", при этом параметр оптимизации проторгованных объёмов false.
Настройки тестера для Теста №2 (обратите внимание: параметр "Optimization" равен "Custom max"):
Рис. 11. Тестер, вкладка Настройки
Параметры тестера для Теста №2 (обратите внимание: параметр "Volume normalization" в столбце "Value" равен "false"):
Рис. 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 |
Рис. 13. EURUSDH4, Тест2 Оптимизация проход 270
Оптимизация по пользовательскому параметру "Custom max" отобрала результаты с меньшей доходностью, но зато с меньшей просадкой по средствам (столбец "Equity DD %"). Также в Тест2 оказалась меньшая просадка по балансу, что видно даже визуально, если сравнить рис. 12. и рис. 13.
5.1.4. Тест №3: оптимизация пользовательского параметра "Custom max" и при этом параметр оптимизации проторгованных объёмов true:
Настройки тестера для теста №3 (настройки — как и для Теста №2):
Рис. 14. Тестер, вкладка Настройки
Параметры тестера для Теста №3 (обратите внимание: параметр "Volume normalization" в столбце "Value" равен "true"):
Рис. 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, без форвард-тестирования
Для оптимизации выбраны следующие параметры:
Рис. 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:
Рис. 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"):
Рис. 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, без форвард-тестирования
Для оптимизации выбраны следующие параметры:
Рис. 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:
Рис. 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 |
Оптимизация графика баланса методом линейной регрессии сработала на уровне метода "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". Настройки тестера:
Рис. 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 |
Рис. 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 трейдов на форвард-участке. Конечно, это мало, но тест провести нужно:
Рис. 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 |
Рис. 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 |
Рис. 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 |
Рис. 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 |
Рис. 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 |
Рис. 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 |
Рис. 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 |
Метод оптимизации графика баланса методом линейной регрессии оказался сопоставимым со стандартным методом "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 |
Рис. 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 |
Рис. 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 |
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". Интересные результаты показали советники, которые торгуют динамическим лотом: для них в некоторых случаях настройка "нормализации проторгованных объёмов" в сочетании с форвард-тестированием позволяет увидеть более реальную картину.
Я делаю вывод, что рассмотренный метод имеет право на существование, и его можно ещё улучшить: например, начать учитывать длительность прибыльных и убыточных трейдов, и дальше экспериментировать с полученными показателями.