玩MT5的兄弟应该都遇到过这种尴尬:策略在回测里跑得跟印钞机似的,一上实盘就变提款机。我去年优化一套欧美M15的均值回归策略,样本内夏普干到3.8,结果forward测试直接腰斩。后来扒开日志才发现,问题出在指标重绘和未来函数上——这俩玩意儿在MT5的策略测试器里特别阴,尤其是用自定义指标的时候。
先说说最常见的坑。很多人喜欢在EA里直接调用iCustom()读取指标缓冲,但某些指标(比如用ZigZag变种的)会在当前K线收盘前反复修改历史值。MT5回测默认用“每个tick”模式,这时候策略就会偷看未来数据。我踩过的具体场景是:用RSI背离做入场,但指标计算里用了当前K线的收盘价来确认信号,回测里看起来完美,实盘却永远滞后一根K线。解决办法很简单——强制在K线收盘后下单,用CopyClose()取已收盘的K线数据,别用Close[0]。
另一个隐蔽的坑是参数优化里的“过拟合幸存者”。MT5的优化器默认用最大净值或最大盈利因子排序,但这两个指标对噪声极其敏感。我习惯用样本外滚动窗口验证:把2018-2023的数据切成三段,前两段做参数寻优,最后一段只做验证,绝不参与优化。具体操作是在优化设置里勾选“自定义最大”,写个脚本记录每次优化的参数组合,然后单独跑一遍验证段。如果验证段回撤超过样本内的1.5倍,直接扔。
再讲一个很多人忽略的细节——点差模型和滑点设置。默认的“当前点差”在回测里是固定值,但实盘欧美点差在非农时段能飙到25个点。我建议用自定义点差文件,从MT5的“策略测试器-设置-点差”里加载历史真实点差CSV,或者至少用“高波动”预设。我自己的经验是,把点差从12改成18,策略的胜率直接从58%掉到51%,盈亏比也从1.9降到1.2。这还没算滑点——回测里加上每单2美金的固定滑点,能过滤掉一半的“完美入场”。
关于未来函数,还有一个终极检查工具:MT5自带的“可视化模式”里按F12逐tick播放,重点看入场信号出现的那一根K线,如果信号在K线未走完时提前出现,就是重绘。我现在的流程是:先跑一次完整回测,导出交易列表,然后随机抽20笔订单,在可视化模式下核对入场K线的时间戳和信号触发逻辑。另外,用“每个tick基于真实tick”模式替代“每个tick”模式,虽然慢十倍,但能暴露很多隐藏的未来函数——比如用Ask/Bid价格差做突破判断时,真实tick模式下会出现回测中不存在的假突破。
最后说点玄学但实用的:参数优化别用遗传算法,那玩意儿容易收敛到局部最优。我都是先用“慢速完整算法”跑一遍粗粒度网格,选出top10参数区间,再在区间内做细粒度扫描。而且优化目标不要只看净利润,要综合看“盈利因子+最大回撤+交易次数”,交易次数少于100次的参数组合直接跳过,统计意义太弱。另外,每次优化完必须重置随机种子,否则MT5的蒙特卡洛模拟结果没法复现。
你们有没有遇到过那种回测曲线漂亮到不真实的策略?后来怎么排查的?欢迎分享下各自的“防未来函数”检查清单,互相避坑。
先说说最常见的坑。很多人喜欢在EA里直接调用iCustom()读取指标缓冲,但某些指标(比如用ZigZag变种的)会在当前K线收盘前反复修改历史值。MT5回测默认用“每个tick”模式,这时候策略就会偷看未来数据。我踩过的具体场景是:用RSI背离做入场,但指标计算里用了当前K线的收盘价来确认信号,回测里看起来完美,实盘却永远滞后一根K线。解决办法很简单——强制在K线收盘后下单,用CopyClose()取已收盘的K线数据,别用Close[0]。
另一个隐蔽的坑是参数优化里的“过拟合幸存者”。MT5的优化器默认用最大净值或最大盈利因子排序,但这两个指标对噪声极其敏感。我习惯用样本外滚动窗口验证:把2018-2023的数据切成三段,前两段做参数寻优,最后一段只做验证,绝不参与优化。具体操作是在优化设置里勾选“自定义最大”,写个脚本记录每次优化的参数组合,然后单独跑一遍验证段。如果验证段回撤超过样本内的1.5倍,直接扔。
再讲一个很多人忽略的细节——点差模型和滑点设置。默认的“当前点差”在回测里是固定值,但实盘欧美点差在非农时段能飙到25个点。我建议用自定义点差文件,从MT5的“策略测试器-设置-点差”里加载历史真实点差CSV,或者至少用“高波动”预设。我自己的经验是,把点差从12改成18,策略的胜率直接从58%掉到51%,盈亏比也从1.9降到1.2。这还没算滑点——回测里加上每单2美金的固定滑点,能过滤掉一半的“完美入场”。
关于未来函数,还有一个终极检查工具:MT5自带的“可视化模式”里按F12逐tick播放,重点看入场信号出现的那一根K线,如果信号在K线未走完时提前出现,就是重绘。我现在的流程是:先跑一次完整回测,导出交易列表,然后随机抽20笔订单,在可视化模式下核对入场K线的时间戳和信号触发逻辑。另外,用“每个tick基于真实tick”模式替代“每个tick”模式,虽然慢十倍,但能暴露很多隐藏的未来函数——比如用Ask/Bid价格差做突破判断时,真实tick模式下会出现回测中不存在的假突破。
最后说点玄学但实用的:参数优化别用遗传算法,那玩意儿容易收敛到局部最优。我都是先用“慢速完整算法”跑一遍粗粒度网格,选出top10参数区间,再在区间内做细粒度扫描。而且优化目标不要只看净利润,要综合看“盈利因子+最大回撤+交易次数”,交易次数少于100次的参数组合直接跳过,统计意义太弱。另外,每次优化完必须重置随机种子,否则MT5的蒙特卡洛模拟结果没法复现。
你们有没有遇到过那种回测曲线漂亮到不真实的策略?后来怎么排查的?欢迎分享下各自的“防未来函数”检查清单,互相避坑。
