检查网络连接

我们知道,MetaTrader 5 平台是一个包含多个环节的分布式系统。除了客户端终端和经纪人服务器,还包括 MQL5 社区、市场,云服务等等。事实上,客户端部分也是分布式的,由终端和测试代理组成,可以部署在一个本地网络的多台计算机上。在此情况下,任何环节之间的连接可能因种种原因而断开。虽然 MetaTrader 5 基础架构会尝试自动恢复其功能,但不一定总能快速恢复。

因此,在 MQL 程序中,应当考虑连接丢失的可能性。MQL5 API 允许你控制最重要的连接:与交易服务器和 MQL5 社区的连接。以下属性在 TerminalInfoInteger 中可用。

标识符

说明

TERMINAL_CONNECTED

与交易服务器的连接

TERMINAL_PING_LAST

与交易服务器的最后已知 ping 值(微秒)

TERMINAL_COMMUNITY_ACCOUNT

MQL5.community 授权数据在终端中的可用性

TERMINAL_COMMUNITY_CONNECTION

与 MQL5.community 的连接

TERMINAL_MQID

用于发送推送通知的 MetaQuotes ID 的可用性

除了 TERMINAL_PING_LAST 以外的所有属性均为布尔标志。TERMINAL_PING_LAST 包含一个 int 类型的值。

除了连接,MQL 程序通常还需要确保其数据是最新的。特别要注意,检查过的 TERMINAL_CONNECTED 标志不一定意味着你感兴趣的报价已与服务器同步。为此,你还需要检查 SymbolIsSynchronizedSeriesInfoInteger(..., SERIES_SYNCHRONIZED)。这些功能将在关于 时间序列的章节讨论。

TerminalInfoDouble 函数支持另一个有趣的特性:TERMINAL_RETRANSMISSION。它表示此计算机上所有正在运行的应用程序和服务在 TCP/IP 协议中重新传输的网络数据包百分比。即使是速度最快、配置最完善的网络,也难免发生丢包的情况,导致在接收者和发送者之间无法确认包传递。在此类情况下,丢失的包被重新发送。终端本身不统计 TERMINAL_RETRANSMISSION 指标,但是会在操作系统中每分钟请求一次。

若该度量的值很大,则表明可能存在外部问题(互联网连接、你的网络提供商、本地网络或计算机问题),这可能降低终端连接的质量。

如果确认已经与社区建立连接 (TERMINAL_COMMUNITY_CONNECTION),则 MQL 程序可以通过调用 TerminalInfoDouble(TERMINAL_COMMUNITY_BALANCE) 查询用户的当前余额。这可让你使用对付费交易信号的自动订阅(API 文档见 mql5.com 网站)。

我们使用 EnvConnection.mq5 脚本检查列出的特性。

void OnStart()
{
   PRTF(TerminalInfoInteger(TERMINAL_CONNECTED));
   PRTF(TerminalInfoInteger(TERMINAL_PING_LAST));
   PRTF(TerminalInfoInteger(TERMINAL_COMMUNITY_ACCOUNT));
   PRTF(TerminalInfoInteger(TERMINAL_COMMUNITY_CONNECTION));
   PRTF(TerminalInfoInteger(TERMINAL_MQID));
   PRTF(TerminalInfoDouble(TERMINAL_RETRANSMISSION));
   PRTF(TerminalInfoDouble(TERMINAL_COMMUNITY_BALANCE));
}

下面是一个日志示例(值将匹配你的设置)。

TerminalInfoInteger(TERMINAL_CONNECTED)=1 / ok
TerminalInfoInteger(TERMINAL_PING_LAST)=49082 / ok
TerminalInfoInteger(TERMINAL_COMMUNITY_ACCOUNT)=0 / ok
TerminalInfoInteger(TERMINAL_COMMUNITY_CONNECTION)=0 / ok
TerminalInfoInteger(TERMINAL_MQID)=0 / ok
TerminalInfoDouble(TERMINAL_RETRANSMISSION)=0.0 / ok
TerminalInfoDouble(TERMINAL_COMMUNITY_BALANCE)=0.0 / ok