Обсуждение статьи "Создание собственных критериев оптимизации параметров эксперта" - страница 3

 

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

Я начал с проблемы, когда мои стратегии прорыва и движения по тренду имели тенденцию подстраиваться под несколько сверхприбыльных сделок. Прибыль от этих нескольких сделок была настолько велика, что оптимизатор "заботился" только об этих нескольких сделках и использовал широкие стопы и дальние тейк-профиты, а также следил за тем, чтобы его сигнал ловил и доил эти несколько сделок по максимуму. Это происходило даже на 20-летних выборках со 100's сделок. Даже при оптимизации по соотношению dd и прибыли он все равно стремился к прогонам с этими сделками любой ценой, потому что прогоны составляли 90% его прибыли. Я хотел каким-то образом ограничить это поведение, не отрезая голову страту прорыва/опережения тренда. Я обнаружил, что оптимизация для относительного процента дд (НЕ отношение дд к прибыли, только относительный процент дд и ничего больше) дает хорошие результаты при условии, что соблюдается минимум сделок и минимальный коэффициент прибыли (около 1,3).


//............... 

sinput double mint; //Минимальное количество сделок для оптимизации. Накладывает штраф на прогоны с меньшим количеством сделок. 

sinput double minpf; //Минимальный коэффициент прибыли для целей оптимизации. Будет налагать штраф на прогоны с меньшим pf.

//...............

double OnTester()

{ 

	 double dd=TesterStatistics(STAT_BALANCE_DDREL_PERCENT);//равновесие вместо баланса также хорошо работает в дальнейшем

	 double pf=TesterStatistics(STAT_PROFIT_FACTOR);

	 int    tt=TesterStatistics(STAT_TRADES); 

	 double custom=(100-dd);

	 if (mint>t) custom=custom*(tt/mint); // налагает штраф, если не соблюдены минимальные условия торговли

	 if (minpf>minpf) custom=custom*((pf-1)/(minpf-1)) // Эта линия также приводит к тому, что проигрышные тиражи становятся отрицательными, а также накладывает штраф на меньший пф.

	 return(custom); 

}

 

 

Кажется неправильным не учитывать прибыль, но благодаря минимальному критерию pf в верхней части появляются в основном довольно прибыльные прогоны. Отсечение dd из прибыльных прогонов обычно увеличивает прибыль. В любом случае, отбирая более прибыльные сделки и тщательно дорабатывая их вручную (как, например, в конце этой замечательной статьи https://www.mql5.com/ru/articles/156), я могу позволить оптимизатору сделать большую часть первоначальной работы, избегая при этом подгонки кривых. Я экспериментировал и получил смешанные результаты с таким кодом, как показано ниже. (Эксперименты должны включать изменение риска и начального баланса, как только вы начнете вводить дополнительные весовые коэффициенты поверх процентной оценки)

//.............

sinput double pfw // Весовой коэффициент прибыли 

//.............

        double custom=(100-dd)+(pf-1)*pfw;
//...........
Guide to Testing and Optimizing of Expert Advisors in MQL5
Guide to Testing and Optimizing of Expert Advisors in MQL5
  • 2010.10.12
  • Samuel
  • www.mql5.com
This article explains the step by step process of identifying and resolving code errors as well as the steps in testing and optimizing of the Expert Advisor input parameters. You will learn how to use Strategy Tester of MetaTrader 5 client terminal to find the best symbol and set of input parameters for your Expert Advisor.
 

Кто может подсказать будет ли эта статья применима для МТ4? Вроде бы он уже многие свойства перенял от МТ5.

В общем моя задача стоит в получение просто значений LR Correlation и LR Standard Error в тестере МТ4, как это возможно легко видеть в тестере МТ5.

Хочу просто в функции deinit() по окончанию прогона в тесте считать эти же значения и записывать например в файл вместе со значением оптимизируемого параметра.

Может быть кто-то подобные вещи уже делал и поделится со мной готовым результатом (необходимой функцией расчёта значений LR Correlation и LR Standard Error), чтобы не изобретать велосипед?

 
solandr:

Кто может подсказать будет ли эта статья применима для МТ4? Вроде бы он уже многие свойства перенял от МТ5.

В общем моя задача стоит в получение просто значений LR Correlation и LR Standard Error в тестере МТ4, как это возможно легко видеть в тестере МТ5.

Хочу просто в функции deinit() по окончанию прогона в тесте считать эти же значения и записывать например в файл вместе со значением оптимизируемого параметра.

Может быть кто-то подобные вещи уже делал и поделится со мной готовым результатом (необходимой функцией расчёта значений LR Correlation и LR Standard Error ), чтобы не изобретать велосипед?

Пример расчета LR Correlation и LR Standard Error по сделкам в истории есть в AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4).
 
