「同步异步双测:MQL5 比 QLUA 快在哪」
「同步异步双测:MQL5 比 QLUA 快在哪」
- 年 9 月 12 日,在 Otkrytie 经纪商实盘账户里,用 MetaTrader 5 集成编译 1415 对比 Quik 7.2.23(QLUA 环境),同步跑了三套速度测试。对算法交易来说,链路耗时和盘口刷新频率直接决定策略滑点。
同步操作测试是一连 10 笔买入,每笔必须等交易所确认返回才发下一笔,计时覆盖「终端—服务器—交易所—服务器—终端」全链。异步操作测试则不管确认,纯测 10 笔发单到交易所的吞吐速率。订单盘口更新测试按每秒逐笔报价计数,刷新越快,EA 对供需结构变化响应越灵敏。 原文给出的结论是 MQL5 交易操作速度快达 QLUA 的 28 倍,这一数字来自上述实盘同步测试场景,不是模拟回测。外汇与贵金属杠杆高、波动剧烈,实盘链路延迟差异会放大成交质量风险,建议自开 MT5 与 Quik 双终端做同账户比对。
同机同账户下的对照测试环境
我们把两个 MT5 终端装在同一台莫斯科 VPS 上,这台机器与 Otkrytie 经纪商的莫斯科交易服务器同处一个机房。测试用的是莫斯科交易所衍生品市场的真实账户,标的为 Si-9.6 期货,三次录屏用于事后逐帧比对。 所有对照项被刻意压到一致:同一真实账户、同一工具 Si-9.16、同一台计算机、同一时刻发单、同一市场条件,且订单簿(市场深度)在该标的上的刷新节奏相同。 唯一被记录下来的链路参数是到经纪商服务器的网络延迟 2 毫秒。这个数值足够低,使得终端间执行差异更可能来自软件层而非网络抖动,适合拿来做 EA 与手动单的微观对比。
◍ MT5 与 QUIK 的撮合速度实测差距
在同一硬件环境下跑了三轮同步与异步下单测试,MetaTrader 5 把 QUIK 甩开不止一个量级。同步操作平均耗时 MT5 仅 9.59 毫秒,QUIK 要到 277.80 毫秒,前者快了 28.96 倍;异步路径下 MT5 压到 0.09 毫秒,QUIK 是 0.30 毫秒,差距仍有 3.33 倍。 市场深度刷新频率更能说明终端底层架构差异:MT5 每秒推 42.7 次深度更新,QUIK 只有 8.4 次,相当于 5.08 倍的吞吐落差。外汇与贵金属属高波动品种,这种延迟差异在滑点敏感策略里会直接吃掉部分边际收益。 原文附带了可复跑的测试源码,自己开 MT5 载入后就能在本地重测一遍,验证是否仍维持上述数量级。
「同步发单比异步还能再快三倍」
在莫斯科交易所的实测里,MQL5 交易机器人执行交易操作的速度比 QUIK 环境下的 QLUA 快到 28 倍,而纯计算部分更是快出 50–600 倍。更关键的是,MT5 内建标准库和现成交易类,不用额外接 DLL 或第三方连接器,少一层链路就少一块延迟。 一个健壮的 EA 必须等交易服务器回执再继续,这种同步等待下 MT5 优势最明显。若刻意走异步,MT5 仍能比同步基准再提 3 倍;读订单簿盘口时,报价流快 5 倍且无遗漏。 瓶颈从来不在算得慢,而在发单被执行的那一段耗时。即便 QUIK 侧堆连接器加速计算,也救不了交易操作本身的延迟,所以 MQL5 才是低延迟自动系统的现实解。
把系统计时器掰到 1 毫秒再测速
QLUA 里靠操作系统计时器量时间,默认分辨率在 10–15.6 毫秒之间,多数情况就是 15.6 毫秒。这个粒度测高频交易操作误差太大,所以先得把系统计时器精度压到 1 毫秒。 做法是在 MT5 里开 DLL 调用,跑一段脚本去调 Winmm.dll 的 timeBeginPeriod。脚本把周期设成 1 之后,QLUIK 侧的操作测量误差就能控制在 1 毫秒以内。MT5 自身用 GetMicrosecondCount() 取时间,精度直接到 1 微秒(1 微秒 = 千分之一毫秒),根本不用改系统计时器。 测同步市价买入:连续 10 次买 1 手,等交易所确认返回才发下一笔。MQL5 有同步 OrderSend,首尾掐表就行;QLUA 没同步函数,得在 sendTransaction() 前用 os.clock() 记时,再等 OnOrder() 收到成交事件才算完。结果 MT5 同步速度快约 28 倍。 异步更直观:一行连发 10 笔 Si-9.16 期货买单,不等地回。QLUA 平均 0.10 毫秒一笔,MT5 计时器误差可忽略,实测异步速度快约 3.33 倍。盘口更新用 OnBookEvent / OnQuote 跟踪,MT5 的更新频率约莫比 QUIK 高 5 倍,后者疑似限了推送节奏。 外汇和贵金属杠杆高、滑点猛,这类微秒级优势只在极短持仓策略里有意义,实盘前务必自己在 MT5 跑附带的 mq5 复现。
class="macro">#class="kw">import "winmm.dll" class="type">int timeBeginPeriod(class="type">uint per); class="macro">#class="kw">import class="type">void OnInit() { timeBeginPeriod(class="num">1); } class="type">void OnTick() { }
◍ 性能差距背后的工程取舍
MQL5 与 QUICK 内嵌脚本的实测速度差,论坛里吵得最凶的一组数字是 50–600 倍语言级差距,纯交易业务最低也差 28 倍。这个量级不是凭空来的:MT5 是围绕 MQL5 需求建的,行情 tick、分钟 Bar 直接在语言层可用,而 QUICK 的 LUA 只是高级调用间的绑定,不擅长计算。 有用户贴过冷跑数据——2.6 秒生成 1700 万真实 RTS-9.17 tick 和 60278 根分钟 Bar,这种数据规模在 MQL5 里是原生可操作的,换 LUA 重写同一段逻辑基本跑不动。 但别被倍数带偏。FORTS 登录一次每秒约 30 笔成交,瓶颈常在经纪商网关和交易所系统,不是语言单方面的锅。外汇和贵金属杠杆高、滑点突变频繁,盲目追语言速度而忽略风控,风险依然很大。 真要验证,开 MT5 建个 1700 万 tick 的回放脚本,对比同逻辑下 EA 的耗时,比看吵架帖有用得多。