股票量化軟件:在赫茲量化中測(cè)試移動(dòng)平均線計(jì)算的性能
測(cè)試條件
計(jì)算速度取決于很多因素。因此,本研究作為結(jié)果獲得的數(shù)據(jù)在其他測(cè)試條件下可能有所不同。換言之,性能的絕對(duì)值將有所不同,但是相對(duì)值將是類似的(針對(duì)某個(gè)平臺(tái))。
因此 MQL5 中的 iMA 函數(shù)本身不返回計(jì)算結(jié)果(它返回指標(biāo)的句柄),我們將測(cè)試兩個(gè)函數(shù)的速度:iMA 和 CopyBuffer。
測(cè)試條件:
CPU:Core i7 965
交易品種:"EURUSD"
價(jià)格數(shù)據(jù)大小:10000 個(gè)元素
客戶端:自主交易,圖表中的最大柱數(shù)設(shè)置為 10000
移動(dòng)平均線模型:MODE_SMA、MODE_EMA、MODE_SMMA、MODE_LWMA
計(jì)算速度的精確度限制為兩位有效數(shù)字
移動(dòng)平均線函數(shù)的可能調(diào)用數(shù)量:7
2. 如何測(cè)試
要測(cè)量移動(dòng)平均線的計(jì)算時(shí)間,我們使用 GetTickCount() 函數(shù),該函數(shù)運(yùn)行于毫秒級(jí)別。此精確度還不足夠,因此我們需要組織某些循環(huán)以提高測(cè)量的質(zhì)量。
但是,如果我們用相同的計(jì)算和相同的輸入數(shù)據(jù)多次重復(fù)循環(huán),則結(jié)果會(huì)失真。該事實(shí)的原因如下:iMA 函數(shù)在客戶端的全局緩存中創(chuàng)建相應(yīng)技術(shù)指標(biāo)的一個(gè)副本。如果在全局緩存中已經(jīng)存在一個(gè)指標(biāo)的副本(具有相同的參數(shù)),則不創(chuàng)建新的副本,指標(biāo)副本的引用計(jì)數(shù)器增大。
換言之,整個(gè)緩存指標(biāo)僅在第一次調(diào)用時(shí)計(jì)算一次,所有后續(xù)的調(diào)用僅采用已經(jīng)存在的值,它僅重新計(jì)算新的數(shù)據(jù)。
因此,應(yīng)按這樣的方式組織循環(huán):指標(biāo)的輸入?yún)?shù)在循環(huán)期間是唯一的。我們已經(jīng)選擇了三個(gè)這樣的參數(shù):平均周期、時(shí)間框架和應(yīng)用的價(jià)格。
參數(shù)
值范圍
平均周期
從 1 至 100
時(shí)間框架
М1、М5、М15、М30
應(yīng)用的價(jià)格
PRICE_CLOSE、PRICE_OPEN、PRICE_HIGH、PRICE_LOW、PRICE_MEDIAN、PRICE_TYPICAL、PRICE_WEIGHTED
表 1. 輸入?yún)?shù)的范圍
我們將使用七種不同的調(diào)用方法計(jì)算含有 10000 個(gè)元素的數(shù)組的移動(dòng)平均值(詳情見第 4 節(jié))。
3. 研究結(jié)果
我們已經(jīng)將所有結(jié)果組合在表 1 中,使用以秒為單位的計(jì)算時(shí)間來(lái)評(píng)估計(jì)算性能(見表 1)。程序計(jì)算了 100х4х7=2800 類移動(dòng)平均線,并且我們確定含有 10000 個(gè)元素的價(jià)格數(shù)組的計(jì)算時(shí)間。單次循環(huán)的計(jì)算時(shí)間約等于總時(shí)間除以 2800。例如,對(duì)于案例 1 和 SMA 模式,它約等于 0.0028/2800。
模式
MODE_SMA
MODE_EMA
MODE_SMMA
MODE_LWMA
平臺(tái)
0 ?(見第 4.1 節(jié))
0,0041
0,0040
0,0043
0,0041
MetaTrader 4
1 ?(見第 4.2 節(jié))
0,0028
0,00023
0,00027
0,0045
MetaTrader 5
2 ?(見第 4.3 節(jié))
0,0029
0,0029
0,0029
0,0029
MetaTrader 5
3 ?(見第 4.4 節(jié))
0,0998
0,0997
0,0998
0,0998
MetaTrader 5
4 ?(見第 4.5 節(jié))
0,0996
0,0996
0,0996
0,0996
MetaTrader 5
5 ?(見第 4.6 節(jié))
0,0030
0,0029
0,0029
0,0029
MetaTrader 5
6 ?(見第 4.7 節(jié))
0,000140
0,000121
0,000117
0,0035
MetaTrader 5
表 2. 結(jié)果
將在下文討論測(cè)試案例的意義(第 4.1-4.7 節(jié))。讓我們?cè)u(píng)估移動(dòng)平均線計(jì)算性能的整個(gè)畫面。
為方便起見,在圖表中表示結(jié)果(見圖 1-5)。移動(dòng)平均線的調(diào)用類型在 X 軸上表示(見表 2),用對(duì)數(shù)刻度 -1 表示 Y 軸的值,因此,值越大,性能越快。每個(gè)計(jì)算模型(SMA、EMA、SMMA、LWMA)對(duì)應(yīng)于圖表中的一根柱。

編輯切換為居中
圖 1. 不同移動(dòng)平均線算法的性能測(cè)試結(jié)果
可以看到在不同的移動(dòng)平均線計(jì)算案例中計(jì)算速度出現(xiàn)顯著差異。這意味著什么?由 MQL5 開發(fā)人員提供的幾種移動(dòng)平均線算法具有不同的計(jì)算性能:有很快的算法(案例 6)和較慢的算法(案例 3 和 4)。因此,在用 MQL5 編寫使用移動(dòng)平均線的程序時(shí),必須選擇正確的算法。
在以下的圖中詳細(xì)說(shuō)明了各個(gè)移動(dòng)平均線模型 (0-6) 的計(jì)算時(shí)間,見表 2。
圖 2. MODE_SMA 模式的移動(dòng)平均線計(jì)算性能
圖 3. MODE_EMA 模式的移動(dòng)平均線計(jì)算性能

編輯
圖 4. MODE_SMMA 模式的移動(dòng)平均線計(jì)算性能
編輯
圖 5. MODE_LWMA 模式的移動(dòng)平均線計(jì)算性能
比較兩個(gè)平臺(tái)的計(jì)算性能非常有趣:赫茲量化。表 2 中的案例 0 (MQL4) 和案例 1 (MQL5) 顯示了結(jié)果。
為方便起見,讓我們將 iMA 標(biāo)準(zhǔn)指標(biāo)的計(jì)算結(jié)果組合到單獨(dú)的圖和表中(見圖 6)。測(cè)試的計(jì)算時(shí)間以 Y 軸表示。