并行回测框架搭建:用统一报告告别多品种手工比对(基础篇)
⚙️

并行回测框架搭建:用统一报告告别多品种手工比对(基础篇)

(1/3)·手工逐品种存报告再对比的老办法既慢又易漏,本篇铺垫多终端并行测试的理论底座

偏理论进阶 第 1/3 篇

不少交易员习惯在不同品种上跑完 EA 回测,再手动把每份报告存成文件挨个翻看。这种串行比对的盲区在于:你很难在同一时间轴上直观看出哪类行情下策略失效,而且文件一多就乱。把测试拆给多个终端同步跑,才是看清策略边界的起点。

◍ 用对比测试看清策略生死线

2016年12月23日发布的这组对比测试,在MT5社区拿到5427次查看,说明交易员对「同一思路不同写法孰优孰劣」有刚性需求。原文作者Vladimir Karputov给出的不是单个EA,而是若干变体的并列报告——这种横向拉齐条件的做法,比单晒一条曲线更难造假。 外汇与贵金属属高杠杆品种,回测胜出不代表实盘能活。但把多个测试放在同周期、同点差、同品种下比,至少能筛掉「靠过度拟合蒙混」的版本。 开MT5自己跑一遍最有效:建两个仅差一个过滤条件的EA,用同一段历史数据生成报告,重点看权益曲线回撤形状和交易次数衰减,而不是只看最终利润数。

「把 EA 拆进多终端并行回测的实操链路」

想在 MT5 里把一个 EA 跑成多配置并行测试,第一步永远是先在策略测试器里选定它,确认输入参数无误。这一步没选对,后面所有 ini 拆分都是空转。 接着回头盯住 common.ini。把它另存为 original.ini 留底,然后用正则去抓 [Common] 这一段,避免手动复制漏行。基于它生成 myconfiguration1~3.ini 以及汇总的 myconfiguration.ini,每个文件里都塞进 [Common] 和独立的 [Tester] 段,这样从属终端启动时才能各读各的。 第三步是动 EA 的 mq5 源码:必须确认里面有 #include 指令,以及 double OnTester() 函数体。如果代码已经挂了 DistributionOfProfits.mqh 或自带 OnTester(),就属于复杂情况,不能直接套模板,要手工合并逻辑,否则从属端回报会冲突。 把改完的 EA 拷进从属终端 MQL5/Experts 目录,拉起终端,跑完把几份报告并排比一下,差异点往往就藏在 [Tester] 的参数组合里。外汇与贵金属回测结果仅代表历史概率,实盘仍属高风险。

同一轮跑多品种回测更靠谱

在单个品种上反复跑 EA 回测,结论往往没说服力——你得分文件存每个品种的结果再手动比对,过程既碎又容易漏看。更直接的做法是让多个终端同时起 EA,一次性覆盖多个品种,结果落到一个统一位置,横向差异一眼能看出来。 这套并行思路此前已有几篇铺垫:用四遍回测替代单遍、做“静默”优化画交易分布、以及拿正则表达式批处理日志。本次场景的链路是:先挑要测的 EA(走 Win API 选件),再解析 EA 源码塞进图形报告库调用,接着改主终端 common.ini 给每个从终端生成独立配置,复制到位后拉起从终端,最后把分散报告并回一张总表。 外汇与贵金属品种波动属性差异大,并行多品种回测只是降低人工比对偏差的概率,不保证某组参数在实盘也稳,高杠杆下仍可能快速回撤。

◍ 开跑前先把终端对齐

智能交易系统启动前,主站与从属终端必须连到同一个交易账户,否则资金分配逻辑会拿不到统一净值。这一步没做,后面代码跑得再顺也是各算各的。 所有从属终端都要放开 DLL 调用。若用 \Portable 模式启动,得进安装目录手动打开 terminal64.exe,在设置里勾上“允许导入 DLL”——默认安装态往往是关的,不查容易漏。 库文件 DistributionOfProfits.mqh 要丢进每个从属终端的数据文件夹,路径固定为 数据文件夹\MQL5\Include\DistributionOfProfits.mqh。少一个终端没放,编译就会报找不到 include。外汇与贵金属品种波动大,这类多终端同步出错可能直接让仓位是失控状态,先验证再上实盘。

「1. 输入参数。选则一款智能交易系统进行测试」

