突破MT4测试器对冲EA限制
用文件导出法虚拟测试双币对冲策略
为什么MT4策略测试器无法直接测试对冲EA
MetaTrader 4 自带的策略测试器(Strategy Tester)在设计上只允许在单一交易品种上模拟订单。如果你编写的对冲 Expert Advisor 需要在同一时间打开两个不同货币对的反向仓位,例如卖出 GBPJPY 同时买入 EURJPY,测试器会因为无法在其他符号上成交而直接失效。很多新手因此被迫使用实时账户做“现场测试”,不仅耗费资金,而且样本周期长、不可重复。本文要解决的问题正是:如何在不依赖实盘的前提下,在 MT4 环境内获得近似策略测试器的对冲 EA 历史表现。
需要明确的是,这种限制并非 Bug,而是早期 MT4 架构使然。它假设回测对象只交易当前图表品种。当对冲逻辑涉及跨品种价差或相关性时,官方测试器就无能为力。社区用户 A Sexy Trader 在 2016 年分享了一种巧妙思路:既然测试器不能跨品种下单,我们就把其他品种的历史价格先“录”下来,再在单一品种上重放这些价格并模拟对冲结算,最后用指标把权益曲线画出来。
对冲交易与虚拟测试的基本理念
在动手前,必须先理解什么是对冲。简单来说,对冲是同时打开两个货币对的反向或关联交易,以抵消单边风险。例如 EURUSD 与 GBPUSD 同向,可做多 EURUSD 并做空 GBPUSD;EURUSD 与 USDCHF 反向,可做多两者。甚至同品种多空互锁(套汇)也算对冲。对冲者盈利的来源在于货币对关联并非恒定,存在滞后:一个动完另一个才动,捕捉这段“龟兔赛跑”的价差即可获利。
虚拟测试的核心概念是:用 MQL4 的 Files 函数把历史价格写入 CSV 文件,再由另一个 EA 读取这些文件,按既定规则模拟开平,并把结果也写成文件,最后用自定义指标把结果绘制成独立窗口的曲线。整个过程不需要任何外部软件,全部在 MT4 内用 mq4 参数完成。作者强调,这仅是“思路”,不能保证与真实测试器完全一致,但足以作为对冲 EA 上线前的可行性验证。
- 关联系数:衡量两货币对关系,-1 至 +1,可用 mataf.com 免费查询
- 手数比率:波动不同的品种用不同手数,如龟兔比喻,用“乌龟”大手持仓覆盖“兔子”亏损
- 每日建仓、达标平仓:示例规则为每日开盘对冲,盈利 $100 平仓,每小时记价
突破限制的三步法框架
根据原文,突破测试限制可拆为三个清晰步骤。第一步,获取价格数据并用 EA 输出到文件;第二步,用另一个 EA 读取文件生成虚拟交易,并把结果导出;第三步,将结果作为指标在单独窗口查看。这种分层让数据录制与策略模拟解耦,你可以更换任意对冲规则而不必重写录数脚本。
这种结构的优势在于:录制脚本(symbol-D1.mq4)只关心“采集”,可复用于任何品种;虚拟对冲脚本(VirtualHedge.mq4)只关心“规则”,可像普通 EA 一样调整手数、止盈;表现指标(performance.mq4)只关心“绘图”,与策略逻辑完全隔离。相比直接实盘试错,三步法把不确定性关进了历史数据的笼子。
步骤1:导出价格数据到CSV
第一个 EA(symbol-D1.mq4)负责把指定品种的每日开盘价和每小时变动价写入两个文件,如 GBPJPYD1.csv 与 GBPJPYTick.csv。关键外部参数 For_OP_SELL 决定采集的是卖出开价还是买入开价(买入要加点差)。测试时需在测试器选对应品种、周期 H1,并跑完设定日期区间。以下为原文片段,展示参数与文件句柄定义:
//| symbol-D1.mq4 |
//| A Sexy Trader |
#property copyright "A Sexy Trader"
#include <stdlib.mqh>
extern string StartDate = "2007.03.17"
,StopDate = "2007.06.28";
extern bool For_OP_SELL = true;
string name,tname;
int init(){ return(0); }
int deinit(){ return(0); }
int day,ho,ht,x=1,xt=1,bartime;
使用要点:对对冲对的两个符号分别运行一次,切勿忘记把 For_OP_SELL 设得与订单方向一致。例如 GBPJPY 做空就 true,EURJPY 做多就 false。录制完成后,tester/files 下应出现四个 CSV(两品种 × 两类数据)。
步骤2:生成虚拟对冲交易
第二个 EA(VirtualHedge.mq4)是整套方案最精彩的部分。它读取上一步的所有 CSV,按规则模拟:每日开盘下 Base_OP/Hedge_OP 单,每小时检查浮动盈亏,达到 ExpectProfit$ 就双侧平仓,并把每条记录写入结果文件。以下片段展示其核心参数:
//| VirtualHedge.mq4 | extern string BaseSymbol = "GBPJPY"; extern string HedgeSymbol = "EURJPY"; extern int Base_OP = OP_SELL; extern int Hedge_OP = OP_BUY; extern double BaseLotSize = 1.0; extern double HedgeLotSize = 2.0; extern double ExpectProfit$ = 100; extern bool PrintDetails = true;
虚拟测试时,此 EA 可挂在任何品种图表上并开启可视化模式,方便观察。它会把 GBPJPY_EURJPY_result1.csv 等结果写到 tester/files。注意原文示例规则:新的一天清空昨日数据,即便未达目标;这避免了跨日风险累积,但也意味着单日止损逻辑需自行补充。
步骤3:用指标查看对冲表现曲线
最后,performance.mq4 自定义指标在独立窗口读取结果 CSV,把权益连成线,类似 RSI 副图。它先用 p.csv 得知文件数,再拼接所有 result 字符串到 buffer。原文片段:
//| performance.mq4 |
#property indicator_separate_window
#property indicator_buffers 1
double ExtMapBuffer1[],curve[8888888];
int init(){
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
p =FileOpen("p.csv",FILE_CSV|FILE_READ);
pv=StrToInteger(FileReadString(p));
FileClose(p);
for(int i=1;i<=pv;i++){
string name = BaseSymbol+"_"+HedgeSymbol+"_result"+i+".csv";
handle=FileOpen(name,FILE_CSV|FILE_READ);
if(handle>0){ data=data+FileReadString(handle); FileClose(handle); }
}
return(0);
}
把文件从 tester/files 复制到 experts/files 后,将指标拖到任意活跃图表即可看到曲线。作者示例曲线平淡,但强调你的规则可能更优。该曲线本质就是虚拟净值,可直观评估每日对冲是否稳定。
完整使用手册与迷你流程
综合原文,落地只需五步:1) 测试器非可视化跑 symbol-D1.mq4 录第一个符号,For_OP_SELL 按方向设;2) 同法录第二个符号,改 For_OP_SELL;3) 可视化跑 VirtualHedge.mq4 生成结果;4) 把 tester/files 下 result 与 p.csv 复制到 experts/files;5) 图表加载 performance.mq4 看曲线。严格按顺序,缺一步就空窗。
- 录制 EA 周期选 H1,起止日期与虚拟 EA 一致
- 两个符号的 For_OP_SELL 必须分别与卖/买对应
- 虚拟 EA 可用任意品种图表,但需可视化看过程
- 文件复制容易忘,建议批处理或手动双目录对比
- 一年数据建议拆四季分别录,减文件体积与内存压
方案对比、局限与延伸思考
对比三种对冲 EA 验证法:实盘试错,真实但烧钱且慢;MT5 多品种回测,精准但需移植 MQL5;本文虚拟文件法,兼容 MT4 老代码、零外件,但精度受录制粒度限制(仅 hourly)。若你的对冲依赖分钟级联动,需改 symbol-D1 为 M1 录制,并注意数组越界(原文 curve 写死 8888888 元素,数据多会崩)。
延伸上,任何需“跨品种历史”的策略都能套用此框架:三角套利、跨期套利、相关性均值回归。你只需列出必要数据(开高低收、关联值、点差),替换 VirtualHedge 内的结算公式。作者提醒,本文对冲规则仅为示例,真实生产要自行设计平仓与风控。希望这章能启发你写出漂亮净值曲线,就像红衣女郎般迷人。