为 MetaTrader 5 开发 MQTT 客户端:TDD 方法 - 最终篇·综合运用
📡

为 MetaTrader 5 开发 MQTT 客户端:TDD 方法 - 最终篇·综合运用

(3/3)· 前面拼好了 CONNECT、PUBLISH 和属性层,这一篇把消息真正灌进自定义交易品种里

新手友好 第 3/3 篇
很多人把 MQTT 客户端写完就停在能连能发,以为协议通了就完事。真到要把行情或账户数据落进 MT5 图表时,才发现自定义品种刷新和订阅主题对不上,白干一半。这一篇专门堵这个漏。

◍ 从报价窗口抠出真实成交量

在 MT5 里做指数差价合约(如 #USSPX500)分析时,很多人只盯 bid/ask 而忽略 volume_real 字段,这个字段记录的是该 tick 的真实成交手数,比抽象 volume 更有参考意义。 上面这段函数在取不到对应品种 rates 时会直接返回空串并打印失败提示,成功时把最新 tick 的 real volume 拼进字符串输出,你可以在 EA 的 OnTick 里调用它,把每笔 tick 的真实量打到日志,连续观察半小时就能看出美盘开盘前后量能分布的差异。 外汇与贵金属市场杠杆高、滑点频繁,tick 级量能只反映场内瞬时拥挤度,不能单独作为方向依据,需配合价差与订单流结构使用。

MQL5 / C++
            " Vol Real = ", last_tick.volume_real
       );
      Print(out);
      class="kw">return out;
   }
  else
      Print("Failed to get rates for class="macro">#USSPX500");
  class="kw">return "";
}

在 MT5 里验收自定义品种推送

两个 MQTT 服务跑通并和代理确认连通后,直接开 MT5 终端看结果。先盯“市场报价”窗口里的“分时报价”标签,正常的话会跳出你自定义品种的连续报价,图 17 那种状态就是成了。 自定义品种主图上也应该同步刷出分时更新,和报价窗口对得上才说明订阅没断链。 “专家”日志标签会吐出不少调试输出,这是我们故意留的。除常规信息外,能看到 PrintArray 把数据包内容打印出来,省得你再开 Wireshark 抓包验内容。 验证动作很直接:开终端、看分时、翻日志三处对齐,任一处静默就回查发布端连接。外汇与贵金属自定义品种数据延迟可能引发错价,实盘前务必用模拟环境跑够样本。

「画得少,看得清」

这套基于 MQTT 的行情共享思路,演示虽跑在同一台 MT5 实例和机器上,但已暴露出协议层的灵活与稳:跨经纪商、跨账户转发实时报价在架构上可行,只是原生客户端还差 QoS_2 与用户属性两块硬骨头。 作者早先在 GitHub 的 README 里写过,2025 年 1 月 6 日已停更这段代码——‘最好的开源从挠痒开始,但后来找到更好解法’。所以眼下能直接抄去用的,是 mqtt-headers.zip(23.78 KB)、mqtt-services.zip(3.51 KB)、mqtt-tests.zip(19.52 KB)三个包里的 TDD 骨架,而非完整合规客户端。 外汇与贵金属行情经 MQTT 中转本身不改写价格风险,杠杆品种仍属高风险,真要接生产先把 4 月底那版测试覆盖跑通再谈。打开 MT5 把 zip 里的样例塞进 Include 目录,用本地 broker 回环发一条 tick,比读十篇综述都实在。

交给小布盯盘看消息流
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到 MQTT 推送是否准时落到自定义品种,不用自己写日志盯连接状态。

常见问题

通常塞入发送端标识、策略名或时间戳等元数据,接收端按 key 解析后做路由,不影响标准包结构,具体见本系列第五篇的属性讨论。
小布目前以内置诊断看板呈现推送到达与品种刷新延迟,不替代你写的 EA 客户端;把重复劳动交给小布,你专注决策。
可能是 CustomTicks 未触发强制刷新或 MQL5 端缓存未清,需在写入后调用相关刷新接口,并在订阅回调里确认主题与品种映射无误。
概率上会话标志或清理会话位配错会让代理拒绝或丢弃消息,尤其 QoS1/2 下更易暴露,建议回归本系列第三、四篇的测试驱动校验。