量化交易軟件:通用的之字轉(zhuǎn)向指標(biāo)

簡介
之字轉(zhuǎn)向指標(biāo)(圖1)是在赫茲量化用戶中最流行的指標(biāo)之一,現(xiàn)今已經(jīng)開發(fā)出了多種多樣的之字轉(zhuǎn)向指標(biāo)。然而,它們其中的一些非常慢,這使得無法把它們用于創(chuàng)建EA交易。其他一些經(jīng)常出錯(cuò),這讓用它們作觀察都非常困難。對于那些運(yùn)行速度快而且沒有錯(cuò)誤的指標(biāo),在使用它們開發(fā)EA交易或者另外的指標(biāo)時(shí)使用還比較復(fù)雜,出現(xiàn)這種情況是因?yàn)檎归_和解釋之字轉(zhuǎn)向指標(biāo)的數(shù)據(jù)還不是那么容易。

編輯切換為居中
圖 1. 之字轉(zhuǎn)向(ZigZag)指標(biāo) 本文探討了繪制之字轉(zhuǎn)向指標(biāo)的需求,以及繪制它的不同方法,得出結(jié)論并獲得了一種統(tǒng)一的算法,這種算法將用于作為創(chuàng)建通用指標(biāo)的基礎(chǔ),這使得可以通過屬性窗口來選擇不同的之字轉(zhuǎn)向類型。 在指標(biāo)的開發(fā)中將使用面向?qū)ο蟮木幊?。將會為繪制不同階段的之字轉(zhuǎn)向指標(biāo)創(chuàng)建多個(gè)基類,對每個(gè)階段將創(chuàng)建多個(gè)子類。把基類和子類分開,這樣可以使創(chuàng)建不同的新的之字轉(zhuǎn)向類型變得盡可能簡單。 除了繪制之字轉(zhuǎn)向本身,本文還將致力于使用得到的指標(biāo)來開發(fā)其他的指標(biāo)和EA交易,當(dāng)前的任務(wù)是確??梢詮闹洲D(zhuǎn)向指標(biāo)中取得數(shù)據(jù),并且可以把它作為其他算法的一部分,不會很復(fù)雜和耗時(shí)。 之字轉(zhuǎn)向指標(biāo)的特性 之字轉(zhuǎn)向(圖1)指標(biāo)是一條連接局部高價(jià)和低價(jià)之間的折線,初學(xué)者可能馬上想到: 能夠在底部買入而在頂部賣出就好了!這種想法看起來當(dāng)然很誘人,但是之字轉(zhuǎn)向只有在歷史中才看起來那樣誘人,在現(xiàn)實(shí)中,情況是有些不一樣的。很明顯,只要后面有幾個(gè)柱,就可能形成與之前比較的新高或者新低,圖2顯示了一種情形,當(dāng)時(shí)指標(biāo)的最后階段停止了構(gòu)造(改變),價(jià)格反轉(zhuǎn)并且走向相反的方向(向上)。

編輯
圖 2. 之字轉(zhuǎn)向方向向下,而價(jià)格反轉(zhuǎn)向上 但是,又過了幾個(gè)柱,價(jià)格下跌了(圖 3), 之字轉(zhuǎn)向的最后一段又繼續(xù)向下了。

編輯
圖 3. 價(jià)格繼續(xù)下跌,而最后一段之字轉(zhuǎn)向恢復(fù)了它的造型 這一次,指標(biāo)達(dá)到了它的最小值,但是這只能在幾個(gè)柱之后再被確認(rèn) (圖 4).

編輯
圖 4. 之字轉(zhuǎn)向指標(biāo)又用了10個(gè)柱來畫出新的向上的段落,這樣才形成了底部 之字轉(zhuǎn)向的這些特點(diǎn)在圖5中很好地做了解釋。彩色點(diǎn)指出了之前的頂部或者底部構(gòu)成時(shí)的柱,指標(biāo)會在用藍(lán)色點(diǎn)標(biāo)出的柱開始繪出新的向上線段,而在用紅色點(diǎn)標(biāo)出的柱開始繪出新的向下的線段。

