从入门到放弃再到搞定:EA异常处理与日志记录

很热73.5
登录发帖
XM 推荐平台

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

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
策略部署客
策略部署客 楼主 2026-8-22 20:31:20 浏览 525 回复 9 阅读 1 分钟
Lv.1 新手汇友 等级 Lv.1 主题 2 帖数 16 积分 2330 汇币 1880
1楼
说实话,我见过太多EA死在“看起来没问题”上。回测跑得漂亮,实盘一挂就翻车,最后一看日志,全是些莫名其妙的断点。很多人觉得日志就是print一下,能跑就行,但真正到了异常处理这个层面,你会发现,日志写不好,你连死因都查不出来。今天不聊策略逻辑,就聊聊怎么把EA的“尸体”解剖明白。
先说一个最容易被忽略的坑: MT4/MT5的日志缓冲区是内存优先的 ,你直接Print()出来的东西,在崩溃瞬间大概率没来得及写入文件。我早期做欧美EA的时候,遇到过凌晨三点准时掉线,重启后日志文件里干干净净,跟没发生过一样。后来才明白,必须主动把关键状态写入自定义文件,而且要控制写入频率。别用FileWrite每次都开文件,那会卡顿,用 FileOpen+FileSeek+FileWriteString 组合,配合一个全局变量做节流,比如每5秒或者每10个tick才写一次。这样即使崩溃,你丢的数据最多是几秒内的,不影响定位问题。
再来说异常捕获。MQL4/5的OnTick()里,你没法用try-catch,这是个硬伤。所以我的做法是,在每次交易操作前做前置检查,而不是等它报错。比如你挂单,先检查 MODE_TRADEALLOWED 和 TERMINAL_CONNECTED ,再检查账户的 MARGIN_LEVEL 和 FREE_MARGIN 。这些检查不是多余,是保命。我见过有人做黄金EA,止损设得很近,结果周五晚上点差突然从20拉到80,止损直接变成滑点成交,账户瞬间爆掉。如果日志里记录了当时的点差和可用保证金,你就能复现问题,否则只能瞎猜。
具体我的日志结构大概是这样的,供参考:

  • 时间戳(用TimeLocal(),别用TimeCurrent(),因为服务器时间和本地时间在VPS上可能差好几个小时)
  • 订单类型和手数(比如OP_BUY,0.5手)
  • 当前点差(Ask-Bid,这个关键时刻能救命)
  • 账户权益和可用保证金(判断是否接近爆仓线)
  • 最近一次错误码(GetLastError(),这个必须记,很多新手忽略)
  • 自定义状态标记(比如“等待回调”“已挂单”“止损触发”等)

写的时候用 FileWriteString 加个分隔符,比如“|”,后面用Excel或者Python脚本拉出来分析,比在MT4里翻日志高效多了。我这边是每天凌晨定时把日志文件打包,然后通过FTP传到本地服务器,写个简单的Python脚本做异常关键词扫描,比如“Error”“Invalid”“Margin”这些,自动发邮件提醒。这套东西跑了大半年,帮我抓出过两个隐藏bug,一个是周末跳空时止损价没更新,另一个是API返回的报价数组越界。
还有一个坑,VPS上的时区问题 。你本地跑得好好的,放VPS上就各种对不上。因为VPS默认UTC时间,你MT4里设置的GMT+2,日志里记录的时间和你实际看盘时间差了6个小时,排查问题的时候特别容易混乱。我的建议是日志里统一用 TimeGMT() 记录,然后分析的时候再转换,这样不管你在哪台机器上跑,时间线都是对齐的。
最后说下重试机制。EA调用交易函数失败,很多人直接return,这是不对的。比如下单失败,错误码是 ERR_TRADE_TIMEOUT (148),这时候应该等待几秒再重试,而不是放弃。但重试次数要有限制,我一般设3次,每次间隔5秒,超过就放弃并写日志。注意,重试的时候要重新检查价格和点差,因为市场可能已经变了,你拿旧价格重试,等于白试。另外,别在同一个tick里连续重试 ,那样会卡死主线程,导致掉线。
说到底,日志这东西,不是为了给别人看的,是给你自己复盘用的。我每次改完EA,都会跑一周的模拟盘,然后专门看日志里有没有异常记录。很多时候,行情没变,但日志里出现了之前没见过的错误码,那就要警惕了,多半是代码里某个边界条件没处理好。
你们现在跑EA,日志文件一般保留多久?我这边是保留30天,超过就自动清理,但关键的错误日志会单独备份。有没有人遇到过日志文件太大导致EA卡顿的情况?可以聊聊你们怎么处理的。

