先说结论:MT5自带的策略测试器,时区问题不是玄学,是图表时区 以及你代码里用到的[TimeCurrent()]和[iTime()]三者之间互相打架的结果。我上周调一个欧美M15的网格回测,明明策略逻辑没改,只是把回测周期从2025.01.01改到2025.02.01,结果盈亏曲线直接平移了整整一天,一开始还以为是滑点模型抽风,折腾了半宿才反应过来是时区在作怪。
先说我踩过最深的坑:MT5的测试器默认用是从服务器时间00:00算的,但大部分外汇经纪商的服务器时区是GMT+2或GMT+3,而你的VPS或者本地电脑可能是UTC+8。这就导致你回测里看到的K线开盘时间,和实盘图表上对应的时间戳对不上。比如你实盘图表上显示周一早上6点开盘(你的本地时间),但测试器里同一根K线可能标记为前一天晚上10点。如果你策略里有[TimeCurrent()]做日期判断,比如“只在周二到周四开仓”,那结果能差出一整天的有效信号。
具体的排查步骤,我建议按这个顺序来:
int gmt_offset = (int)(TimeCurrent() - TimeGMT()) / 3600;
// 然后所有日期判断都用这个gmt_offset去矫正
if (Hour() == (9 + gmt_offset) % 24) { ... }
注意,不要直接用TimeToStruct()里的tm_hour,因为那已经包含了MT5内部时区转换。我试过最蠢的办法是直接在策略里写“if(DayOfWeek()==2)”,结果回测时每日开盘时间差导致周二信号全变成周三,盈亏比直接反转。
另一个坑是回测周期跨夏令时切换。比如你回测从3月到4月,服务器时区从GMT+2变GMT+3,但测试器不会自动调整你代码里的固定偏移量。我现在的做法是干脆,所有开仓条件都基于K线的收盘价和开盘价相对关系,不依赖具体小时数。但如果你的策略必须看时间窗口,那就在代码里动态计算偏移,别写死。
最后说个实用小技巧:回测完看“报告”页的“持仓时间”和“每笔交易时间”,如果发现所有交易的时间戳都比你实盘预期的时间早或者晚整12小时,那大概率是时区偏移正好半天的倍数,这种最常见。我之前跑镑美的时候遇到过,后来发现是VPS上MT5的服务器时区设置被系统更新重置了,重新同步一下就好了。
哦对了,还有一点,用MT5自带的历史数据中心下载数据时,默认是UTC时间,但测试器默认按服务器时间处理。如果你手动导入过CSV数据,一定要在导入时选对时区,否则回测结果完全不可信。我吃过这个亏,后来干脆只用经纪商自带的数据源,不自己导。
你们有没有遇到过回测和实盘时间轴对不上,但又不是滑点或点差导致的情况?我怀疑MT5的时区处理在某些版本更新后还有隐藏bug,想看看有没有同病相怜的兄弟。
- 服务器时区
先说我踩过最深的坑:MT5的测试器默认用
新的一天
具体的排查步骤,我建议按这个顺序来:
- 第一步,打开MT5,点开“选项”里的“图表”选项卡,看是多少。大多数时候是0,但如果你手动调整过,回测就会跟着漂。
图表时间偏移
- 第二步,在策略测试器里,把“每笔报价”改成“1分钟OHLC”,然后加一行打印[TimeToString(TimeCurrent())]的策略进去跑一遍。看打印出来的时间和你本地时间差多少小时,这个差值就是你要补偿的偏移量。
- 第三步,关键一步,在你策略的OnInit()里强制写死偏移。我一般这么做:
int gmt_offset = (int)(TimeCurrent() - TimeGMT()) / 3600;
// 然后所有日期判断都用这个gmt_offset去矫正
if (Hour() == (9 + gmt_offset) % 24) { ... }
注意,不要直接用TimeToStruct()里的tm_hour,因为那已经包含了MT5内部时区转换。我试过最蠢的办法是直接在策略里写“if(DayOfWeek()==2)”,结果回测时每日开盘时间差导致周二信号全变成周三,盈亏比直接反转。
另一个坑是回测周期跨夏令时切换。比如你回测从3月到4月,服务器时区从GMT+2变GMT+3,但测试器不会自动调整你代码里的固定偏移量。我现在的做法是干脆
把策略逻辑改成不用本地时间
最后说个实用小技巧:回测完看“报告”页的“持仓时间”和“每笔交易时间”,如果发现所有交易的时间戳都比你实盘预期的时间早或者晚整12小时,那大概率是时区偏移正好半天的倍数,这种最常见。我之前跑镑美的时候遇到过,后来发现是VPS上MT5的服务器时区设置被系统更新重置了,重新同步一下就好了。
哦对了,还有一点,用MT5自带的历史数据中心下载数据时,默认是UTC时间,但测试器默认按服务器时间处理。如果你手动导入过CSV数据,一定要在导入时选对时区,否则回测结果完全不可信。我吃过这个亏,后来干脆只用经纪商自带的数据源,不自己导。
你们有没有遇到过回测和实盘时间轴对不上,但又不是滑点或点差导致的情况?我怀疑MT5的时区处理在某些版本更新后还有隐藏bug,想看看有没有同病相怜的兄弟。
