Linux安装MT4 - MT4账户连接状态检测MQL4脚本编写实战

IsConnected函数的基本用法和参数含义
IsConnected这个函数说实话很简单,它不需要任何参数,直接调用就行。返回true表示平台与服务器之间的连接是正常的,返回false就说明连接已经断了。但这里有个坑,很多新手以为连接正常就等于账户状态没问题,其实完全不是一回事。连接正常只能说明你的MT4客户端能跟服务器通信,但账户是否处于可交易状态,还得配合其他函数一起判断。
我在实际使用中发现,IsConnected函数有个特点,它检测的是MT4客户端与交易服务器之间的TCP连接。如果你用的是模拟账户,连接断掉可能只是网络波动,重连一下就好。但如果是真实账户,连接断了那问题就大了,特别是你在跑EA的时候,连接一断,EA发出的所有指令都会排队,等重新连上之后才会发送,这时候价格早就跑远了。
还有个细节值得注意,IsConnected函数返回的是当前时刻的状态,它不是持续监控的。所以你写EA的时候,不能只在初始化的时候调用一次,必须在每个tick或者每根K线都去检查。
我见过有人把IsConnected放在init函数里,结果运行了一整天才发现连接早断了,这完全失去了检测的意义。
另外,IsConnected函数在测试策略的时候会有一些特殊表现。在MT4的策略测试器里,这个函数几乎总是返回true,因为测试环境模拟了连接状态。所以你的EA如果依赖IsConnected做风控,在实盘和测试环境下的行为可能会不一样,这点必须提前考虑到。
结合其他函数全面判断账户状态
光靠IsConnected一个函数,其实很难完整判断账户状态是否正常。我通常的做法是,把IsConnected和AccountInfoInteger里的ACCOUNT_TRADE_MODE、ACCOUNT_TRADE_EXPERT这几个参数结合起来用。ACCOUNT_TRADE_MODE能告诉你账户是模拟盘还是实盘,ACCOUNT_TRADE_EXPERT则能判断当前账户是否允许EA自动交易,这些信息对判断账户状态都很重要。
还有一个容易被忽略的函数是TerminalInfoInteger,里面的TERMINAL_CONNECTED参数也能检测连接状态。说实话,这个函数和IsConnected返回的结果基本一致,但TerminalInfoInteger能提供更多的终端信息,比如TERMINAL_TRADE_ALLOWED,这个参数能告诉你当前终端是否允许手动交易。如果终端不允许交易,那就算连接正常,你的单子也发不出去。
在实际写脚本的时候,我一般会先检查IsConnected,如果返回false,就直接提示连接断开,不再继续往下执行。如果返回true,我再去检查ACCOUNT_TRADE_MODE,看看账户是否被冻结或者限制交易。这种层层递进的检查方式,比单独用IsConnected靠谱得多。我自己写的一个账户监控脚本,就是每隔五秒钟做一次全量检查,任何一项不满足就在图表上弹出红色警告。
这里顺便提一下MQL4里另一个有用的函数——SymbolInfoInteger,虽然它主要用来获取品种信息,但里面的SYMBOL_TRADE_MODE参数能告诉你当前品种是否允许交易。有些时候账户连接正常,但某个品种被交易所暂停交易了,这时候下单也会失败。把这些因素都考虑进去,账户状态的判断才算完整。
实战编写一个账户状态检测脚本
说了这么多理论,接下来直接上实战。我写一个简单的账户状态检测脚本,包含连接检测、账户模式检测和交易权限检测三个部分。这个脚本的核心逻辑是,先检查IsConnected,如果连接正常,再检查账户是否处于可交易状态,最后把结果显示在图表上。代码不长,但很实用,你可以直接复制到MT4里用。
脚本的第一部分是检查连接状态,我用了一个if语句来判断IsConnected的返回值。如果返回false,就用Comment函数在图表左上角显示红色的警告文字,同时用Alert弹窗提醒。这里注意,Comment函数显示的文字会覆盖之前的文字,所以每次更新状态前要清理一下。
第二部分检查账户状态,我用了AccountInfoInteger(ACCOUNT_TRADE_MODE)这个函数。如果返回值是ACCOUNT_TRADE_MODE_DEMO,说明是模拟账户,脚本会显示模拟账户连接正常。如果是ACCOUNT_TRADE_MODE_CONTEST,说明是比赛账户,这种账户通常有交易限制。如果是ACCOUNT_TRADE_MODE_REAL,说明是真实账户,脚本会显示实盘账户连接正常。
第三部分检查交易权限,我用TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)来判断。如果这个函数返回false,说明终端禁止交易,这时候就算连接正常也不能下单。我还会检查MQLInfoInteger(MQL_TRADE_ALLOWED),这个函数能告诉你当前脚本或EA是否被允许执行交易操作。把这两个检查放在一起,基本就能覆盖大多数交易权限问题了。
脚本运行效果和常见异常处理
这个脚本写完之后,我把它放在MT4的Scripts文件夹里,编译通过后拖到图表上就能运行。运行效果是这样的:如果一切正常,图表左上角会显示绿色的文字,写着账户连接正常,附带账户号码和当前模式。如果哪项检查不通过,文字会变成红色,并且弹出警告框,提醒你注意账户状态。
在实际使用中,我遇到过几种比较典型的异常情况。第一种是网络波动导致的短暂断线,IsConnected返回false,但过几秒钟又自动恢复了。
这种情况下脚本会频繁报警,说实话有点烦人。后来我在脚本里加了一个延迟机制,连续三次检测到断线才报警,这样能过滤掉大部分瞬时波动。
第二种情况是账户被服务器端强制登出,比如密码被修改或者账户在其他地方登录。这时候IsConnected可能还是返回true,但下单时会提示无效账户。针对这种情况,我增加了一个AccountInfoDouble(ACCOUNT_MARGIN_FREE)的检查,如果可用保证金突然变成负数,基本可以确定账户出了问题。
第三种情况比较少见,就是MT4终端本身出现了卡顿或者无响应。这时候IsConnected返回的可能还是true,但实际上下单指令已经发不出去了。我解决这个问题的方式是,在脚本里加一个心跳检测,每隔一段时间用OrderSend发送一个极小量的测试单,如果发送失败就说明终端状态不正常。当然这种方法会占用一点资源,不是所有场景都适合用。