凌晨三点半,欧美那边一根小时线砸下来,我实盘账户的EA止损被打掉,但同一套参数在MT5回测里明明显示这单应该盈利离场。偏差超过30%,这已经不是运气问题了,是策略回测环境跟实盘脱节。搞了一晚上,把点差模型、滑点设置、成交模式挨个排查了一遍,分享下我的对比测试结果。
先说结论:如果你用的是[c]Every Tick Based on Real Ticks[/c],但数据源是MT5自带的,那偏差主要不在滑点,在[c]点差模型[/c]。MT5回测默认用的是当前品种的[c]平均点差[/c],但实盘欧美在伦敦开盘和纽约下午的点差能差出2-3倍。我做过对比,同一套网格EA,用固定点差20跑出来年化38%,换成[c]动态点差模型[/c](按时段加权)直接掉到22%,这才贴近实盘。
滑点设置这块,很多人直接填0或者用默认的[c]Current[/c],这是第二个坑。我实测过,MT5的滑点参数在回测里是按[c]点数[/c]算的,不是按货币对的价格跳动。比如欧美你填10,意思是允许10个点的滑点,但实盘ECN账户在数据行情里滑个15-20点很常见。我建议用[c]Ask/Bid模式[/c]跑,把滑点设成20-25,同时把[c]Fill Mode[/c]改成[c]Immediate or Cancel[/c],这样更接近市价单的真实成交逻辑。
第三个坑是成交延迟。MT5回测默认[c]Instant[/c]成交,但实盘走VPS到经纪商服务器至少50-100ms延迟。我试过在策略里手动加一个[c]Sleep(80)[/c]模拟延迟,结果回测胜率从61%降到54%,最大回撤从12%扩大到19%。这个影响在剥头皮策略上尤其致命,但很多人根本不会在回测里考虑这层。
如果你用的是[c]Every Tick Based on Real Ticks[/c]但数据源是MT5自带的,那偏差主要不在滑点,在[c]点差模型[/c]。MT5回测默认用的是当前品种的[c]平均点差[/c],但实盘欧美在伦敦开盘和纽约下午的点差能差出2-3倍。我做过对比,同一套网格EA,用固定点差20跑出来年化38%,换成[c]动态点差模型[/c](按时段加权)直接掉到22%,这才贴近实盘。
最后说下我的校准流程,供参考:
还有个小坑,MT5自带的数据源有时候[c]历史点差数据是缺失的[/c],特别是非主流货币对。我吃过亏,GBPNZD回测显示点差才15,实盘常年35+,那策略跑起来完全两回事。建议用第三方数据源(比如Dukascopy的tick数据)重新跑一遍,虽然导入麻烦点,但值得。
我现在每套EA上线前都会做三组回测对比:默认参数、动态点差+滑点20、再加延迟80ms,取三组结果的中位数作为预期基准。这样虽然不能完全消除偏差,但至少能把30%的误差压到10%以内。你们平时回测和实盘偏差大吗?有没有试过用第三方tick数据校准?
先说结论:如果你用的是[c]Every Tick Based on Real Ticks[/c],但数据源是MT5自带的,那偏差主要不在滑点,在[c]点差模型[/c]。MT5回测默认用的是当前品种的[c]平均点差[/c],但实盘欧美在伦敦开盘和纽约下午的点差能差出2-3倍。我做过对比,同一套网格EA,用固定点差20跑出来年化38%,换成[c]动态点差模型[/c](按时段加权)直接掉到22%,这才贴近实盘。
滑点设置这块,很多人直接填0或者用默认的[c]Current[/c],这是第二个坑。我实测过,MT5的滑点参数在回测里是按[c]点数[/c]算的,不是按货币对的价格跳动。比如欧美你填10,意思是允许10个点的滑点,但实盘ECN账户在数据行情里滑个15-20点很常见。我建议用[c]Ask/Bid模式[/c]跑,把滑点设成20-25,同时把[c]Fill Mode[/c]改成[c]Immediate or Cancel[/c],这样更接近市价单的真实成交逻辑。
第三个坑是成交延迟。MT5回测默认[c]Instant[/c]成交,但实盘走VPS到经纪商服务器至少50-100ms延迟。我试过在策略里手动加一个[c]Sleep(80)[/c]模拟延迟,结果回测胜率从61%降到54%,最大回撤从12%扩大到19%。这个影响在剥头皮策略上尤其致命,但很多人根本不会在回测里考虑这层。
如果你用的是[c]Every Tick Based on Real Ticks[/c]但数据源是MT5自带的,那偏差主要不在滑点,在[c]点差模型[/c]。MT5回测默认用的是当前品种的[c]平均点差[/c],但实盘欧美在伦敦开盘和纽约下午的点差能差出2-3倍。我做过对比,同一套网格EA,用固定点差20跑出来年化38%,换成[c]动态点差模型[/c](按时段加权)直接掉到22%,这才贴近实盘。
最后说下我的校准流程,供参考:
- 先用[c]Every Tick Based on Real Ticks[/c] + 默认参数跑一遍,记录基准数据
- 把点差改成[c]Dynamic[/c],按你交易时段的历史平均点差手动填入(我一般取过去30天的分时均值)
- 滑点设成20-25点,成交模式选[c]Immediate or Cancel[/c]
- 在EA里加一个可配置的延迟参数,跑一次50ms、一次100ms,看结果波动区间
- 如果偏差还超过15%,检查是不是用了[c]Open Prices Only[/c]模式——这个模式只按K线开盘价成交,完全忽略盘中波动,回测好看但没参考价值
还有个小坑,MT5自带的数据源有时候[c]历史点差数据是缺失的[/c],特别是非主流货币对。我吃过亏,GBPNZD回测显示点差才15,实盘常年35+,那策略跑起来完全两回事。建议用第三方数据源(比如Dukascopy的tick数据)重新跑一遍,虽然导入麻烦点,但值得。
我现在每套EA上线前都会做三组回测对比:默认参数、动态点差+滑点20、再加延迟80ms,取三组结果的中位数作为预期基准。这样虽然不能完全消除偏差,但至少能把30%的误差压到10%以内。你们平时回测和实盘偏差大吗?有没有试过用第三方tick数据校准?