Automated-Trading:
Пример расчета LR Correlation и LR Standard Error по сделкам в истории есть в AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4).
Спасибо! Буду разбираться.
 
solandr:
Спасибо! Буду разбираться.

Разобрался. Вроде корреляция рассчитывается.

Единственный момент, над которым пришлось подумать, это тот факт, что в тестере МТ4 Build 670 не работает вот этот момент:

//--- получение первоначального баланса
      if(order_type==6) // OP_BALANCE=6
        {
         if(NormalizeDouble(OrderProfit()+OrderSwap(),2)>=0.0)
            if(balance==0.0)
               balance=OrderProfit();
        }

В тестере просто нет ордеров с типом 6.

То есть на прогоне в тестере МТ4 и использовании кода из UseAlglib.mq4, входящего в состав скачиваемого zip файла, через вызов из функции deinit() 

balance остаётся равен 0. И далее печатается ошибка "Торговые операции при нулевом балансе".

Пришлось просто вставить в сам код необходимое значение начального баланса в тестере МТ4 и тогда всё прекрасно стало считаться.

Возможно разработчики смогут этот момент учесть в дальнейших версиях библиотеки.

 

Я протестировал Kelly Criterion (стратегию), используя следующий код:


double OnTester(void)
  {
   //https://www.investopedia.com/articles/trading/04/091504.asp
   double w=((TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES))>0)?TesterStatistics(STAT_PROFIT_TRADES)/(TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES)):0; // вероятность выигрыша
   double r=((TesterStatistics(STAT_GROSS_LOSS)!=0)&&(TesterStatistics(STAT_LOSS_TRADES)!=0)&&(TesterStatistics(STAT_PROFIT_TRADES)!=0))?(TesterStatistics(STAT_GROSS_PROFIT)/TesterStatistics(STAT_PROFIT_TRADES))/(-TesterStatistics(STAT_GROSS_LOSS)/TesterStatistics(STAT_LOSS_TRADES)):0; // Соотношение побед и поражений;
   double Kelly=(r!=0)?w-((1-w)/r):0; // Kelly Criterion
   return(Kelly);
  }


Я не уверен, что Metatrader Strategy Tester считает 0 (нулевые) сделки с прибылью как сделки с прибылью. Кто-нибудь знает?

 
Ingvar Engelbrecht:

Ну, вот и я снова здесь, одинокий волк в этой вселенной :-)

Я пробовал критерии прямолинейности Custom Criteria, пытаясь подставить в уравнение наклон рассчитанной прямой. В таком виде он может дать вам очень высокий рейтинг при очень слабой прибыли. Просто добавляю конечную прибыль

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

Это не идеальное решение, но оно ближе к тому, что я хочу видеть. Использование результата вместе с балансом или прибылью отлично работает для меня с этим кодом


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

Я нашел рабочее публичное решение здесь https://community.darwinex.com/t/equity-curve-straigthness-optimization-with-metatrader/3976

Equity Curve Straigthness Optimization with Metatrader
Equity Curve Straigthness Optimization with Metatrader
  • 2018.05.16
  • KlondikeFX
  • community.darwinex.com
An underrated feature of Metatrader’s Backtester is its ability to define a custom fitness function for the genetic optimization process. Meaning that you no longer are limited to rather simple metrics like final balance or profit factor but can evaluate the quality of each test run with your own individual calculations. To give a quick...
 

В соответствующем руководстве слишком много информации, например, о программировании советника, которая есть в других руководствах, и неприменима для среднего игрока, который, купив советник, имеет минимальные способности к программированию.

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

Какие критерии мне нужны :- Max balance with <20 Drawdown, MaxBalance with <10 Drawdown

 
Отличное чтение, одинокий волк здесь 😁
 
Спасибо за отличную статью, Дмитрий.

Всем "одиноким волкам": вы на правильном пути, создавая строгие критерии тестирования и автоматизируя их. Конечно, есть несколько разных способов взглянуть на одну и ту же задачу, и, читая комментарии здесь, кажется, что консенсус заключается в компромиссе между балансом, просадкой, RRR и некоторой мерой прибыли (фактор прибыли, критерий Келли и т.д.).
Я пришел к этой статье, пытаясь сделать то же самое, и желая, чтобы Тестер Стратегий сделал это за меня; рад, что я не одинок :)