• Обзор
  • Отзывы
  • Обсуждение (8)
  • Что нового

WalkForwardOptimizer

Библиотека WalkForwardOptimizer позволяет выполнить пошаговую и кластерную форвард-оптимизацию (walk-forward optimization) советника в МетаТрейдер 4.

Для использования необходимо включить заголовочный файл WalkForwardOptimizer.mqh в код советника и добавить необходимые вызовы функций.

Когда библиотека встроена в советник, можно запускать оптимизацию в соответствии с процедурой, описанной в Руководстве пользователя. По окончанию оптимизации промежуточные результаты сохраняются в csv-файл и набор глобальных переменных. Затем можно просмотреть и проанализировать их с помощью скрипта WalkForwardReporter, который создает различные отчеты в виде html-страниц. Скрипт - бесплатный.


Файл WalkForwardOptimizer.mqh

#define DAYS_PER_WEEK    7
#define DAYS_PER_MONTH   30
#define DAYS_PER_QUARTER (DAYS_PER_MONTH*3)
#define DAYS_PER_HALF    (DAYS_PER_MONTH*6)
#define DAYS_PER_YEAR    (DAYS_PER_MONTH*12)

#define SEC_PER_DAY     (60*60*24)
#define SEC_PER_WEEK    (SEC_PER_DAY*DAYS_PER_WEEK)
#define SEC_PER_MONTH   (SEC_PER_DAY*DAYS_PER_MONTH)
#define SEC_PER_QUARTER (SEC_PER_MONTH*3)
#define SEC_PER_HALF    (SEC_PER_MONTH*6)
#define SEC_PER_YEAR    (SEC_PER_MONTH*12)

#define CUSTOM_DAYS     -1

enum WFO_TIME_PERIOD {none = 0, year = DAYS_PER_YEAR, halfyear = DAYS_PER_HALF, quarter = DAYS_PER_QUARTER, month = DAYS_PER_MONTH, week = DAYS_PER_WEEK, day = 1, custom = CUSTOM_DAYS};

enum WFO_ESTIMATION_METHOD {wfo_built_in_loose, wfo_built_in_strict, wfo_profit, wfo_sharpe, wfo_pf, wfo_drawdown, wfo_profit_by_drawdown, wfo_profit_trades_by_drawdown, wfo_average, wfo_expression};

extern WFO_TIME_PERIOD wfo_windowSize = year;
extern int wfo_customWindowSizeDays = 0;
extern WFO_TIME_PERIOD wfo_stepSize = quarter;
extern int wfo_customStepSizePercent = 0;
extern int wfo_stepOffset = 0;
extern string wfo_outputFile = "";
extern WFO_ESTIMATION_METHOD wfo_estimation = wfo_built_in_loose;
extern string wfo_formula = "";

#import "WalkForwardOptimizer.ex4"
void wfo_setEstimationMethod(WFO_ESTIMATION_METHOD estimation, string formula);
void wfo_setHeader(string s);
void wfo_setPFmax(double max);
void wfo_setGVAutomaticCleanup(bool b);
void wfo_setCleanUpTimeout(int seconds);
int wfo_OnInit(WFO_TIME_PERIOD optimizeOn, WFO_TIME_PERIOD optimizeStep, int optimizeStepOffset, int optimizeCustomW, int optimizeCustomS, string optimizeLog);
int wfo_OnTick();
double wfo_OnTester(string payload = "");
void wfo_setCloseTradesOnSeparationLine(bool b);
#import


Пример использования в коде советника

#include <WalkForwardOptimizer.mqh>

...

int OnInit()
{
  ...

  wfo_setEstimationMethod(wfo_estimation, wfo_formula); // wfo_built_in_loose by default
  wfo_setHeader("EnvelopeRange,EnvelopeLength"); // "Payload" by default
  wfo_setPFmax(100); // DBL_MAX by default
  
  // can be set to true, only if genetics not used
  // wfo_setGVAutomaticCleanup(true); // false by default
  
  // wfo_setCloseTradesOnSeparationLine(true); // false by default

  // this is the only required call in OnInit, all parameters come from the header
  int r = wfo_OnInit(wfo_windowSize, wfo_stepSize, wfo_stepOffset, wfo_customWindowSizeDays, wfo_customStepSizePercent, wfo_outputFile);
  
  return(r);
}

double OnTester()
{
  // the passed string with optimizable work parameters of EA should match specified header in wfo_setHeader
  // the parameter is optional, you may have EA without parameters
  // the call to wfo_OnTester is required
  return wfo_OnTester(DoubleToStr(EnvelopeRange, 1) + "," + IntegerToString(EnvelopeLength));
}

void OnTick()
{
  int wfo = wfo_OnTick(); // required in OnTick
  if(wfo == -1) // this tick is before optimization window
  {
    return;
  }
  else if(wfo == +1) // this tick is after optimization window and forward test
  {
    return;
  }
  
  ...
  // your actual code goes here
}
Нет отзывов
Версия 1.4 - 2017.06.13
Исправлена ошибка с переполнением в вычислении шага для больших размеров окна (более 2-х лет).
Версия 1.3 - 2017.05.23
Улучшено быстродействие за счет ранней остановки оптимизационных проходов, для которых окно in-sample данных заходит за дату настроек окончания тестера. Такие проходы обрываются в OnInit с ошибкой INIT_PARAMETERS_INCORRECT. Это преднамеренное поведение.
Версия 1.2 - 2016.08.29
Добавлена функция void wfo_setCleanUpTimeout(int seconds), позволяющая упростить автоматическое удаление старых csv-файлов в Tester/Files и глобальных переменных, наличие которых могло приводить к получению некорректного состояния данных. Подробности - в документации и Обсуждении.

Исправлена проблема с обработкой окон оптимизации, выходящих за границы периода.