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

WalkForwardOptimizer MT5

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

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

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

Внимание! Оптимизацию нельзя прерывать - по нажатию кнопки Старт (в том числе, для возобновления приостановленного ранее процесса) запись результатов WF начинается с начала. MQL5 API не позволяет определить, запускается ли новая оптимизация или продолжается старая.


Файл 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};

#import "WalkForwardOptimizer.ex5"
void wfo_setEstimationMethod(WFO_ESTIMATION_METHOD estimation, string formula);
void wfo_setPFmax(double max);
void wfo_setCloseTradesOnSeparationLine(bool b);
void wfo_OnTesterPass();
int wfo_OnInit(WFO_TIME_PERIOD optimizeOn, WFO_TIME_PERIOD optimizeStep, int optimizeStepOffset, int optimizeCustomW, int optimizeCustomS);
int wfo_OnTick();
double wfo_OnTester();
void wfo_OnTesterInit(string optimizeLog);
void wfo_OnTesterDeinit();
#import

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


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

#include <WalkForwardOptimizer.mqh>

...

int OnInit(void)
{
  // ваш рабочий код здесь
  ...

  wfo_setEstimationMethod(wfo_estimation, wfo_formula); // по-умолчанию wfo_built_in_loose
  wfo_setPFmax(100); // по-умолчанию DBL_MAX
  // wfo_setCloseTradesOnSeparationLine(true); // по-умолчанию false
  
  // единственный обязательный вызов в OnInit, все параметры - из заголовочного файла
  int r = wfo_OnInit(wfo_windowSize, wfo_stepSize, wfo_stepOffset, wfo_customWindowSizeDays, wfo_customStepSizePercent);
  
  return(r);
}

void OnTesterInit()
{
  wfo_OnTesterInit(wfo_outputFile); // требуется
}

void OnTesterDeinit()
{
  wfo_OnTesterDeinit(); // требуется
}

void OnTesterPass()
{
  wfo_OnTesterPass(); // требуется

}

double OnTester()
{
  return wfo_OnTester(); // требуется
}

void OnTick(void)
{
  int wfo = wfo_OnTick();
  if(wfo == -1)
  {
    // можно выполнить неторговые операции, например, сбор статистики
    return;
  }
  else if(wfo == +1)
  {
    // можно выполнить неторговые операции
    return;
  }

  // ваш рабочий код здесь
  ...
}
Winsor Hoang
4590
Winsor Hoang 2017.05.23 21:54 
 

This is a must tool for all system developers. I waited 5 years for someone at Metaquotes to develop a Walk Forward Optimization. Stanislav is a godsend. He managed to create this WFO library utilizing cloud computing. Finally, we have a similar system development tool compared to TradeStation, Multicharts, NinjaTrader and etc. I received a great product and responsive support from the Developer. I highly endorse this product.

Версия 1.6 2017.12.19
Улучшение: Добавлена функция wfo_setCustomPerformanceMeter(FUNCPTR_WFO_CUSTOM funcptr), с помощью которой можно предоставить библиотеке ссылку на собственную функцию расчета эффективности торговли, если недостаточно возможностей формулы в функции wfo_setEstimationMethod(WFO_ESTIMATION_METHOD estimation, string formula). В коде эксперта должны быть реализована функция типа FUNCPTR_WFO_CUSTOM (подробности см. в документации).
Версия 1.5 2017.06.12
Исправлена ошибка с переполнением в вычислении шага для больших размеров окна (более двух лет).
Версия 1.4 2017.06.01
Усовершенствование: когда размер окна оптимизации или шаг тестирования постоянен, в кластерном отчете вместо нескольких таблиц выводится одна, в которую построчно сведены все показатели.
Версия 1.3 2017.05.31
Исправлена ошибка расчета дисперсий.