上礼拜把一个跑了半年的多品种EA从实盘账户上扒下来,想复盘一下为什么欧美和黄金的回测曲线跟实盘差那么多。结果一查,问题出在我一直用OHLC模式跑回测,而实盘是逐tick成交的。这个坑不踩一次真的不会重视,今天就把我这几天折腾的几种回测模式对比写出来。
先说结论:MT5自带策略测试器里,OHLC和每笔即时价的差异,在多品种EA上会被放大。我拿同一个EA,同一段2023年1月到6月的数据,分别在欧美M15和黄金M30上跑了两遍。OHLC模式下欧美盈利因子1.42,换成真实tick后掉到1.18;黄金更夸张,从1.35直接变成0.91,策略直接从盈利变亏损。原因很简单,OHLC只用开盘、最高、最低、收盘四个价来模拟价格路径,遇到震荡行情时,EA挂的单可能在实盘里根本碰不到,但回测里却成交了。
下面是我实际用过的几种回测数据源,按对比维度列一下:
还有个细节要注意:多品种EA回测时,MT5默认是每个品种单独测试,如果你EA里用了跨品种信号(比如欧美和镑美的相关性),必须用“每笔即时价”并且勾选多品种同步测试,否则回测出来的资金曲线是拼凑的,没有参考价值。另外VPS上跑实盘回测时,记得把测试器的“延迟”参数调成跟你的VPS到经纪商服务器的实际ping值接近,我这边测下来延迟设成80ms比默认的0ms更贴近实盘成交。
最后问一句,你们跑多品种EA回测时,是直接用经纪商的tick还是自己导入数据?有没有遇到过tick导入后点差异常的情况,怎么解决的?
先说结论:MT5自带策略测试器里,OHLC和每笔即时价的差异,在多品种EA上会被放大。我拿同一个EA,同一段2023年1月到6月的数据,分别在欧美M15和黄金M30上跑了两遍。OHLC模式下欧美盈利因子1.42,换成真实tick后掉到1.18;黄金更夸张,从1.35直接变成0.91,策略直接从盈利变亏损。原因很简单,OHLC只用开盘、最高、最低、收盘四个价来模拟价格路径,遇到震荡行情时,EA挂的单可能在实盘里根本碰不到,但回测里却成交了。
下面是我实际用过的几种回测数据源,按对比维度列一下:
- MT5自带“每笔即时价”模式:优点是不用额外下载数据,直接用经纪商提供的tick,适合快速验证。缺点是不同经纪商的tick质量参差不齐,我用的一家ECN平台,黄金tick在非农前后明显稀疏,回测结果偏乐观。适用场景是初步筛选策略,别拿它做最终参数优化。
- 导入外部tick数据(比如Dukascopy):优点是tick密度高,欧美和黄金的买卖价差更接近真实。缺点是需要自己写脚本转换格式,MT5的tick导入对时间戳要求很严,我一开始用Python的pandas转CSV,时区没对齐,回测出来的点差全是乱的。适用场景是对执行精度要求高的头皮或套利EA。
- OHLC模式:优点是快,跑一年黄金数据几分钟就出结果。缺点是它假设每个bar内价格按固定路径走,对挂单和止损的触发判断太理想化。我那个多品种EA里有个黄金的突破挂单,OHLC回测显示每周触发3次,真实tick下只有1.2次。适用场景是只看大方向、不依赖精确入场点的趋势策略。
还有个细节要注意:多品种EA回测时,MT5默认是每个品种单独测试,如果你EA里用了跨品种信号(比如欧美和镑美的相关性),必须用“每笔即时价”并且勾选多品种同步测试,否则回测出来的资金曲线是拼凑的,没有参考价值。另外VPS上跑实盘回测时,记得把测试器的“延迟”参数调成跟你的VPS到经纪商服务器的实际ping值接近,我这边测下来延迟设成80ms比默认的0ms更贴近实盘成交。
最后问一句,你们跑多品种EA回测时,是直接用经纪商的tick还是自己导入数据?有没有遇到过tick导入后点差异常的情况,怎么解决的?
