基于 MetaTrader 5 Manager API 开发:实时风控监控的五条经验

作者:曾祈荣 · · 阅读约 4 分钟

我曾为一个线上自营交易平台,基于 MetaQuotes 的 MetaTrader 5 Manager API 开发了一个 C#/.NET 服务,以及一个每隔几秒检查所有资金账户亏损规则的监控器。如果你也要做同样的事,以下是我最想分享的几点。

1. 弄清楚每个接口用来做什么

MT5 给经纪商提供了两扇主要的门。Manager API 是原生 SDK:管理员账号连接交易服务器后,会在本地维护一份实时更新的用户与持仓副本,也就是所谓的推送(pump)。Web API 则是普通的 HTTP 接口,任何语言都能调用,但每次读取都要走一次网络往返。比较合理的分工是:高频读取走 Manager API 的本地副本,写操作则通过你所信任的接口,并做好防护。

2. 从推送缓存读取,而不是走网络

我们最初的持仓读取是网络请求,每个账户可能要好几秒。改为读取 Manager API 的推送缓存后,耗时从秒级降到毫秒级,这正是“一分钟检查一次风险”和“每隔几秒检查一次”之间的差别。把较慢的网络请求保留为后备,以防缓存尚未就绪。

3. 默认 SDK 不是线程安全的

在高并发下,我们发现有些账户会短暂地读到其他账户的数据。原因在 SDK 本身:在同一个 manager 实例上并发调用,会破坏它的内部状态。解决办法是用一把锁串行化所有 SDK 调用,连接和关闭时也使用同一把锁,并校验返回的登录号与请求的一致。这让批量读取变慢了。更好的长期方案是建立一个小型连接池,每个连接同一时间只给一个调用方使用。

4. 数据对不上,就绝不执行

风控引擎会平仓并禁止交易,数字错一次就是真金白银的损失。当数据看起来不对时(比如成交记录属于别的账号、初始余额为零、登录号不一致),我们选择跳过这个账户,而不是判定它失败。账户晋级下一阶段之前,还会用另一个独立的数据源交叉核对净值。宁可慢一点,也要算得对。

5. 关掉监控再部署

在监控运行时重启服务,可能会让它基于尚未就绪的连接做出判断。我们的部署手册是:先停掉两个服务,再部署,在监控关闭的状态下手动检查一个已知违规账户和一个正常账户,确认无误后再开启监控并观察日志。只需十分钟,却能避免一整类事故。

如果你正在基于 MT5 开发,需要有人帮忙把关,欢迎来聊聊。

相关服务加密货币与交易系统开发了解更多

更多笔记