同一份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%,随机种子固定,点差滑点设成固定值,测试区间用整点,数据提前下齐。做完这几步,你再跑五次,结果应该就是一模一样的了。
你们有没有遇到过测试结果对不上的情况?最后是怎么解决的?在下面聊聊。
还有一点忘了提,测试前记得把“延迟”也设成固定值,很多人默认是随机延迟,这玩意同样会让每次结果飘。
先说最容易被忽略的一个东西:建模质量。你打开策略测试器的日志,每次跑完都会有一行建模质量百分比。如果这个数字不是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%,随机种子固定,点差滑点设成固定值,测试区间用整点,数据提前下齐。做完这几步,你再跑五次,结果应该就是一模一样的了。
你们有没有遇到过测试结果对不上的情况?最后是怎么解决的?在下面聊聊。
还有一点忘了提,测试前记得把“延迟”也设成固定值,很多人默认是随机延迟,这玩意同样会让每次结果飘。
