为 MetaTrader 5 开发 MQTT 客户端:TDD 方法 - 最终篇·综合运用
(3/3)· 前面拼好了 CONNECT、PUBLISH 和属性层,这一篇把消息真正灌进自定义交易品种里
◍ 从报价窗口抠出真实成交量
在 MT5 里做指数差价合约(如 #USSPX500)分析时,很多人只盯 bid/ask 而忽略 volume_real 字段,这个字段记录的是该 tick 的真实成交手数,比抽象 volume 更有参考意义。 上面这段函数在取不到对应品种 rates 时会直接返回空串并打印失败提示,成功时把最新 tick 的 real volume 拼进字符串输出,你可以在 EA 的 OnTick 里调用它,把每笔 tick 的真实量打到日志,连续观察半小时就能看出美盘开盘前后量能分布的差异。 外汇与贵金属市场杠杆高、滑点频繁,tick 级量能只反映场内瞬时拥挤度,不能单独作为方向依据,需配合价差与订单流结构使用。
" 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,比读十篇综述都实在。