对了,补充一句:节流写入的时候记得把时间戳也存下来,不然回头排查时连崩溃前最后一条状态发生在哪一秒都对不上。
1 回复 众裁0 复制
#1
frank78
frank78 #10· 2026-9-13 19:00:03
10楼
你提到每10个tick写一次,那凌晨点差拉大时tick少,会不会反而漏掉关键日志?我也遇到类似矛盾。
赞 回复 众裁0 复制
2026-9-13 19:00:03 #10
CapitalGuardh
CapitalGuardh #9· 2026-9-6 11:03:42
9楼
TimeLocal这个细节确实到位,我自己也吃过TimeCurrent的亏。不过日志节流我倾向按tick间隔而非时间,不同品种波动率差太多了,固定5秒在欧美EA上可能漏记关键点。
赞 回复 众裁0 复制
2026-9-6 11:03:42 #9
StrategyDevo
StrategyDevo #8· 2026-9-5 19:00:25
8楼
TimeLocal细节确实精辟,不过我更想请教下FileOpen+FileSeek组合的写入频率控制,振荡市tick密集时每10个tick可能连一秒都不到,我自己也试过类似节流,但发现不同VPS磁盘IO差异太大,写太勤反而卡图表,最后加了毫秒级时间戳对比才平衡。😅
赞 回复 众裁0 复制
2026-9-5 19:00:25 #8
老吴
老吴 #7· 2026-8-27 14:35:07
7楼
"MT4/MT5日志缓冲区内存优先"这点我确实有同感,之前跑黄金EA也栽在崩溃后日志空白上。我自己也加了点差阈值监控,周五高波动时提前减仓,比事后查尸检靠谱多了。👍
赞 回复 众裁0 复制
2026-8-27 14:35:07 #7
MoonlitHiker
MoonlitHiker #6· 2026-8-26 14:03:23
6楼
TimeLocal这个细节我也踩过,不过我觉得更坑的是日志文件本身不自动flush,崩溃前几秒的Print经常丢。我后来直接开个自定义文件用FileWriteString配合全局变量节流,每8个tick写一次,比5秒更稳,因为高波动时tick密集,按时间写可能漏掉关键瞬间。
赞 回复 众裁0 复制
2026-8-26 14:03:23 #6
MorningCoffees
MorningCoffees #4· 2026-8-24 16:03:14
4楼
TimeLocal这个细节太关键了,我之前用TimeCurrent结果VPS时区漂移,日志时间全乱,排查起来更费劲。
赞 回复 众裁0 复制
2026-8-24 16:03:14 #4
跟单服务阿明
跟单服务阿明 #3· 2026-8-24 15:01:55
3楼
日志缓冲区内存优先这个坑确实深,我跑黄金EA时也遇到周五点差突变,止损变滑点爆仓,后来学你加了点差监控才稳住。我自己也改用FileWriteString节流写日志,崩溃恢复快多了。
赞 回复 众裁0 复制
2026-8-24 15:01:55 #3
bird9329
bird9329 #2· 2026-8-23 21:30:04
2楼
"MT4/MT5日志缓冲区内存优先"这个坑太真实了,我跑镑日EA时也栽过。后来改成FileOpen+FileSeek+FileWriteString,每5秒写一次关键状态,现在出问题基本能还原死因。前置检查那段也认同,我加了个点差监控,超阈值就暂停交易,保住不少本金。
赞 回复 众裁0 复制
2026-8-23 21:30:04 #2
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 地缘政治避险行情的交易应对框架 下一帖 → EA策略失效后的应对方案,我交了学费才学会的