EA回测通过但实盘不开单:MT4日志排查与VPS时区校准

较热63.1
登录发帖
Exness 推荐平台

入金门槛低,出金到账快,支持多种账户类型

FSA(塞舌尔)/FCA(英国) / CySEC(塞浦路斯) · 最低入金 $130
jack8584
jack8584 楼主 7 天前 浏览 551 回复 4 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 3 帖数 18 积分 1491 汇币 1236
1楼
前两天一个做欧美5分钟剥头皮的朋友发消息问我,说他那个EA在策略测试器里跑2023年整年的数据,盈利曲线漂亮得不行,夏普都快到2了,结果挂到实盘VPS上跑了三天,一单没开。账户是激活的,EA图标也是笑脸,日志里干干净净,连个报错都没有。他问我是不是平台搞鬼。
这个问题我去年自己也踩过一次,当时折腾了将近一个通宵才定位到根因。后来复盘发现,九成的"回测通过实盘不开单"都逃不过三个方向:时间维度不匹配、品种参数对不上、日志级别把关键信息过滤掉了。下面按我实际排查的顺序说。
先说把MT4日志的过滤等级调出来。默认情况下日志只显示错误和部分警告,很多EA的内部判断逻辑比如"当前不在交易时段""点差超过阈值"这类信息是打在普通日志里的,你不主动看根本发现不了。操作路径是终端窗口 → 日志标签 → 右键 → 把Journal和Experts两个页签都打开,然后让EA跑一个完整交易日,把日志导出来搜关键词。我那次就是搜到一条"spread filter blocked: current 2.8 > max 2.0",才发现VPS上那个经纪商账户是标准账户,欧美点差在伦敦开盘前经常冲到2.5而我回测时用的是固定点差1.6的模型。这种偏差回测根本模拟不出来。
第二步,核对VPS的系统时区和MT4服务器时间是否对齐。这是最隐蔽的坑。MT4的K线时间戳用的是经纪商服务器时间,通常是GMT+2或GMT+3,而你VPS的Windows系统时间如果没改,默认可能是UTC或者你本地时区。EA里如果用TimeCurrent()和TimeLocal()混着写逻辑,比如"只在伦敦时段开仓",那实际触发的时间窗口可能整体偏移两三个小时,结果就是行情最活跃的时候你的EA认为还没开盘,等它以为开盘了行情已经走完了。检查方法很简单,在EA里加一行Print(TimeCurrent(), " | ", TimeLocal(), " | ", TimeGMT()),跑一下看三个时间的差值。正常的应该是对应经纪商时区、VPS本地时间、GMT三者关系清晰,如果TimeLocal和TimeCurrent差了四五个小时,那肯定有问题。解决办法是在VPS的Windows设置里把时区改成和经纪商服务器一致,重启MT4生效。注意不要只改MT4图表上的时间显示,那个不改变底层时间函数。
第三步,检查品种后缀和交易权限。很多经纪商的实盘账户品种名带后缀,比如EURUSD.a或者EURUSDpro,你EA里硬编码的是EURUSD,SymbolSelect找不到对应品种就直接跳过,日志里可能只有一行很不起眼的"symbol not found"。另外有些账户默认是只读或者对冲模式没开,OrderSend返回错误码4109或4106,这种错误如果不把日志级别调到详细也容易漏掉。建议在EA的OnInit()里加一段SymbolSelect的返回值和MarketInfo(SYMBOL_TRADE_MODE)的打印,一次性确认品种可用性和交易权限。
第四步,回测和实盘的执行环境差异要单独建一张对照表。我现在的习惯是每次上线新EA之前,列一个checklist:点差模型是固定还是浮动、滑点设置多少、执行延迟模拟了没有、最小止损距离是否满足、冻结 level 是多少。这几项里任何一项在回测里设得太理想,实盘都可能直接卡死不开单。特别是最小止损距离,回测时MT4默认不检查这个,实盘如果StopLevel是20点而你EA设的止损只有15点,OrderSend会直接返回错误码130,但如果你日志级别不够,这个错误可能被吞掉。
最后说一个我自己的土办法:在VPS上单独挂一个只做日志输出的空EA,每分钟打印一次服务器时间、点差、品种报价和账户余额,跑满24小时。这份日志能帮你快速判断到底是时间问题、点差问题还是连接问题。我当时就是靠这份日志发现VPS在凌晨三点到四点之间有一次短暂的断线重连,而我的EA正好在那个窗口有开仓逻辑,重连后SymbolInfo没刷新导致报价为空,直接跳过了信号。
你们有没有遇到过日志里明明有OrderSend调用但就是没成交的情况?我最近在排查一个类似的case,怀疑是VPS的网络延迟导致requote,有经验的朋友一起讨论。

补充一个细节:MT4日志里时间戳用的是服务器时间,VPS系统时间对不上时,EA按本地时间判断交易时段会直接跳过所有K线,这个用TimeCurrent和TimeLocal对一下就能看出来。
0 回复 众裁0 复制
#1
MarketSage
MarketSage #5· 前天 09:06
5楼
点差那块我跟你看法不太一样,回测里点差别设死,用“当前点差”模式才靠谱。我那个欧美剥头皮EA也栽过,日志全开后发现是OnInit里TimeCurrent()取到的是服务器时间,但判断条件写的是本地周末,周五晚上直接罢工三天没开单。
赞 回复 众裁0 复制
前天 09:06 #5
warm17
warm17 #4· 4 天前
4楼
楼上说的init阶段就挂掉这点很关键,我补充下:建议在OnInit里就加Print把交易时段、点差上限、服务器时间都打出来。另外先确认VPS上MT4的"允许实时自动交易"按钮是不是灰的,我上次折腾半天才发现是这
赞 回复 众裁0 复制
4 天前 #4
且听风吟
且听风吟 #3· 5 天前
3楼
你提到"TimeCurrent()和TimeLocal()混着写逻辑",这正是我踩过的坑。但我遇到的情况是日志全开了也没报错,因为EA是在初始化阶段就挂掉了——VPS时区偏移导致品种参数里的交易时段判断在init时直接返回,根本不进主循环。建议在OnInit里也加Print,光看Experts页签不够。
赞 回复 众裁0 复制
5 天前 #3
daniel53
daniel53 #2· 5 天前
2楼
原来你搜到的是"spread filter blocked"那条,我自己也遇到过,VPS上点差过滤设2.0,回测固定1.6没暴露。后来把日志等级全开才抓到,时区也偏移过两小时,EA直接错过伦敦开盘。😅
赞 回复 众裁0 复制
5 天前 #2
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 纪律不是束缚,是让你在坏运气里活下来的东西 下一帖 → MT4指标加载后主图空白:数据窗口有值但K线不显示