WalkForwardOptimizer
- Libraries
- Stanislav Korotky
- Version: 1.6
- Updated: 19 October 2020
- Activations: 5
Once the library is embedded into EA, you may start optimization according to the procedure described in the User guide. When it's finished, intermediate results are saved into a csv-file and some special global variables. Then you can view and analyse the results by means of accompanying script WalkForwardReporter, which generates comprehensible reports as html-pages. The script is free.
Header file 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
Example of usage in your source code
#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 }
This library is a must have if you are trying to do a Walk Forward Analysis on MT4, and the author was very helpful when I had asked him questions. I would rent again!