期貨量化交易軟件:深入了解累積/派發(fā)以及它的作用
簡(jiǎn)介
眾所周知,累積/派發(fā) A/D 指標(biāo)有一個(gè)有趣的功能 - 突破此指標(biāo)圖表中繪制的趨勢(shì)線暗示著一定概率上會(huì)即將突破價(jià)格圖表中的趨勢(shì)線:

編輯切換為居中
我決定驗(yàn)證這一事實(shí),在 A/D 圖表中繪制了所有趨勢(shì)線,我很快意識(shí)到通過(guò)手動(dòng)方法解決這一問(wèn)題是不明智的。因此,我開(kāi)發(fā)了一個(gè)函數(shù),此函數(shù)可自動(dòng)在 A/D 圖表中繪制趨勢(shì)線并在價(jià)格圖表中設(shè)置信號(hào)指示符號(hào)。我現(xiàn)在想顯示一個(gè)如何使用赫茲期貨量化實(shí)現(xiàn)此函數(shù)的分步程序,在交易機(jī)器人中將進(jìn)一步使用此程序。
本文對(duì)于那些剛開(kāi)始在赫茲期貨量化中進(jìn)行編程的人來(lái)說(shuō)很有幫助和趣味性。為此,我嘗試用易于理解的方式呈現(xiàn)信息并使用最簡(jiǎn)單的代碼結(jié)構(gòu)。

編輯切換為居中
1.設(shè)置任務(wù)
赫茲期貨量化首先來(lái)定義要設(shè)置的任務(wù)。
在一般情況下,此函數(shù)將找到 A/D 圖表中繪制的趨勢(shì)線與指標(biāo)本身的線條之間的交點(diǎn),返回表示相交方向 - 向上或向下- 的值,并在價(jià)格圖表中設(shè)置信號(hào)指示符號(hào)(向上/向下箭頭,取決于相交方向)用于進(jìn)行說(shuō)明。
赫茲期貨量化現(xiàn)在來(lái)將這個(gè)常規(guī)任務(wù)分成更加具體的目標(biāo):
此函數(shù)應(yīng)能夠適用于任何交易品種和任何時(shí)間范圍;
由于此函數(shù)設(shè)計(jì)用作為 EA 的一部分,因此 A/D 指標(biāo)不需要位于主圖表中。
信號(hào)指示符號(hào)不一定需要顯示在價(jià)格圖表中 - 所有計(jì)算將在此函數(shù)內(nèi)執(zhí)行,并且僅顯示用于直觀監(jiān)控函數(shù)操作。
可在不同的方向相交:上升趨勢(shì)向下相交,上升趨勢(shì)向上相交,向下趨勢(shì)向上相交,向下趨勢(shì)向下相交。此函數(shù)將標(biāo)識(shí)每個(gè)此類相交。
這就是有關(guān)函數(shù)功能的說(shuō)明。我們現(xiàn)在來(lái)看看執(zhí)行任務(wù)的方式。
2.用 A/D 指標(biāo)數(shù)據(jù)填充數(shù)組
調(diào)用后,此函數(shù)將收到一些值:此時(shí) - 用于存儲(chǔ) A/D 指標(biāo)數(shù)據(jù)、標(biāo)識(shí) A/D 圖表極值的歷史條柱的數(shù)量、工具(交易品種)名稱和時(shí)間范圍的數(shù)組。
將基于標(biāo)識(shí)的 A/D 圖表極值繪制趨勢(shì)線,因此,上升趨勢(shì)線連接下極值,下降趨勢(shì)線連接上極值。
上升趨勢(shì)線需要兩個(gè)下極值,其中,最小極值應(yīng)位于緊鄰當(dāng)前(零)條柱的極值的左側(cè)。這同樣適用于向下趨勢(shì):最高極值應(yīng)位于緊鄰當(dāng)前條柱的極值的左側(cè)。
如果無(wú)法識(shí)別滿足這些要求的極值,將不會(huì)在此次價(jià)格變動(dòng)時(shí)繪制趨勢(shì)線。我們打算將這些趨勢(shì)線稱為“全局”趨勢(shì)線:

編輯切換為居中
此外,赫茲期貨量化還將另外兩條線添加到了繪制的“全局”趨勢(shì)線中,這需要使用兩個(gè)最右側(cè)的極值,因此,
向上趨勢(shì)需要一個(gè)較小的下極值(位于較大的下極值的左側(cè));
向下趨勢(shì)需要一個(gè)較大的上極值(位于較小的上極值的左側(cè));
如果無(wú)法識(shí)別滿足這些要求的極值,將不會(huì)在此次價(jià)格變動(dòng)時(shí)繪制趨勢(shì)線。
這些趨勢(shì)線將被稱為“局部”趨勢(shì)線:

