很热85.7

EA日志分析与故障诊断实操分享

XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
拾光旅人
拾光旅人 楼主
2026-8-11 15:49:06 597 7 1分钟 Lv.4 实盘汇友 Lv.4 主题6 帖数12 积分1014 汇币904
1楼
凌晨三点半,EURUSD的订单又没按预期平仓,EA日志里躺着一行“invalid ticket”就没了下文。这种时候最烦的不是行情,是连个报错都看不懂。我自己的VPS上挂了七八个EA,这几年跟日志死磕下来,发现大部分人根本不会系统性地看日志,全是等出问题才翻两页,然后瞎猜。今天就把我常用的日志诊断流程拆开讲,顺便对比一下两种主流方案:手动翻日志 VS 用外部脚本自动解析,各有各的坑,看你自己情况选。
先说手动翻日志这个方案。说白了就是打开MT4的“日志”标签页,或者到数据文件夹里找YYYYMMDD.log文件。优点是零成本,MT4自带,而且能直接看到实时上下文,比如价格变动、点差波动和EA动作的先后顺序。我踩过最大的坑是,日志文件默认只保留最近7天,如果你VPS硬盘小或者没设置自动清理,老日志会被直接覆盖,等你想回溯上周的故障点,连影子都找不到。另一个坑是,日志里同一秒可能刷十几条信息,尤其是多个EA共用一个账户时,订单号和时间戳对不上会让你误判是哪个EA出的错。手动方案适合单EA、低频交易的场景,但你要是跑网格或者马丁,日志量一大,肉眼根本盯不过来。
再说外部脚本自动解析,比如用Python写个脚本定期抓取日志文件,或者直接挂个EA把Print()输出重定向到数据库。优点很明显,可以按订单号、时间范围、错误类型做筛选,还能自动统计每天“invalid ticket”出现的频率,配合价格数据做关联分析。我自己的做法是每天凌晨用任务计划程序跑一次脚本,把前一天的日志里的ERROR和WARN级别行抽出来,按错误码分类存成CSV。但这里有个大坑:MT4的日志文件在EA运行时是锁定的,你直接读会报权限错误,必须先把文件复制到临时目录再解析,或者用FileCopy()在EA内部做快照。另外,脚本解析对日志格式变化很敏感,MT4更新版本后偶尔会改时间戳格式,我就遇到过正则表达式突然匹配不上,排查了半天发现是多了个毫秒字段。
具体实操步骤我按我的流程走,分四步:

  • 第一步,开启详细日志级别。在EA代码里用Print()输出关键变量,比如订单开仓价、止损价、当前Bar的收盘价,别偷懒只打“order opened”这种废话。我习惯在OrderSend()前后各打一行,带OrderTicket()和OrderStopLoss(),这样出问题能直接看到是参数传递错了还是服务器拒绝。
  • 第二步,设置日志文件按天分割。MT4默认是单个文件写到满,但你可以用FileOpen()自己写一个按日期命名的文件,把EA的自定义错误信息单独存,别跟MT4主日志混在一起。
  • 第三步,定期抓取错误码映射表。MT4的错误码从1到几百,比如138是“requote”,145是“modify failed”,这些在官方文档里有,但没人会背。我建议把常见错误码做成一个常量数组放EA里,Print()时直接输出文字描述,而不是数字,省得回头查。
  • 第四步,用外部脚本做二次过滤。我上面说的Python脚本,重点抓“invalid ticket”和“no money”这两个高频错误,因为前者通常是你用了过期的ticket号去修改订单,后者是保证金不足或者手数超出限制。脚本里加个逻辑,如果同一错误码在10分钟内出现超过5次,就发邮件提醒,这样不用每天盯日志。

