交易者的 LifeHack: 四次回测比一次好(基础篇)
◍ 一键跑完四种测试模式
MT5 策略测试器自带四种测试模式(每 tick、控制点、1 分钟 OHLC、开盘价),单跑一种容易漏掉模式差异带来的偏差。2016 年 Vladimir Karputov 在官方博客提过一个思路:与其纠结选哪种,不如一次性把四种全跑出来对照。 具体做法是借助 Win API 向测试器窗口发消息,用一段脚本把四个模式按钮串行触发,让四次回测结果并排显示在同一屏幕。这样你能直接比对曲线离散度,而不是凭记忆猜某次测试是否过拟合。 外汇与贵金属品种点差和滑点敏感,四种模式下的权益曲线可能差出 20% 以上,属于高风险验证场景,结论仅具概率意义。
主控脚本要管哪些事
这套多终端批量测试方案的主控 EA,核心不是跑策略,而是替你在多个 MT5 从终端之间搬文件、调配置、发指令。它要覆盖一条完整链路:从约定目录结构,到扫描从终端的 AppData 路径,再到复制 EA、写 INI、拉起终端跑回测。 原文给出的章节骨架里,光是『绑定 AppData 安装与数据目录』之后,就拆出 7 个匹配从终端的子步骤,其中包含用 FindFirstFileW / FindNextFileW 枚举目录、CopyFileW 拷文件、操作 origin.txt 标记状态等 WinAPI 动作。也就是说,你开写之前得先想清楚:主终端知道几个从终端、各自路径在哪、谁先谁后。 选测 EA 那段还涉及 GetOpenFileName 调系统文件框、改 INI、秘密 №2 里设终端窗口宽高并在文件中间插行——这些都不是 MQL5 常规交易函数,而是借 Windows API 做自动化。外汇与贵金属回测本身高风险,批量跑只是放大样本量,不意味信号更稳。
「单机多终端并发回测的部署前提」
这套方案的核心目的,是让一个主终端(Master)把同一个 EA 的普通测试(非优化)同步推到四个从终端跑起来,四个从端分别用不同订单生成模式:#1 用“基于真实订单的每一订单”,#2 用“每一订单”,#3 用“1 分钟 OHLC”,#4 用“只使用开盘价”。这样能在同一账户上横向对比不同撮合假设下的回测差异。 硬约束有两条必须先满足:主终端绝不能带 /portable 参数启动;机器上至少装好五个 MT5 终端。主账户必须在每个从终端上至少登录激活一次,因为 EA 只传交易账户编号、不传密码 INI,从端靠编号认主账户,没激活过就接不上。 跑之前把 CPU 腾干净:关掉游戏、媒体播放器之类吃资源的进程。否则一个核心被占满,对应从终端的策略测试器可能直接拿不到算力、整组回测就废了。外汇与贵金属回测本身带模型风险,多模式并发也只是暴露差异,不代表实盘概率。
◍ 别拿便携模式糟蹋终端沙盒
MetaTrader 5 有两条铁律:绝不用 /portable 关键字启动终端,也绝不在系统里关掉用户账户控制(UAC)。碰了这两条,后面要讲的 EA 就找不到它在 AppData 下该操作的文件,整个文件逻辑直接断链。 本文所有截图都在 Windows 10 完成,这是目前许可证最完整的系统,代码也按这个环境写。EA 重度依赖 DLL 与 MQL5 原生特性,其中直接调了几个 Windows API:CopyFileW 负责在 MQL5 沙盒内外倒文件,FindClose / FindFirstFileW / FindNextFileW 管文件遍历,GetOpenFileNameW 拉出系统级打开文件框,ShellExecuteW 用来从终端起进程。 外汇和贵金属杠杆高、波动猛,动 DLL 和沙盒等于把终端权限向外扩了一层,实盘前务必在模拟环境跑通再谈。
多终端路径绑定的输入参数写法
在 MQL5 代码里写终端安装路径,双斜线才是合法转义,末尾还得补一对反斜线,否则文件操作会指向错误目录。64 位系统下终端主程序名固定为 terminal64.exe,这个字符串直接做成输入参数最省事。 普通启动和加 /portable 启动,TERMINAL_DATA_PATH 差异很大:前者落在 Program Files 同目录,后者被挪到 C:\Users\user_name\AppData\Roaming\MetaQuotes\Terminal\terminal_identifier 下。从 Windows Vista 起 Program Files 禁止写数据,EA 只能安稳地在 AppData 那个 identifier 目录的 MQL5\Files 里建文件。 下面这段输入参数定义了四个从终端的安装目录和一个终端文件名,复制去改盘符就能跑多终端协同测试。代码里 ExtInstallationPathTerminal_1 指向 C 盘默认装法,其余放 D 盘避免主盘拥堵,末尾双反斜线一个不能少。 路径变量实测输出也一并列出:不加 /portable 时 DATA_PATH 与 PATH 同为 C:\Program Files\MetaTrader 5;加了之后 DATA_PATH 变成带 038C9E8FAFF9EA373522ECC6D5159962 标识的 AppData 子目录。外汇与贵金属自动化测试涉及实盘连接,属高风险操作,参数改完先在 demo 环境验证。
class=class="str">"cmt">//--- 输入参数 class="kw">input class="type">class="kw">string ExtInstallationPathTerminal_1="C:\\Program Files\\MetaTrader class="num">5 class="num">1\\"; class=class="str">"cmt">// MetaTrader#class="num">1 的安装文件夹 class="kw">input class="type">class="kw">string ExtInstallationPathTerminal_2="D:\\MetaTrader class="num">5 class="num">2\\"; class=class="str">"cmt">// MetaTrader#class="num">2 的安装文件夹 class="kw">input class="type">class="kw">string ExtInstallationPathTerminal_3="D:\\MetaTrader class="num">5 class="num">3\\"; class=class="str">"cmt">// MetaTrader#class="num">3 的安装文件夹 class="kw">input class="type">class="kw">string ExtInstallationPathTerminal_4="D:\\MetaTrader class="num">5 class="num">4\\"; class=class="str">"cmt">// MetaTrader#class="num">4 的安装文件夹 class="kw">input class="type">class="kw">string ExtTerminalName="terminal64.exe"; class=class="str">"cmt">// 正确的终端文件名称 TERMINAL_PATH = C:\Program Files\MetaTrader class="num">5 TERMINAL_DATA_PATH = C:\Program Files\MetaTrader class="num">5 TERMINAL_COMMONDATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\Common TERMINAL_PATH = C:\Program Files\MetaTrader class="num">5 TERMINAL_DATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038C9E8FAFF9EA373522ECC6D5159962 TERMINAL_COMMONDATA_PATH = C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\Common
「用 origin.txt 把安装目录和 AppData 对上号」
多终端批量回测时,每个从终端都要靠独立配置文件启动,配置里 [Tester] 段只写 Expert=test 这类指令,并不带路径。EA 实际落在哪,取决于系统从 Vista 起禁写 Program Files 的安全策略——所以只能认 AppData 下的 MQL5 沙盒,例如 C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038C9E8FAFF9EA373522ECC6D5159962\MQL5\Experts,Program Files 那条路径直接排除。 每个 AppData 终端目录里都有个 origin.txt,内容就一行,记录它对应的安装目录,比如上面那串哈希目录是由 C:\Program Files\MetaTrader 5 1 创建的。遍历顶层目录时若某子目录搜不到 origin.txt,句柄会返回 INVALID_HANDLE,说明这目录不是标准终端数据夹,直接跳过。 实际匹配靠两级搜索:先用 FindFirstFileW 扫 Terminal\*.* 拿顶层文件夹名,再拼 "顶层路径+文件夹名+origin.txt" 做二级 FindFirstFileW。找到后通过 Win API 的 CopyFileW 把文件拷进 FILE_COMMON 沙盒,读那一行字符串,就能把安装路径和 AppData 路径写进二维数组的 0、1 两维。 EA 在 OnInit 里调 FindDataFolders,四个从终端的安装路径是写死的输入参数。只要有一个 AppData 路径没匹配上(变量为 NULL),就打印全部路径并以错误结束。外汇与贵金属批量测试涉及多账户并发,平台环境差异大,路径匹配失败的概率并不低,建议先在单机四终端环境手验一遍再上云。
[Tester] Expert=test C:\Program Files\MetaTrader class="num">5 class="num">1 HANDLE FindFirstFileW(