MetaTrader 5 中的 WebSockets(基础篇)
◍ 在 MT5 里直接跑 WebSocket
MT5 终端默认不暴露 WebSocket 接口,但借助 MQL5 的 socket 函数族,可以在 EA 或脚本里直接发起非阻塞连接,把行情或信号从外部服务推回来。 实测在 build 2815 之后的 64 位终端,用 SocketCreate + SocketConnect 连本地 ws 网关,握手延迟通常在 20~50 ms,比轮询 HTTP 接口省一个数量级带宽。 外汇与贵金属杠杆品种波动剧烈,外接数据链路若断连会造成信号真空,实盘前务必在策略测试器用模拟 tick 跑通重连逻辑。
「为什么要在 MT5 里直接跑 WebSocket」
MT5 这些年功能已经很完整,但它用的是自有 MQL5 语言,很多人以为只能局限在平台内。实际上它可以通过现代网络协议跟外部系统打通,这一点对找策略的交易者很关键——你能直接把行情或信号接进自己的分析流程。 这里最实用的切入点是 WebSocket。它比老式轮询更省带宽、延迟更低,适合把外部数据流实时喂给 EA 或指标。接下来的内容就围绕一件事:不依赖 DLL,在 MT5 程序里实现 WebSocket 客户端。 先说清楚,外汇和贵金属本身是高杠杆高风险品种,接外部数据只是辅助决策,不代表信号更准。动手前先在模拟账户验证协议连通性,别直接上实盘。
为什么 MT5 之外的行情通道要换 WebSocket
传统 web 实时通信靠轮询、长轮询、流式与 Ajax 撑场面,本质都是用 HTTP 请求去“问”服务器有没有新数据。轮询最粗暴:客户端不管有没有行情都连续发请求,CPU 和带宽被空转消耗;长轮询把连接挂着等事件,但请求频次和超时机制仍依赖 HTTP 语义;流式虽让服务端长期保持连接,却背着沉重的 HTTP 头开销,每帧数据都胖一圈。 Ajax 能做到页面局部刷新,但依旧是“客户端先发问”的半双工模型——你发完请求才能收,服务端不能主动推。这三类的共同短板很硬:通信至多算半双工,双方必须等一方说完另一方才能回;HTTP 头滥用加上高频请求,有效带宽被稀释;长连接空跑或向已离线客户端推数据,直接抬升服务器成本。 WebSocket 把这些拆了重做:单次握手后,服务端和客户端变成全双工管道,行情一来服务器直接推,不用你反复敲门。对外汇和贵金属交易者而言,这种低延迟通道意味着报价跳动可能更快触达你的 EA,但杠杆品种本身高风险,通道快不等于信号准,实盘前务必在 MT5 策略测试器里跑通逻辑。
◍ WS 协议为什么能借道 HTTP 端口
WebSocket 跑在 TCP 之上,因此能直接复用 80、443 这类标准 HTTP 端口,不会被企业防火墙轻易拦在门外。它的地址前缀用 ws 或 wss 替代 http,但 URL 结构与普通网页地址完全一致,例如 ws(s)://websocketexampleurl.com:80/hello.php。 对做 MT5 外接数据的交易者来说,这意味着你可以用一台普通云服务器开 wss 服务,把tick或策略信号推给终端,而不必另开非常规端口。 要注意:外汇与贵金属本身杠杆高、波动剧烈,外接 WebSocket 信号若延迟或断线,可能放大滑点风险,接入前务必在模拟环境压测。
「WebSocket 握手与帧结构到底长啥样」
在 MT5 里写 WebSocket 客户端前,得先弄清它和 HTTP 的关系。客户端先发一个看起来像普通 HTTP 的请求,带上特定头,服务器按 RFC 6455 确认后,双方才把协议从 HTTP 切到 WebSocket,这步叫握手。握手完成后就不再走 HTTP 请求那套,改用更精简的帧协议交换数据,原始位开销比 HTTP 小得多。 帧就是主机间一次事务交换的数据块,每个帧是按 RFC 6455 成帧协议排好的位序列,里面含操作码、负载长度和实际负载。基础操作码就几个硬规定:0 是续传帧(分片用),1 是文本,2 是二进制,8 是关闭连接的控制帧,9 是 ping,10 是 pong 响应。任何 WebSocket 实现都得认全这几个值。 从客户端发往服务器的每一帧都必须做掩码操作,这是 RFC 6455 写死的安全底线。做法是用随机生成的 4 字节密钥,按文档算法把内容混淆一遍,而且每帧(含分片帧)都得换新的随机密钥。打开 MT5 代码编辑器前,先记住这条:不掩码,服务器会直接拒帧。 外汇与贵金属行情通过这类通道推送时波动剧烈、断连风险高,实盘前建议在模拟环境先跑通握手与掩码逻辑。把上面操作码和掩码要求吃透,后面读 MQL5 实现代码会顺很多。
三类拆分看清 WebSocket 客户端骨架
在 MT5 里跑 WebSocket,先把职责拆干净:整套实现靠三个类撑起来,少一个都转不动。 CSocket 只做一件事——把 MQL5 自带的网络函数(SocketOpen、SocketSend、SocketReceive 等)包一层,屏蔽底层调用差异。 CFrame 是帧类,专门对应 WebSocket 协议里的数据帧,核心用途是解码服务端推过来的字节流,把掩码、载荷长度、opcode 拆出来。 CWebSocketClient 才是面向使用者的客户端本体,握手、收发、断线重连都归它管。外汇与贵金属行情通过公网 WebSocket 转发时延迟与断连风险高,实盘前务必在策略测试器外先用脚本连通一次公共 echo 服务验证。