DirMovement系列函數包括函數DirMovement、DMI、DMIMinus、DMIPlus、ADX、AvgTrueRange等函數,詳細的請看表1 DirMovement系列函數,它們是由威爾斯·懷爾德(Welles Wilder)創造出來的。
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 表1 DirMovement系列函數
??DirMovement系列??功能DirMovement全稱Directional Movement,被函數DMI、DMIMinus、DMIPlus、ADX和Volatility調用DMI計算DX指數(Directional Movement Index,動向指數)DMICustom和函數DMI相同,不同的是多了三個價格輸入參數DMIMinus計算-DI指數(負向指數)DMIMinusCustom和函數DMIMinus相同,不同的是多了三個價格輸入參數DMIPlus計算+DI指數(正向指數)DMIPlusCustom和函數DMIPlus相同,不同的是多了三個價格輸入參數ADX計算ADX指數(Average Directional Movement Index,平均動向指數)ADXCustom和函數ADX相同,不同的是多了三個價格輸入參數ADXClassic和函數ADX相同,不同的是ADXClassic對結果取整ADXCustomClassic和函數ADXCustom相同,不同的是ADXCustomClassic對結果取整ADXR計算(ADX(len)+ADX(len)[len-1])/2的值,len需要計算bar的數量ADXRCustom和函數ADXR相同,不同的是多了三個價格輸入參數ADXRClassic和函數ADXR相同,不同的是ADXRClassic對結果取整ADXRCustomClassic和函數ADXRCustom相同,不同的是ADXRCustomClassic對結果取整Volatility計算平均真實波幅,使用加權平均計算平均真實波幅XAverageOrig懷爾德平滑(Wilder’s Smoothing),以1/len和1-1/len為權重的加權移動平均TrueHigh當根bar的最高價與前一根bar的收盤價,取最高值TrueLow當根bar的最低價與前一根bar的收盤價,取最低值TrueRange計算真實波幅,TrueHigh-TrueLowXAverage指數移動平均函數TrueRangeCustom和TrueRange相同,不同的是多了三個價格輸入參數AvgTrueRange平均真實波幅(Average True Range,簡稱ATR指數),使用簡單平均函數計算平均真實波幅表1中總共有23個MC內置的函數,大部分是通過直接或間接調用DirMovement來計算,所以我們只需要將DirMovement函數背后的原理及邏輯弄清楚,其它的函數也就會很清楚,進一步,由這些函數組合得到的指標也能很快掌握并且熟練應用。下面主要通過對ADX指數的計算來介紹DirMovement函數的邏輯,然后再介紹其它函數及相同功能函數之間的比較。
1. ADX絕大多數指標的計算都是以每一日的收盤價的走勢及漲跌幅的累計數計算出不同的分析數據,其不足之處在于忽略了每一日的高低價之間的波動幅度。比如某個股票的兩天的收盤價可能是一樣的,但是其中一天的波動幅度只有2%,而另一天的波動幅度是10%,如果僅僅考慮收盤價而忽略了每天市場的價格波動幅度,那么并不能很好的判斷和分析市場行情。ADX指數的出現彌補了這一不足,它主要用于分析市場的漲跌力度,但并不反應市場漲跌的方向;ADX全稱為Average Directional Movement Index,是對Directional Movement Index(動向指數,簡稱DX)的加權平均,而DX是市場正向波動和市場負向波動的絕對差除以市場正向波動和市場負向波動之和得到的,其中市場正向波動和市場負向波動分別由+DI和-DI指數(前面的”+“和”-“只是代表方向,并不起到數學符號的作用)衡量。當市場出現一波上漲或者下跌時,ADX指數會隨之上升,在實盤操作中,常將ADX與+DI和-DI指標結合起來判斷市場買賣點。
1.2 ADX指數計算邏輯
通過當根bar的最高價與前一根bar的最高價進行比較,計算得到當根bar的正向波動值+DM=max(high-high[1],0);通過前一根bar的最低價與當根bar的最低價進行比較,計算得到當根bar的負向波動值-DM=max(low[1]-low,0);但是每一根bar只允許有一個波動方向,也就是說只允許有一個波動值,不能同時存在正向波動值和負向波動值,這時,我們需要對+DM和-DM進行比較,取最大值作為當根bar的波動值,波動的方向和最大波動方向一致,另一個波動值賦值為0;舉例說明,如果計算出+DM=2.3,-DM=2.1,那么+DM就是當根bar的波動值,方向是正向波動,同時-DM重新賦值為0。
在計算完當根bar的波動之后,還需要計算當根bar的真實波動幅度,真實波動幅度和之前的正向波動及負向波動不一樣,真實波動幅度沒有方向,只是用來衡量當根bar價格波動幅度,簡稱TR(True Range);它是通過max(high,close[1])-min(low,close[1])計算得到。將TR進行移動平均計算之后,可以得到Volatility和ATR,即平均真實波動幅度(Average True Range),具體使用加權平均還是指數平均因策略而異,ADX中計算的Volatility是使用XAverageOrig函數進行計算的。
對于不同的商品合約及不同的周期,每一根bar正向波動和負向波動值差異很大,為了使用統一的標準對市場進行判斷分析,需要先對正向波動、負向波動及真實波動幅度進行加權移動平均計算,然后通過平均正向波動與平均真實波幅的比值得到正向指數+DI,通過平均負向波動與平均真實波幅的比值得到負向指數-DI,這里的平均計算統一使用XAverageOrig函數進行計算,平均計算使用多少根bar來計算沒有統一的規定(本文以len代替)。
+DI和-DI計算出來之后,可以很容易得到DX指數、ADX指數和ADXR指數。DX=|(+DI)-(-DI)|/((+DI)+(-DI)),這里+DI和-DI都被括起來了;ADX是DX的加權移動平均;ADXR=(ADX+ADX[len-1])*0.5;下面通過DirMovement函數的代碼來進一步嚴謹的介紹ADX指數計算的邏輯。
1.3 DirMovement函數代碼DirMovement函數代碼在上面已經介紹過了,這個函數的返回值沒有意義,關鍵是傳址參數的使用。
DMI函數內部調用了DirMovement,DMI函數的返回值就是DX指數的值;DMI(len)的參數是需要計算的bar的數目len,然后返回DX指數的值。
DMICustom函數的功能及內部的代碼邏輯和DMI函數一樣,不同的是多了三個價格參數,DMICustom(high,low,close,len)的參數分別是最高價、最低價、收盤價和bar的數目len,返回DX指數的值。
DMIMinus函數內部調用了DirMovement,它的返回值就是-DI指數的值;DMIMinus(len)的參數是需要計算的bar的數目len,然后返回-DI指數的值。
DMIMinusCustom函數的功能及內部的代碼邏輯和DMIMinus函數完全一樣,不同的是多了三個價格參數,DMIMinusCustom(high,low,close,len)的參數分別是最高價、最低價、收盤價和bar的數目len,返回-DI指數的值。
ADX函數調用了DirMovement函數;ADX(len)的參數是需要計算的bar的數目len,然后返回ADX指數的值。
ADXCustom函數的功能及內部代碼邏輯和ADX函數完全一樣,不同的是多了三個價格參數;ADXCustom(high,low,close,len)的參數分別是最高價、最低價、收盤價和bar的數目len,返回ADX指數的值。
ADXClassic函數功能及計算邏輯和ADX函數是一樣,參數也是一樣的,不同的是代碼的編寫不一樣;ADXClassic函數調用了DMI函數來計算DX指數,然后再對DX指數使用加權移動平均來計算ADX指數的值,最后再使用intportion關鍵字對ADX指數取整;ADXClassic(len)的參數是需要計算的bar的數目len,然后返回ADX指數的取整值(即將小數點之后的值去除)。
ADXCustomClassic函數是ADXClassic和ADXCustom的結合,即使用了三個價格參數,然后在內部調用了DMI函數來計算DX指數,然后再對DX指數使用加權移動平均來計算ADX指數的值,最后再使用關鍵字intportion對ADX指數取整數值;ADXCustomClassic(high,low,close,len)的參數是最高價、最低價、收盤價和需要計算的bar的數目len。
ADXR函數調用了DirMovement函數;ADXR(len)的參數是需要計算的bar的數目len,然后返回ADXR指數的值。
ADXRCustom、ADXRClassic、ADXRCustomClassic函數的計算、使用及相互區別可以參考ADX。
XAverageOrig是加權移動平均函數;XAverageOrig(pricevalue,len)的參數分別是價格值和需要計算的bar的數目len,權重分別為1-1/len和1/len,函數返回pricevalue的加權平均值,即XAverageOrig=(1-1/len)*XAverageOrig[1]+1/len*pricevalue。
TrueHigh函數返回當根bar的最高價與前一根bar的收盤價的最高值,這個函數沒有參數。
TrueLow函數返回當根bar的最低價與前一根bar的收盤價的最低值,這個函數沒有參數。
TrueRange函數返回當根bar的真實波動幅度,TrueRange=TrueHigh-TrueLow,這個函數沒有參數。
TrueRangeCustom函數的邏輯和TrueRange的計算邏輯是一樣的,不同的是它有三個價格參數;TrueRangeCustom(high,low,close)的參數是當根bar的最高價、最低價和收盤價,返回當根bar的真實波動幅度。
Volatility的值等于XAverageOrig(TrueRange,len),這個函數的內部調用函數XAverageOrig對真實波動幅度進行加權移動平均計算;Volatility(len)的參數是需要計算的bar的數目len,返回平均真實波動幅度。
XAverage是指數移動平均函數,它是一種特殊的加權平均函數;XAverage(pricevalue,len)的參數分別是價格值和需要計算的bar的數目,返回pricevalue的指數移動平均值,即XAverage=(len-1)/(len+1)*XAverage[1]+2/(len+1)*pricevalue。
AvgTrueRange函數調用Average函數計算平均真實波動幅度,即先累加真實波動幅度,然后再除以數目;AvgTrueRange(len)的參數是需要計算的bar的數目,返回平均真實波動幅度值。