編輯切換為居中
圖5,紅色點(diǎn)和藍(lán)色點(diǎn)指出了之字轉(zhuǎn)向開始出現(xiàn)時(shí)的柱 盡管有這樣的特征,之字轉(zhuǎn)向指標(biāo)并沒有失去它的流行和吸引力,至少,它被大量應(yīng)用在圖表的可視化分析中,幫助過濾噪音并且偵測價(jià)格變化的主要方向。在更加實(shí)用的應(yīng)用程序中,該指標(biāo)可以用于偵測支撐/阻力水平或者用于識別模式。并且,它可以被用于繪制趨勢線,就像任何其他用于技術(shù)分析的圖形工具一樣,與斐波那契水平線、扇形線等等類似。這里無法列出交易者復(fù)雜使用之字轉(zhuǎn)向指標(biāo)的所有方法。
繪制之字轉(zhuǎn)向的不同方法
顯然,之字轉(zhuǎn)向有兩種狀態(tài): 它的方向向上或者向下。當(dāng)線的方向是向上時(shí) — 監(jiān)視價(jià)格看是否有新高出現(xiàn), 而當(dāng)線的方向是向下時(shí) — 等待新低的出現(xiàn)。還需要監(jiān)視看是否滿足條件指示有方向的改變,所以,為了畫出一條之字轉(zhuǎn)向,需要做的是:
獲取源數(shù)據(jù);
構(gòu)建線形改變方向的條件公式; ?
監(jiān)視價(jià)格新高和新低的出現(xiàn)。
源數(shù)據(jù)可以是單獨(dú)一個(gè)序列 (例如,柱的收盤價(jià)) 或者兩個(gè)序列 (例如,柱的最高價(jià)和最低價(jià)),如果使用了一個(gè)數(shù)據(jù)序列,它可以不僅使用收盤價(jià),而且可以是任何指標(biāo),震蕩指標(biāo)或者移動(dòng)平均。當(dāng)根據(jù)指標(biāo)數(shù)據(jù)繪制之字轉(zhuǎn)向時(shí),也可能使用兩個(gè)數(shù)據(jù)序列: 一個(gè)是基于柱的最高價(jià)的指標(biāo)數(shù)據(jù),而另一個(gè)是基于柱的最低價(jià)的數(shù)據(jù)。
方向改變的條件是最重要的一點(diǎn),它定義了之字轉(zhuǎn)向的不同類型。這些條件可能有很大的不同。例如,這樣的條件可以是根據(jù)當(dāng)前柱與n個(gè)柱的最高價(jià)/最低價(jià)做比較而構(gòu)成,換句話說,如果當(dāng)前柱的源數(shù)據(jù)的值是最近n個(gè)柱的最大值或者最小值,這就定義了之字轉(zhuǎn)向的方向。這個(gè)原則應(yīng)用在經(jīng)典的之字轉(zhuǎn)向指標(biāo)中。另一個(gè)方法 — 根據(jù)從固定最大值或者最小值回滾的大小?;貪L的大小可以以點(diǎn)數(shù)衡量 (如果源序列為價(jià)格) 或者是約定的單位 (如果是某些指標(biāo))??梢允褂玫姆椒ú⒉痪窒抻谶@兩種,也可以使用任何指標(biāo)判斷方向 — 如隨機(jī)震蕩指標(biāo), ADX, 等等。如果隨機(jī)震蕩指標(biāo)在50以上,之字轉(zhuǎn)向指標(biāo)就指向上方,如果它低于50 - 就指向下方?,F(xiàn)在,根據(jù) ADX 判斷方向:如果 PDI 線在 MDI 線上方,之字轉(zhuǎn)向線就指向上方,如果 PDI 低于 MDI,就指向下方。 這樣,為第一點(diǎn)和第二點(diǎn)通過組合不同的變化,就能獲得各種不同的之字轉(zhuǎn)向。另外,當(dāng)然還可以使用 RSI 數(shù)據(jù)用于第一點(diǎn)而根據(jù)隨機(jī)震蕩指標(biāo)來判斷方向,以此類推。第三點(diǎn)只對看起來類似于之字轉(zhuǎn)向的指標(biāo)有必要,盡管繪制選項(xiàng)可以有很大不同。 因?yàn)楹掌澚炕@里的任務(wù)是獲得一個(gè)通用指標(biāo),有必要盡可能小心地把算法分成兩個(gè)部分: 對于所有之字轉(zhuǎn)向都同樣的部分 (把它稱為共用部分) 以及依賴于之字轉(zhuǎn)向的不同部分 (把它稱為個(gè)體部分)。個(gè)體部分使用源數(shù)據(jù)填充指標(biāo)緩沖區(qū): 價(jià)格或者指標(biāo)數(shù)據(jù)。另一個(gè)緩沖區(qū) (決定之字轉(zhuǎn)向線的方向)用1或者-1值來填充。這三個(gè)緩沖區(qū)傳給共用部分,在其中會使用它們繪制指標(biāo)本身。 為了使過程更加清楚,首先創(chuàng)建一個(gè)單獨(dú)的指標(biāo),它基于柱的最高/最低價(jià),并且根據(jù)第n個(gè)柱的最高/最低價(jià)來改變放向。 基于最高價(jià)/最低價(jià)的簡單之字轉(zhuǎn)向指標(biāo) 在 MetaEditor 中創(chuàng)建一個(gè)新指標(biāo) (主菜單 — 文件 — 新建或者按下 Ctrl+N). 在指標(biāo)創(chuàng)建向?qū)е?,輸入名稱“iHighLowZigZag”,創(chuàng)建一個(gè)外部參數(shù) "period" (int 類型, 數(shù)值為 12), 選擇 OnCalculate(...,open,high,low,close) 事件處理函數(shù), 創(chuàng)建一個(gè)緩沖區(qū),名稱為 "ZigZag" (Section 類型, 使用紅色) 以及另外三個(gè)緩沖區(qū),名稱分別為 "Direction", "LastHighBar" 和 "LastLowBar" (line 類型, 顏色為 none)。 "ZigZag" 緩沖區(qū)將用于顯示之字轉(zhuǎn)向,其余的緩沖區(qū)是輔助的。對于所有的輔助緩沖區(qū),在OnInit()函數(shù)中,調(diào)用SetIndexBuffer()函數(shù)把 INDICATOR_DATA 類型改為 INDICATOR_CALCULATIONS類型。在文件的頂部,修改 indicator_plots 屬性的值: 把數(shù)值設(shè)為 1。在那以后,指標(biāo)會只畫一個(gè) "ZigZag" 緩沖區(qū), 并且指標(biāo)不會畫任何多余的線,但是同時(shí),另外的緩沖區(qū)可以用來由 iCustom() 函數(shù)做處理。 首先,開始計(jì)算的柱的索引('start'變量)是在OnCalculate()函數(shù)中確定的,所以只有在指標(biāo)開始的時(shí)候才會計(jì)算所有的柱,以后的計(jì)算只在每個(gè)新柱上進(jìn)行。另外,還要初始化緩沖區(qū)的元素: int start; // 開始計(jì)算的柱的索引 if(prev_calculated==0) ? ?{ // 在啟動(dòng)時(shí) ?// 初始化緩沖區(qū)元素 ? ? DirectionBuffer[0]=0; ? ? LastHighBarBuffer[0]=0; ? ? LastLowBarBuffer[0]=0; ? ? start=1; // 從初始化之后的元素開始計(jì)算 ? ?} else ? ?{ // 在運(yùn)行中 ? ? start=prev_calculated-1; ? ?} } 現(xiàn)在,主指標(biāo)循環(huán): for(int i=start;i<rates_total;i++) ? ? { 就像上面描述的那樣,為了獲得通用性,需要把代碼分為之字轉(zhuǎn)向方向的計(jì)算以及它的繪制兩個(gè)部分,這個(gè)原則將要遵循。首先寫出用于確定方向的代碼,為了確定方向,使用ArrayMaximum()和ArrayMinimum()函數(shù)。如果在計(jì)算的柱上出現(xiàn)了高價(jià)或者低價(jià),Direction 數(shù)組的元素就被賦值為 1 或者 -1,為了得到之字轉(zhuǎn)向在每個(gè)柱的當(dāng)前方向的信息,在計(jì)算方向之前,從 Direction 緩沖區(qū)的前一個(gè)元素取得數(shù)值并賦給當(dāng)前的元素: // 取得前一個(gè) // 確定方向數(shù)組元素的值 ? DirectionBuffer[i]=DirectionBuffer[i-1]; // 計(jì)算初始柱的 // ArrayMaximum() 和 ArrayMinimum() 函數(shù)值 ?int ps=i-period+1; // 確定最高價(jià)和最低價(jià) // 在 'period' 個(gè)柱的范圍之內(nèi) ?int hb=ArrayMaximum(high,ps,period); ?int lb=ArrayMinimum(low,ps,period); // 如果識別到最高價(jià)或者最低價(jià) ?if(hb==i && lb!=i) ? ? { // 找到了最高價(jià) ? ? ?DirectionBuffer[i]=1; ? ? } ?else if(lb==i && hb!=i) ? ? { // 找到了最低價(jià) ? ? ?DirectionBuffer[i]=-1; ? ? } 請注意代碼的最后部分: 它識別最高價(jià)或者最低價(jià),檢查當(dāng)前柱上是否同時(shí)有最高價(jià)并且沒有最低價(jià),或者相反:有最低價(jià)而沒有最高價(jià)。有時(shí)候,可能會有非常長的柱形,可能同時(shí)在上面確定兩個(gè)方向,在這種情況下,Direction 緩沖區(qū)會包含之前確認(rèn)的方向。 一般來說,在赫茲量化終端內(nèi),可以創(chuàng)建一個(gè)之字轉(zhuǎn)向,畫出垂直的線段,這使得可以在同一個(gè)柱上顯示指標(biāo)方向的兩個(gè)變化,但是,這樣的之字轉(zhuǎn)向類型不在本文討論范圍之內(nèi)。 讓赫茲量化繼續(xù)在主循環(huán)中寫代碼: 以下片段將用于畫出之字轉(zhuǎn)向線,其余兩個(gè)緩沖區(qū)將與 Direction 緩沖區(qū)作相同的處理: LastHighBarBuffer[i]=LastHighBarBuffer[i-1]; LastLowBarBuffer[i]=LastLowBarBuffer[i-1]; ? 這兩個(gè)緩沖區(qū)將包含之字轉(zhuǎn)向中最近的最高價(jià)和最低價(jià)柱的索引數(shù)據(jù)。除了那些需要畫出指標(biāo)的柱的索引,那些緩沖區(qū)在從EA交易中調(diào)用之字轉(zhuǎn)向指標(biāo)也是被大量應(yīng)用的,那樣就不需要在循環(huán)中迭代所有的柱來找到最近的高點(diǎn)了。 確保清除之字轉(zhuǎn)向指標(biāo)的緩沖區(qū): ZigZagBuffer[i]=EMPTY_VALUE; ? 必須這樣做是因?yàn)橹挥性趩?dòng)時(shí)才會完整計(jì)算指標(biāo),并且在有一些事件發(fā)生時(shí)也會完整計(jì)算,例如下載歷史時(shí)。緩沖區(qū)可能有舊的數(shù)據(jù),這可能會擾亂指標(biāo)線的外觀。 ?