MT4止损设置 - MT4程序化交易异常停止日志排查报错定位方法

日志文件到底藏在哪,怎么打开才对路
很多人不知道MT4的日志其实分两种,一种是终端底部的“智能交易”标签页,这个是实时显示的,程序跑的时候有什么动静都在这里蹦出来。另一种是存在硬盘上的物理日志文件,路径一般在MT4安装目录下的MQL4文件夹里,再往里找Logs文件夹,里面按日期存着每天的详细记录。我建议两个地方都要看,因为实时窗口有时候会刷得太快,还没看清就被顶掉了,这时候就得靠文件里的记录。
打开日志文件有个小技巧,最好用记事本或者Notepad++这类纯文本编辑器,别用Word。因为MT4的日志文件是TXT格式的,用Word打开容易乱码,而且文件大了之后Word会很卡。我一般习惯直接右键用记事本打开,然后按Ctrl+F搜索“error”或者“fail”这样的关键词,能很快定位到关键信息。当然,如果你知道大概什么时间出的事,直接翻那个时间段的记录也行。
还有一点要注意,MT4的日志文件是按日期命名的,比如20250206.log这样的格式。如果你发现当天的日志文件不存在,或者里面是空的,那问题可能出在MT4本身没启动成功,而不是策略停了。这种情况就得去检查MT4的安装目录下有没有生成新的日志文件,或者看看Windows事件查看器里有没有MT4相关的错误记录。
说实话,我第一次看日志文件的时候真是一头雾水,里面密密麻麻的全是时间戳和乱七八糟的代码。但后来我发现,只要抓住几个关键字段,比如“init”、“tick”、“order”、“error”这些词,就能理出个大概脉络。日志文件虽然看起来吓人,但其实结构很规律,每一条记录都包含时间、进程ID、日志级别和具体内容,多翻几遍就熟悉了。
最常见的报错类型和它们背后的真实原因
日志里最常见的报错就是“TradeContextBusy”,这个错误的意思是交易上下文繁忙。说白了就是你的EA在同一个时间点试图发送多个交易指令,但MT4的服务器一次只能处理一个。这种情况一般在网络延迟高或者服务器响应慢的时候特别容易出现。我遇到过一次,EA在开仓信号出现后马上又执行了加仓逻辑,结果两条指令几乎同时发出,就被服务器拒绝了。
还有一种特别坑的报错是“InvalidStops”,这个意思是止损或者止盈设置得不合法。很多新手写EA的时候,止损价跟开仓价一样,或者比当前价格还离谱,就会被拒绝。我刚开始写策略的时候也犯过这个错,当时日志里报了这个错,我还以为是平台的问题,后来才发现是我自己代码里止损价算错了。所以看到这个报错,先检查一下你的止损止盈价格是不是真的合理。
另外,“ArrayOutOfRange”这个报错也很常见,尤其是在处理K线数据或者指标值的时候。这个报错的意思是你试图访问一个不存在的数组元素,比如说K线只有1000根,但你的代码想取第1001根的数据。这种错误一般是因为指标计算需要的数据量不够,或者你的循环条件写错了。我碰到过好多次,每次都是仔细检查数组下标就解决了。
最后要提的是“NoMoney”这个报错,这个最简单粗暴,就是账户余额不够支付保证金了。但有时候不一定是真的没钱,可能是你用了错误的账户类型,比如在模拟账户上跑需要真实账户才能用的策略。或者杠杆设置有问题,导致保证金占用过高。
遇到这个报错,先看余额,再看杠杆,最后看持仓量,一层层排查。
日志时间戳里的学问,能帮你精准定位崩溃瞬间
MT4日志里每一条记录都带时间戳,精确到秒。这个时间戳特别有用,因为它能告诉你EA是从什么时候开始出问题的。我习惯的做法是,先找到EA停止运行的那个时间点,然后往前翻几分钟的日志,看看在那之前有没有什么异常警告。很多时候,问题不是突然出现的,而是有一个渐进的过程,比如一连串的“OrderModify failed”之后,EA才彻底停下来。
时间戳还能帮你判断是不是服务器断线导致的。如果日志里在某个时间点突然出现一堆“Connection lost”或者“Server disconnect”这样的消息,那大概率是网络问题。我之前碰到过一次,EA停在了凌晨两点,查日志发现那会儿正好是服务器维护时间,MT4自动断开了连接,EA因为没有重连机制就一直傻等着,最后被系统判定为无响应就停了。
还有个小细节,MT4的日志时间显示的是服务器时间,不是本地时间。如果你发现日志里的时间跟你的电脑时间对不上,别慌,这是正常的。但如果你要跟其他系统做时间对比,比如跟VPS的日志或者跟经纪商的对账单做对比,就得注意这个时间差,不然可能会错怪别人。
说实话,光看时间戳其实就能解决一大半问题。有一次我的EA每天下午三点准时停止运行,我翻了好几天的日志,发现每天下午三点都有同一个报错“Timeout on reading tick data”。后来我才明白,那会儿正好是数据流高峰,网络拥堵导致读取tick数据超时。知道了这个规律之后,我在EA里加了个重试机制,问题就解决了。
日志排查的正确姿势,从崩溃现场一步步倒推
很多人在日志里看到一堆红色报错就慌了,其实没必要。正确的做法是,先找到最后那条“EA stopped”或者“init failed”的消息,然后从这条消息往前倒推,看看在这之前发生了什么。我一般会以停止时间为起点,往前翻至少50条日志记录,把整个过程在脑子里过一遍,就像看监控回放一样。
举个例子,有一次我的EA停了,日志最后一条是“OrderSend error 138”,意思是订单发送被拒。我往前翻了几条,看到“Ask price changed”和“Bid price changed”这样的消息,再往前翻,发现“New tick arrived”之后马上就有“OrderSend”的请求。这一下就明白了,EA是在收到新报价后立刻发单,但报价变动太快,服务器觉得价格已经过期就拒绝了。解决办法很简单,在发单前加一个价格校验,或者延迟几毫秒再发。
还有一种情况是日志里什么都没有,直接就是空白,然后EA就停了。这种时候问题往往不在EA本身,而在MT4平台。比如你可能不小心在“智能交易”按钮上点了一下,把自动交易给关了。或者MT4的全局变量被其他程序改了,导致EA初始化失败。这些情况日志里不会记录,因为MT4本身不认为这是错误,只是环境变了。
排查的时候别忘了看“日志”标签页和“智能交易”标签页的区别。前者记录的是平台级别的操作,比如登录、断开、下载历史数据这些;后者记录的是EA级别的操作,比如开仓、平仓、修改订单这些。如果你的EA停了,但“日志”标签页里一切正常,那问题肯定出在EA代码里;如果“日志”标签页里有一堆连接异常,那就要先解决网络问题再说。