股票量化软件:在赫兹量化中测试移动平均线计算的性能
测试条件
计算速度取决于很多因素。因此,本研究作为结果获得的数据在其他测试条件下可能有所不同。换言之,性能的绝对值将有所不同,但是相对值将是类似的(针对某个平台)。
因此 MQL5 中的 iMA 函数本身不返回计算结果(它返回指标的句柄),我们将测试两个函数的速度:iMA 和 CopyBuffer。
测试条件:
CPU:Core i7 965
交易品种:"EURUSD"
价格数据大小:10000 个元素
客户端:自主交易,图表中的最大柱数设置为 10000
移动平均线模型:MODE_SMA、MODE_EMA、MODE_SMMA、MODE_LWMA
计算速度的精确度限制为两位有效数字
移动平均线函数的可能调用数量:7
2. 如何测试
要测量移动平均线的计算时间,我们使用 GetTickCount() 函数,该函数运行于毫秒级别。此精确度还不足够,因此我们需要组织某些循环以提高测量的质量。
但是,如果我们用相同的计算和相同的输入数据多次重复循环,则结果会失真。该事实的原因如下:iMA 函数在客户端的全局缓存中创建相应技术指标的一个副本。如果在全局缓存中已经存在一个指标的副本(具有相同的参数),则不创建新的副本,指标副本的引用计数器增大。
换言之,整个缓存指标仅在第一次调用时计算一次,所有后续的调用仅采用已经存在的值,它仅重新计算新的数据。
因此,应按这样的方式组织循环:指标的输入参数在循环期间是唯一的。我们已经选择了三个这样的参数:平均周期、时间框架和应用的价格。
参数
值范围
平均周期
从 1 至 100
时间框架
М1、М5、М15、М30
应用的价格
PRICE_CLOSE、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN、PRICE_TYPICAL、PRICE_WEIGHTED
表 1. 输入参数的范围
我们将使用七种不同的调用方法计算含有 10000 个元素的数组的移动平均值(详情见第 4 节)。
3. 研究结果
我们已经将所有结果组合在表 1 中,使用以秒为单位的计算时间来评估计算性能(见表 1)。程序计算了 100х4х7=2800 类移动平均线,并且我们确定含有 10000 个元素的价格数组的计算时间。单次循环的计算时间约等于总时间除以 2800。例如,对于案例 1 和 SMA 模式,它约等于 0.0028/2800。
模式
MODE_SMA
MODE_EMA
MODE_SMMA
MODE_LWMA
平台
0 (见第 4.1 节)
0,0041
0,0040
0,0043
0,0041
MetaTrader 4
1 (见第 4.2 节)
0,0028
0,00023
0,00027
0,0045
MetaTrader 5
2 (见第 4.3 节)
0,0029
0,0029
0,0029
0,0029
MetaTrader 5
3 (见第 4.4 节)
0,0998
0,0997
0,0998
0,0998
MetaTrader 5
4 (见第 4.5 节)
0,0996
0,0996
0,0996
0,0996
MetaTrader 5
5 (见第 4.6 节)
0,0030
0,0029
0,0029
0,0029
MetaTrader 5
6 (见第 4.7 节)
0,000140
0,000121
0,000117
0,0035
MetaTrader 5
表 2. 结果
将在下文讨论测试案例的意义(第 4.1-4.7 节)。让我们评估移动平均线计算性能的整个画面。
为方便起见,在图表中表示结果(见图 1-5)。移动平均线的调用类型在 X 轴上表示(见表 2),用对数刻度 -1 表示 Y 轴的值,因此,值越大,性能越快。每个计算模型(SMA、EMA、SMMA、LWMA)对应于图表中的一根柱。

编辑切换为居中
图 1. 不同移动平均线算法的性能测试结果
可以看到在不同的移动平均线计算案例中计算速度出现显著差异。这意味着什么?由 MQL5 开发人员提供的几种移动平均线算法具有不同的计算性能:有很快的算法(案例 6)和较慢的算法(案例 3 和 4)。因此,在用 MQL5 编写使用移动平均线的程序时,必须选择正确的算法。
在以下的图中详细说明了各个移动平均线模型 (0-6) 的计算时间,见表 2。
图 2. MODE_SMA 模式的移动平均线计算性能
图 3. MODE_EMA 模式的移动平均线计算性能

编辑
图 4. MODE_SMMA 模式的移动平均线计算性能
编辑
图 5. MODE_LWMA 模式的移动平均线计算性能
比较两个平台的计算性能非常有趣:赫兹量化。表 2 中的案例 0 (MQL4) 和案例 1 (MQL5) 显示了结果。
为方便起见,让我们将 iMA 标准指标的计算结果组合到单独的图和表中(见图 6)。测试的计算时间以 Y 轴表示。