MQL5 对决 QLUA - 为什么在 MQL5 中交易操作速度快达 28 倍?

MetaQuotes | 11 十月, 2016


您可曾想过您的订单是如何迅速传递到交易所, 它的执行速度如何, 而您的终端需要多久才能收到操作结果?

同时, 有一种提高订单执行品质的方法, 即通过接收一个更快的响应和实现更快的业务速度。

2016 年 9 月 12 日, 我们在 "Otkrytie" 经纪商提供的一个实盘账户里同步运行三个速度测试, 终端则为 MetaTrader 5 集成编译 1415 和 Quik 7.2.23。每次测试瞄准的目标是衡量速度特征, 这对算法交易很重要。:
  1. 同步操作测试 — 一系列 10 次同步连续买入操作, 在交易所执行的每笔业务均成功确认。暂停执行下一个操作, 直到收到来自交易服务器确认的先前在交易所的操作已执行或未执行的响应。执行速度依赖整个链条: 终端 — 交易服务器 — 交易所 — 交易服务器 — 终端。同步交易操作的平均时间越小越佳。
  2. 异步操作测试 — 一系列 10 次异步买入操作, 无需任何业务执行成功的确认。它是一个纯速率测试, 其衡量的是订单发送到交易所有多快。最好的终端是能够更快执行 10 次异步买入操作的那个。
  3. 订单盘口更新 — 衡量市场深度内的订单 (订单盘口) 更新速度有多快。这是一个简单的单位时间内市场深度逐笔报价 (更新) 计数器。终端从交易所接收到的报价越频繁, 订单盘口更新越快。因此, 自动交易应用每秒接收的逐笔报价越多, 它对市场需求/供给结构的变化响应越快。最好的终端是订单盘口更新速度更快的那个。


测试条件

两个终端安装在一台位于莫斯科的 VPS主机上, 就像 "Otkryite" 经纪商的交易服务器。交易操作的执行使用同一个莫斯科交易所衍生品市场的真实账户; 交易工具是 Si-9.6。

我们拍摄了三次测试的视频以便轻松分析:

  1. 交易操作都在同一个真实账户进行
  2. 交易同样的金融工具 Si-9.16
  3. 使用相同的计算机
  4. 交易操作是在同一时间执行
  5. 同样的市场条件
  6. 市场深度 (订单盘口) 的更新速度在同一工具上相同
  7. 连接经纪商服务器的网络延迟为 2 毫秒

交易操作速度结果: MetaTrader 5 对决 QUIK

三次试验的结果详情列于汇总表, 每次测试的附加详细结果列于稍后的章节。

测试
MetaTrader 5
QUIK
MT5 领先
同步操作平均时间
9.59 毫秒277.80 毫秒28.96 倍
异步操作平均时间0.09 毫秒0.30 毫秒 3.33 倍
市场深度更新速度
42.7 次每秒8.4 次每秒5.08 倍

如您所见, MetaTrader 5 在所有测试中展示了更胜一筹。您可使用附带的源代码重现同样的测试。测试过程展示于以下的视频里。

交易速度对比视频



结论:  MetaTrader 5 执行交易操作的速度比 QUIK 要快高达 28 倍。

这些测试表明, MQL5 语言在莫斯科交易所执行交易操作时, 以及扫描市场深度时, 比 QLUA 更快捷。除了执行 计算快速 50-600 倍, MQL5 的交易机器人速度也快捷高达 28 倍。还有, 开发工具的整体完备, 无需使用额外的连接器, DLL, 等等。您可以使用来自标准库, 以及有关自动交易的 大量文章 里的现成 交易类

一个健壮的交易机器人必须检查交易发送的结果; 即, 它必须等待来自交易服务器的响应。测试已经证明, MetaTrader 5 在执行同步操作时明显更快。如果您需要使用异步操作, 您可以在 MetaTrader 5 里获得 3 倍速度提升。如果您需要分析订单盘口, MetaTrader 5 将为您提供 5 倍快速报价流的优势, 没有遗漏。