由于我的计算机有四个内核, 我只能运行四个测试代理。因此, 并发 (或有几秒钟的小延迟), 我只能运行四个终端, 即每个代理占用一个终端。这就是为什么在输入参数中有四组可用设置的原因: 参数: MetaTrader#ххх 的安装文件夹 终端 #xxx 的测试品种 终端 #xxx 的测试周期 正确的终端文件名 暂歇的毫秒数 — 从属终端之间的启动暂停 开始测试日期 (仅年, 月和日) 结束测试日期 (仅年, 月和日) 初始本金 杠杆 在基本算法开始之前, 我们需要链接从属终端的安装文件夹和 AppData 文件夹中的数据目录。此处是一个简单的脚本 Check_TerminalPaths.mq5: 脚本打印三个参数: TERMINAL_PATH — 终端运行所在的文件夹 TERMINAL_DATA_PATH — 终端数据存储的文件夹 TERMINAL_COMMONDATA_PATH — 计算机上所有安装终端的公共文件夹 三个终端的示例 (它们当中之一使用 / Portable 键运行): 您可阅读我以前的一篇文章的以下段落, 了解有关终端文件夹和 AppData 中文件夹的对应关系的更多信息: 在 AppData 文件夹中绑定安装文件夹和数据目录 匹配从属终端的安装文件夹和 AppData 文件夹 秘密 #1 FindFirstFileW, FindNextFileW 使用 FindFirstFileW, FindNextFileW 的示例 终端目录内部 CopyFileW 操纵 "origin.txt" 文件 最后一程 使用系统的 "打开文件" 对话框 ( GetOpenFileNameW 函数) 选择一款智能交易系统: 有关调用打开文件对话框的细节已在我之前的文章 " 交易员生存诀窍: 四遍回测优于一遍 :  4.2. 利用系统 "打开文件" 对话框选择一款 EA" 中讨论。 当前版本 (文件 GetOpenFileNameW.mqh, 版本 1.003) 改变的功能在 OpenFileName 函数: 现在它设置文件搜索过滤器已变得更方便。还请注意, 现在过滤器搜索推荐 *.mq5 格式的文件 (在上一篇文章中是搜索编译的 *.ex5 文件)。 [CODE] <span class="comment">//+------------------------------------------------------------------+</span>

<span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Check_TerminalPaths.mq5</span>

<span class="comment">//|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

让文件对话框吐出可用路径

在 MT5 里做 EA 工具时,常常需要让用户手动挑一个源文件来跑分析。上面这段逻辑就是封装了一个选择框:默认打开到 MQL5\Experts\ 目录,过滤条件由调用方拼好传进来,标题写死成“选择源文件”。 如果用户正常选了文件,GetOpenFileName 返回 true,函数直接把完整路径丢回去;一旦取消或系统调用出错,就走 else 分支,用 PrintFormatkernel32::GetLastError 的错误码以 %x 十六进制打进日志,并返回 NULL。 实盘前记得在脚本里判一下返回值是不是 NULL——外汇与贵金属杠杆高、波动猛,路径为空还硬读文件,可能让面板直接崩或者误加载历史数据。

MQL5 / C++
class="kw">const class="type">class="kw">string title="选择源文件")
  {
   class="type">class="kw">string path=NULL;
   if(GetOpenFileName(path,filter_description+filter,TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Experts\\",title))
      class="kw">return(path);
   else
     {
      PrintFormat("引发失败的错误: %x",kernel32::GetLastError());
      class="kw">return(NULL);
     }
  }
让小布替你跑这套
这些多终端配置的繁琐步骤,小布盯盘的 AIGC 已内置了部分诊断视图,打开对应品种页即可看到并行测试的概要,你只需专注策略本身的取舍。

常见问题

单品种测试只覆盖了该标的的历史行情片段,无法在同一报告中横向对比多品种表现,容易忽略跨市场相关性带来的隐藏风险。
是的,原文框架要求主站与从属终端登录同一交易账户,才能保证配置同步与报告归口的统一性,外汇贵金属本身杠杆高,账户错配会更难排查。
目前小布内置的是并行测试的诊断概要视图,完整 ini 拆分与从属终端拉起仍需按本篇理论自行部署,后续篇会拆解实战。
因为不同终端的 ini 结构混杂,正则能精准锁定 [Common] 与独立 [Tester] 段,避免手工复制时带入多余字段导致从属终端启动异常。