使用MetaTrader 5的策略测试器,交易者可以在每次测试后获得交易系统的统计参数。
这些统计参数可以通过 TesterStatistics() 函数获得,该函数在 OnTester() 和 OnDeinit() 函数中被调用。
随着用于处理优化结果的函数的推出(如 FrameFirst(), FrameFilter(), FrameNext(), FrameInputs() 和 FrameAdd()),交易者现在可以进行可视化优化。在优化过程中,必要的数据可以实时处理和显示。
在这里,我们将通过一个专家顾问测试结果可视化的示例,进一步探讨在文章 “在MetaTrader 5测试器中可视化策略” 中描述的内容。
1. 优化过程中的余额动态可视化
1.1. 下载文件
将 Moving Averages_With_Frames.mq5 专家顾问复制到 terminal_data_folder\MQL5\Experts 目录下。
专家顾问操作所需文件:
- FrameGenerator.mqh - CFrameGenerator 类用于显示优化结果;
- SpecialChart.mqh - CSpecialChart 类用于绘制多个余额图;
- SimpleTable.mqh - CSimpleTable 类是一个包含两列的简单表格;
- ColorProgressBar.mqh - CColorProgressBar 类是一个使用两种颜色的进度条。
这些文件应复制到 terminal_data_folder\MQL5\Include 目录下。
可以通过MetaTrader 5终端自动下载代码库程序(在“工具箱”窗口的CodeBase标签中)。选择“下载”即可将所有代码下载并放置在相应的文件夹中。

图1. 通过MetaTrader 5终端下载CodeBase程序
1.2. 测试专家顾问
在策略测试器中启动 Moving Averages_With_Frames.mq5 专家顾问。
测试设置:

图2. Moving Averages_With_Frames.mq5 测试设置
优化选项:

图3. Moving Averages_With_Frames.mq5 优化参数
在优化过程中,专家顾问会显示余额动态和优化经过的统计数据:

图4. Moving Averages_With_Frames.mq5 优化
1.3. 专家顾问的运作原理
Moving Averages_With_Frames.mq5 专家顾问基于标准MetaTrader 5终端包中的 Moving Averages.mq5 创建。
已添加用于结果可视化的代码:
//--- 连接处理优化结果的代码 #include <FrameGenerator.mqh> //--- 框架生成器 CFrameGenerator fg; //+------------------------------------------------------------------+ //| 测试函数 | //+------------------------------------------------------------------+ double OnTester() { //--- 插入你的优化标准计算函数在这里 double TesterCritetia=MathAbs(TesterStatistics(STAT_SHARPE_RATIO)*TesterStatistics(STAT_PROFIT)); TesterCritetia=TesterStatistics(STAT_PROFIT)>0?TesterCritetia:(-TesterCritetia); //--- 在每次测试后调用并将优化标准作为参数传递 fg.OnTester(TesterCritetia); //--- return(TesterCritetia); } //+------------------------------------------------------------------+ //| 测试初始化函数 | //+------------------------------------------------------------------+ void OnTesterInit() { //--- 准备图表以显示多个余额线 fg.OnTesterInit(3); // 参数设置图表上余额线的数量 } //+------------------------------------------------------------------+ //| 测试经过函数 | //+------------------------------------------------------------------+ void OnTesterPass() { //--- 处理获得的测试结果并显示图形 fg.OnTesterPass(); } //+------------------------------------------------------------------+ //| 测试去初始化函数 | //+------------------------------------------------------------------+ void OnTesterDeinit() { //--- 优化结束 fg.OnTesterDeinit(); } //+------------------------------------------------------------------+ //| 图表事件处理 | //+------------------------------------------------------------------+ void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- 在优化结束后点击标题时启动框架显示 fg.OnChartEvent(id,lparam,dparam,sparam,100); // 100是每次快照之间的暂停时间(毫秒) } //+------------------------------------------------------------------+
这段代码可以类似地用于任何专家顾问。
CFrameGenerator 类用于处理优化结果。该类包含用于处理策略测试器事件的函数 (OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit()) 和图表事件的函数 (OnChartEvent()). 在 CFrameGenerator 类的 OnTesterInit() 方法中准备了所使用的图形对象。
CFrameGenerator 类的 OnTester() 方法在每次测试后被调用。该方法根据交易结果计算余额曲线动态。余额曲线图是一个一维数组,其长度取决于执行的交易数量。
然后,使用 TesterStatistics() 函数请求统计数据(净利润、收益因子、回收因子、交易次数、交易数量、最大资金回撤百分比、自定义优化标准值),并生成一个框架(测试经过的数据数组),该框架通过 FrameAdd() 函数发送到终端(从测试代理)。
框架在 CFrameGenerator 类的 OnTesterPass() 方法中接收和处理。框架读取操作通过 FrameNext() 函数执行。请求生成框架的专家顾问输入参数通过 FrameInputs() 函数完成。
获得数据后,使用 CSimpleTable、CColorProgressBar 和 CSpecialChart 类的方法进行显示和更新。
需要注意的是,OnTester() 处理函数的执行是在当前优化经过结束后由 测试代理 执行的。这使得可以利用 MQL5云网络 的分布式网络能力进行复杂的数学计算。为此,将计算部分放置在 OnTester 事件处理程序中。
优化加速数学计算的示例(连续小波变换的 Weierstrass 函数)在主题 “实时管理优化过程并将大量数据从代理转移到MetaTrader 5” 中展示。
2. 使用 CSimpleTable、CColorProgressBar 和 CSpecialChart 类的示例
附加的 Test_SimpleTable.mq5 和 Test_CSpecialChart.mq5 脚本包含了使用 CSimpleTable、CColorProgressBar 和 CSpecialChart 类的示例。它们应复制到 terminal_data_folder\MQL5\Scripts 目录下。

图5. Test_SimpleTable.mq5 脚本操作结果

图6. Test_CSpecialChart.mq5 脚本操作结果
评论 0