这些测试也证明了 MQL5 语言是创建快速执行的自动交易系统的理想解决方案。即使 QUIK 终端使用旨在加速计算的额外连接器或代码库, 也不会有太多帮助, 因为瓶颈在于交易操作的执行时间。

现在让我们来分析枯燥而重要的测试细节。

MetaTrader 5 对决 QUICK 的详尽比较报告

在 QLUA 里的一款应用通过调用操作系统计时器, 以省缺分辨率 10…15.6 毫秒 (通常是 15.6 毫秒) 测量时间。我们不得不改进 QLUA 的测量时间精度, 即简单地降低系统计时器分辨率为 1 毫秒。这可通过脚本 SpeedupSystemTimer.mq5 来完成, 其调用系统库 Winmm.dll 的 timeBeginPeriod function

#import "winmm.dll"
int timeBeginPeriod(uint per);
#import

void OnInit()
  {
   timeBeginPeriod(1);
  }

void OnTick()
  {
  }


我们在 MetaTrader 5 里允许 DLL 调用, 并在开始测试之前运行脚本, 此结果会导致 QUIK 的操作测量误差不超过 1 毫秒。

MQL5 语言提供了一个现成的函数 GetMicrosecondCount(), 因此在 MetaTrader 5 终端里速度测量的精度是 1 微秒 (1 微秒=1000 豪秒)

#1 同步交易操作速度

测试隐含测量同步交易操作的速度, 即交易操作只能在收到交易服务器从交易所得到之前的操作成功执行的完全确认后返回的响应时才可执行。

首先, 一系列的交易操作通过 MetaTrader 5 终端执行, 然后通过 QUIK 终端执行同一系列。

测试的目的是测量 10 次同步市价买入 1 手操作的平均时间:

  • SyncTradeTest.mq5
  • SyncTradeTest.lua

执行一次同步操作所花费的时间测量如下:

  • MQL5 语言提供同步 OrderSend 函数, 时间可在交易系列的开始和结尾处轻易地测量。

  • QLUA 语言没有提供同步交易函数, 因此业务的状态应单独监视。使用 os.closck() 函数调用 sendTransaction() 之前正确记录操作开始时间。首次调用内置的 OnOrder() 处理器期间, 当收到交易所关于交易执行的事件时, 监视到业务成功完成。在这些不同事件之间就是交易操作执行所花费的时间。
测量结果表明, MetaTrader 5 执行同步操作 速度高达 28 倍

#2 异步交易操作速度测试

这个测试是如此容易。一笔买入 一份 Si-9.16 期货合约的订单在一行中发送十次。这令我们测量到在 QLUA 中传递异步的平均时间是精确的 1 毫秒 / 10 = 0.10 毫秒。MetaTrader 5 没有测量错误, 它采用的计时器是一微秒。

我们不必等待操作结果: 发送一笔订单至交易服务器, 紧接着发送下一笔订单:

  • AsyncTradeTest.mq5
  • AsyncTradeTest.lua
结果表明, MetaTrader 5 执行异步操作 速度为 3.33 倍

#3 市场深度更新测试

一些交易策略利用订单盘口分析。在 MQL5 中, 市场深度的变化事件可在 OnBookEvent() 处理器里跟踪; QLUA 为此目的提供了 OnQuote()。

市场深度的变化速度使用下列程序测试, 它们可从所附的 ZIP 里得到:

  • MarketUpdateTest.mq5
  • MarketUpdateTest.lua

在两个终端里运行程序之后, 我们记录到市场深度的更新频率在 MetaTrader 5 中 更频繁大约是 5 倍。也许, QUIK 限制了订单盘口的更新频率, 并没有表现出一定的变化。

所有的源代码文件已附加到文章末尾, 所以任何人都可以重现这些测试并自行检查结果。

为什么差别如此令人印象深刻?

我们努力地追求高性能, 以及每微秒价值的同时, 多年来不断优化交易平台。

这就是为什么我们内置的 MQL5 算法语言已经达到了惊人的表现, 以及令人印象深刻的交易业务速度。