踩过的坑里最典型的一次,是我有个EA在周五晚上频繁报“trade context busy”,手动翻日志发现是跟另一个EA同时调用OrderSend()抢上下文。后来改成在EA里加个互斥锁标志,用GlobalVariableSet()控制同一时刻只能有一个EA发单,问题就解决了。还有一次是VPS时间不同步,导致日志里的时间戳和服务器时间差了8小时,我以为是EA休眠逻辑出bug,折腾了两天,最后发现是Windows的自动同步时间被组策略关了。这种环境问题,日志本身根本看不出来,得配合系统事件查看器一起看。
最后说句实在话,手动方案适合刚上手的人,能帮你建立对EA运行机制的感觉;自动解析适合已经跑了一段时间、需要量化错误频率的。我个人现在是混合着来,平时靠脚本盯,出大问题才手动翻原始日志找上下文。你们有没有遇到过日志里明明没报错,但EA就是不下单的情况?那种最头疼,我目前只能靠加Print()埋点排查,不知道有没有更好的办法,欢迎交流。
4 回复 复制 众裁0
#1
MeadowFlicker
MeadowFlicker #8· 2026-8-12 10:03:30
2026-8-12 10:03:30
8楼
说到日志锁定这个坑,FileCopy确实好用,但我遇到的情况是复制后文件还是不全,后来改成先暂停EA再复制才稳。invalid ticket我这边多是网络延迟导致重复下单,建议在重试逻辑里加个订单状态检查,比单看报错码靠谱。
回复 复制 众裁0
2026-8-12 10:03:30 #8
晨雾拾光
晨雾拾光 #7· 2026-8-12 09:13:16
2026-8-12 09:13:16
7楼
“日志默认只留7天”这句太扎心了,我VPS上也是这么丢过数据的。我自己也常用外部脚本,但会先设个定时任务把日志复制到另一块盘再解析,避免锁定冲突。另外建议日志加个EA名称前缀,多EA时定位快很多。
回复 复制 众裁0
2026-8-12 09:13:16 #7
青山醉
青山醉 #6· 2026-8-11 16:06:05
2026-8-11 16:06:05
6楼
说到日志锁定这问题,FileCopy确实稳,但我觉得关键还是先把日志级别调好,别啥都Print。我挂的EA里有个混蛋经常刷屏,同一秒几十条,后来加了时间戳和魔术号过滤,一眼就能定位是哪个订单出问题。
回复 复制 众裁0
2026-8-11 16:06:05 #6
MeadowFox
MeadowFox #5· 2026-8-11 16:05:34
2026-8-11 16:05:34
5楼
invalid ticket这问题我盯了挺久,多数是重试逻辑没防重,尤其跳空时。手动翻日志累,我建议直接给Print加个唯一标识符,按魔术号筛。另外,日志锁定用FileCopy确实稳,但记得加延迟,文件在写时复制容易不完整。
回复 复制 众裁0
2026-8-11 16:05:34 #5
听风入梦
听风入梦 #4· 2026-8-11 16:02:36
2026-8-11 16:02:36
4楼
我也遇到过invalid ticket,但最坑的是它不一定代表真错误!有次我EA在价格跳空时重复平仓,日志里全是这提示,结果一查是止损单已经成交后又触发了一次平仓指令。手动翻日志真得配合时间戳看上下文,不然光看错误码容易误判。不过我觉得VPS上日志管理,直接用任务计划程序复制文件这招,比在EA里做快照省资源,尤其多EA跑的时候。
回复 复制 众裁0
2026-8-11 16:02:36 #4
MeadowSong
MeadowSong #3· 2026-8-11 15:49:25
2026-8-11 15:49:25
3楼
学到最实用的一点是日志文件默认只留7天,我之前就是没注意这个,上周想查一次凌晨的止损问题,翻遍VPS都找不到老日志,悔得不行。我自己也遇到过订单号对不上的情况,后来挂了三个EA在同一个账户,排查时全靠时间戳硬猜,确实容易搞混。另外你提到文件锁定,我补一个,用WinSCP远程看日志时也容易踩这个坑,不如直接复制到本地再分析,省事。
回复 复制 众裁0
2026-8-11 15:49:25 #3
MapleBreeze
MapleBreeze #2· 2026-8-11 15:49:23
2026-8-11 15:49:23
2楼
手动翻日志确实坑多,我VPS上日志被覆盖过好多次,后来直接脚本复制出来再解析。不过你说的文件锁定问题,我一般用FileCopy()在EA里定时快照,比外部读稳。
回复 复制 众裁0
2026-8-11 15:49:23 #2
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。汇友之家合作的各家经纪商均为持有正规外汇牌照的经纪商,我们不参与经纪商的任何经营活动。经纪商在经营过程中可能出现破产清算、资不抵债、跑路或躲避责任等情况,这些问题汇友之家无法控制,亦不承诺任何经纪商资金的绝对安全。请知悉!
← 上一帖 手把手教你搞定MT5对冲账户EA配置详解 下一帖 → MT5回测数据与实盘差异巨大,原来是订单执行模式搞的鬼