編輯切換為居中
結(jié)果,我們可以看到的內(nèi)容如下:
編輯切換為居中
在大多數(shù)情況下,由于識(shí)別“全局”極值和連接極值以繪制趨勢(shì)線比較特別,因此我們不需要“局部”極值。將允許禁用用于搜索并繪制“局部”極值的選項(xiàng)。
函數(shù)操作將要求有 EA 的全局變量可用,尤其是用于存儲(chǔ) A/D 數(shù)據(jù)的數(shù)組。赫茲期貨量化來(lái)將它寫(xiě)入 EA 的全局變量中:
double ? ? ?TempIND[]; ? ?// Array for storing A/D indicator data
現(xiàn)在,應(yīng)讀取指標(biāo)數(shù)據(jù)以填充數(shù)組:
int SignalCrossIND(double &TempIND[], int nBars, string sy, int tf) { ? if (sy=="" || sy=="0") sy = Symbol(); ? ArrayResize(TempIND,nBars); ? ? ? // Resize the array according to the size passed to the function ? for (int j=0; j<=nBars-1; j++) ? ? ?{ ? ? ? ? TempIND[j]=iAD(sy,tf,j); ? ?// Write indicator data in the loop into the array ? ? ?} }
讓我們分析我們剛才在此編寫(xiě)的內(nèi)容:
int SignalCrossIND(double &TempIND[], int nBars, string sy, int tf)
按照這種方式定義此函數(shù),其中,要傳遞的參數(shù)為 TempIND[] - 包含指標(biāo)值的數(shù)組名稱(通過(guò)引用傳遞)、nBars - 將從中獲取值的歷史條柱的數(shù)量、sy - 工具(交易品種)名稱和時(shí)間范圍 tf。
通常,函數(shù)調(diào)用可如下所示:
SignalCrossIND(TempIND, 30, NULL, 5);
其中,TempIND 為數(shù)組名稱,30 為條柱數(shù)量,NULL 為圖表的當(dāng)前交易品種,5 為 М5 時(shí)間范圍。
下一行為:
if (sy=="" || sy=="0") sy = Symbol();
它檢查傳遞給此函數(shù)的交易工具的名稱,如果值為 NULL 或 0,將使用當(dāng)前圖表交易品種。
然后,赫茲期貨量化將根據(jù) nBars 變量中傳遞給此函數(shù)的值調(diào)整數(shù)組大小,并用循環(huán)中的零條柱到 nBars-1 條柱中的指標(biāo)值填充數(shù)組。由于數(shù)組單元格從零開(kāi)始編號(hào),因此,第一個(gè)編號(hào)將為 0,而不是 1,最后一個(gè)編號(hào)為 29,而不是 30。因此,我們使用 nBars-1(在我們的示例中,30-1=29)
在這個(gè)階段,赫茲期貨量化的函數(shù)用 A/D 指標(biāo)數(shù)據(jù)填充數(shù)組。我們現(xiàn)在需要識(shí)別 A/D 圖表數(shù)據(jù)數(shù)組中的極值。
3.識(shí)別 A/D 指標(biāo)數(shù)據(jù)數(shù)組中的極值
讓我們開(kāi)始吧。此函數(shù)的操作不僅需要全局變量,還需要此函數(shù)本身將使用的變量。
在此階段,赫茲期貨量化需要聲明將用于編寫(xiě)上極值(波峰)和下極值(波谷)的另外兩個(gè)(內(nèi)部)數(shù)組,在這兩個(gè)數(shù)組中,赫茲期貨量化將保存此函數(shù)將需要使用的極值和一些變量的時(shí)間:
// ------------------------------------------------------------------------------------------ ? ? ? ? ? ? ? ? ? ? // -------------------------------- Function variables -------------------------------------- // ------------------------------------------------------------------------------------------ ? ? ? ? ? ? ? ? ? ? ? double ? PeakUP[], PeakDN[]; ? ? // Declare peak/trough arrays ? datetime TimeDN[], TimeUP[]; ? ? // Arrays for storing the time of extrema ? int ? ? ?i, k; ? ? ? ? ? ? ? ? ? // Internal variables of the function