用MT5内置策略测试器验证EA参数,为什么每次结果都不一样?

较热48
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
MoonlitPine
MoonlitPine 楼主 6 天前 浏览 440 回复 2 阅读 1 分钟
新汇友(注册会员) 等级 Lv.1 主题 3 帖数 16 积分 1227 汇币 749
1楼
同一份EA参数,同一段历史数据,我上周跑了五次测试,五次结果全不一样——最大回撤从8.3%到14.7%都有,净利润差了将近一倍。当时我第一反应是MT5出bug了,后来折腾了大半天才搞明白,问题根本不在MT5,在我自己没把测试环境锁死。
先说最容易被忽略的一个东西:建模质量。你打开策略测试器的日志,每次跑完都会有一行建模质量百分比。如果这个数字不是99%或者100%,说明MT5在用M1数据去模拟更小周期的价格路径,而模拟过程本身带有随机性。同一个EA,同一段行情,只要建模质量不到100%,每次生成的tick路径都可能不同,结果自然对不上。解决办法很简单,在自定义周期里选“每tick”,并且确保你下载了完整的历史数据。我现在的习惯是测试前先按F2打开品种窗口,把要测的品种从最早到最新的M1数据全部下齐,然后再跑。
第二个坑是随机种子。很多EA里带优化算法或者随机数生成逻辑,比如用MathRand()做仓位微调,或者用遗传算法做参数寻优。MT5在每次测试时会默认给一个不同的种子,导致结果漂移。如果你希望结果可复现,需要在EA的OnInit()里加一行:
MathSrand(12345);
把种子固定住。或者更干脆,在策略测试器的输入参数里把随机相关的开关关掉。我有个做镑美日内突破的EA,之前每次测试结果都差3%到5%,后来发现就是仓位模块里有个随机延迟开仓的逻辑在作怪,固定种子之后五次测试结果完全一致。
第三个问题更隐蔽:点差和滑点设置。MT5策略测试器默认用的是“当前”点差,但如果你测的是历史回测,这个“当前”其实是你现在经纪商提供的实时点差。而历史行情里的真实点差是波动的,尤其像非农或者利率决议那会儿,黄金点差能从20个点瞬间拉到80个点。如果你不手动固定点差,每次测试时MT5读取的实时点差可能不同,结果就跟着变。我的做法是在测试器的设置标签里,把点差从“当前”改成“固定”,然后填一个你经纪商在正常行情下的平均值,比如欧美填12到15个点,黄金填25到30个点。滑点也建议设成固定值,别用随机。
还有一个经常被忽视的细节:测试区间的起止时间。MT5的策略测试器在“自定义区间”模式下,如果开始时间不是整点或者不是交易日开盘时间,它可能会自动往前找最近的一个tick。但不同次测试时,由于数据加载顺序或者缓存状态不同,这个“最近tick”可能不一样。我现在的习惯是统一用整点,比如2024.01.02 00:00到2024.06.28 23:59,并且每次测试前清一次缓存(在测试器里右键选择“删除缓存”)。
最后说一个我自己踩过的坑:多品种EA。如果你的EA同时交易欧美和镑美,而这两个品种的历史数据下载进度不一样,MT5在测试时可能会用不同的数据对齐方式,导致每次结果都有细微差异。解决办法是测试前把所有相关品种的数据全部下完,并且把同步品种的选项勾上。
简单说,想让MT5策略测试器结果可复现,核心就一句话:把所有带随机性的东西都锁死。建模质量拉到100%,随机种子固定,点差滑点设成固定值,测试区间用整点,数据提前下齐。做完这几步,你再跑五次,结果应该就是一模一样的了。
你们有没有遇到过测试结果对不上的情况?最后是怎么解决的?在下面聊聊。

还有一点忘了提,测试前记得把“延迟”也设成固定值,很多人默认是随机延迟,这玩意同样会让每次结果飘。
0 回复 众裁0 复制
#1
自由的追梦人
自由的追梦人 #3· 6 天前
3楼
点差那个坑我也中过,测黄金EA时没固定,结果差挺多。我自己也常在MT5里跑镑美,后来养成习惯:测试前按F2把M1数据下全,点差手动填30,随机种子固定。现在回撤稳定在9%左右,心里踏实多了。
赞 回复 众裁0 复制
6 天前 #3
QuietHarbor
QuietHarbor #2· 6 天前
2楼
“建模质量不到100%每次tick路径都可能不同”这句点醒我了,我之前测黄金EA回撤老对不上,就是没下全M1数据。我自己也踩过随机种子那坑,镑美突破EA固定MathSrand后才稳。
赞 回复 众裁0 复制
6 天前 #2
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 刚下盘来聊聊,折腾MT5又搞到半夜 下一帖 → 能忍住不交易的那几天,是我进步最快的几天