MC的DirMovement系列函數[MC公式]
相關標簽:期貨與期權套利策略 、 期貨期權組合策略 、 期權與期貨的區別 、 期貨期權學院 、 期貨期權入門 、 期貨期權遠期 、 期貨與期權論文 、 商品期貨期權 、 豆粕期貨期權 、 期權對沖期貨 、 期權和期貨優劣 、 期貨期權交易 、 期貨期權實訓 、 期貨期權的比較 、 期貨投資與期權 、 本帖最后由 Alex 于 2017-7-25 20:19 編輯
DirMovement系列函數
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
1.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函數代碼
inputs: ? ?? ? PriceValueH( numericseries ),
?
//?來源:程序化99( m.kzuj.com.cn )最高價? ?? ? PriceValueL( numericseries ),
?
//?來源:程序化99( m.kzuj.com.cn )最低價? ?? ? PriceValueC( numericseries ),
?
//?來源:程序化99( m.kzuj.com.cn )收盤價? ?? ? Len( numericsimple ),? ?? ?? ?? ?
?
//?來源:程序化99( m.kzuj.com.cn )Len根bar ? ?? ? oDMIPlus( numericref ),? ?? ?? ?
?
//?來源:程序化99( m.kzuj.com.cn )代指+DI? ?? ? oDMIMinus( numericref ),? ?? ?
?
//?來源:程序化99( m.kzuj.com.cn )代指-DI? ?? ? oDMI( numericref ),? ?? ?? ?? ?
?
//?來源:程序化99( m.kzuj.com.cn )代指DX? ?? ? oADX( numericref ),? ?? ?? ?? ?
?
//?來源:程序化99( m.kzuj.com.cn )代指ADX? ?? ? oADXR( numericref ),? ?? ?? ???
?
//?來源:程序化99( m.kzuj.com.cn )代指ADXR? ?? ? oVolty( numericref ) ;? ?? ???
?
//?來源:程序化99( m.kzuj.com.cn )代指Volatility{這里,類似于oDMIPlus前面有o的參數,后面的括號中都是使用numericref,這個是使用在函數的參數聲明語句中,定義為傳址數值,它使函數可以輸出多個結果,并且傳遞給調用該函數的腳本;powerlanguage中這種類型的參數還有numericarrayref、stringarrayref、stringref、truefalsearrayref、truefalseref}variables:? ?? ? var0( 0 ),? ?
?
//?來源:程序化99( m.kzuj.com.cn )計算每根bar的正向波動值? ?? ? var1( 0 ),? ?
?
//?來源:程序化99( m.kzuj.com.cn )計算每根bar的負向波動值? ?? ? var2( 0 ),? ?? ?? ? var3( 0 ),? ?? ?? ? var4( 0 ),? ?
?
//?來源:程序化99( m.kzuj.com.cn )計算len根bar的累計正向波動值? ?? ? var5( 0 ),? ?
?
//?來源:程序化99( m.kzuj.com.cn )計算len根bar的累計負向波動值? ?? ? var6( 0 ),? ?
?
//?來源:程序化99( m.kzuj.com.cn )計算len根bar的累計真實波動幅度 ? ?? ? var7( 0 ),? ?
?
//?來源:程序化99( m.kzuj.com.cn )正向波動值的加權移動平均? ?? ? var8( 0 ),? ?
?
//?來源:程序化99( m.kzuj.com.cn )負向波動值的加權移動平均? ?? ? var9( 1 / Len ),? ???
?
//?來源:程序化99( m.kzuj.com.cn )計算中使用的加權移動平均的權重為1/len和1-1/len??? ?? ?? ?? ???? ?? ? var10( 0 ) ;? ?
?
//?來源:程序化99( m.kzuj.com.cn )正向指數與負向指數之和if CurrentBar = 1 then? ?? ? begin? ?? ? for Value1 = 0 to Len - 1 ? ?? ?? ?? ???begin? ?? ?? ?? ???var0 = 0 ;? ?? ?? ?? ???var1 = 0 ;? ?? ?? ?? ???var2 = PriceValueH[Value1] - PriceValueH[ Value1 + 1 ] ;? ?? ?? ?? ???var3 = PriceValueL[ Value1 + 1 ] - PriceValueL[Value1] ;? ?? ?? ?? ???condition1 = var2 > var3 and var2 > 0 ;? ?? ?? ?? ???if condition1 then? ?? ?? ?? ?? ?? ?? ?var0 = var2{當condition1條件成立的時候,當根bar為正向波動,波動值賦給var0,var1取默認值0}? ?? ?? ?? ???else ? ?? ?? ?? ???begin? ?? ?? ?? ???condition1 = var3 > var2 and var3 > 0 ;? ?? ?? ?? ???if condition1 then? ?? ?? ?? ?? ?? ?? ?var1 = var3 ;{condition1被重新賦值之后,如果條件滿足,當根bar為負向波動,波動值賦給var1,var0取默認值0}? ?? ?? ?? ?? ?? ?? ?end;? ? {到這里,for循環內部最大的if判斷結束,下面是for循環內部其它語句}? ?? ?? ?? ???var4 = var4 + var0 ;? ?
?
//?來源:程序化99( m.kzuj.com.cn )累加正向波動值,總共計算len次? ?? ?? ?? ???var5 = var5 + var1 ;? ?
?
//?來源:程序化99( m.kzuj.com.cn )累加負向波動值,總共計算len次? ?? ?? ?? ???var6 = var6 + TrueRangeCustom( PriceValueH, PriceValueL, PriceValueC )[Value1] ;??{累加真實波動幅度,總共計算len次,第len次之后,循環結束}? ?? ?? ?? ???end ;? ?? ? var7 = var4 / Len ;??{正向波動值的平均值,第一次平均是通過簡單平均計算的,之后是通過加權移動平均計算的}? ?? ? var8 = var5 / Len ;??
?
//?來源:程序化99( m.kzuj.com.cn )負向波動值的平均值? ?? ? oVolty = var6 / Len ;
?
//?來源:程序化99( m.kzuj.com.cn )真實波動幅度的平均值? ?? ? end else? ? {上面是判斷當currentbar=1成立時,使用簡單平均去計算平均正向波動值、平均負向波動值和平均真實波動幅度,之后else部分(即,currentbar>1時)使用加權移動平均去計算平均正向波動值、平均負向波動值和平均真實波動幅度}? ?? ? begin? ?? ? var0 = 0 ;? ?? ? var1 = 0 ;? ?? ? var2 = PriceValueH - PriceValueH[1] ;? ?? ? var3 = PriceValueL[1] - PriceValueL ;? ?? ? condition1 = var2 > var3 and var2 > 0 ;? ?? ? if condition1 then? ?? ?? ?? ???var0 = var2? ?? ? else ? ?? ? begin ? ?? ? condition1 = var3 > var2 and var3 > 0 ;? ?? ? if condition1 then? ?? ?? ?? ???var1 = var3 ;? ?? ?? ?? ???end;? ?? ? var7 = var7[1] + var9 * ( var0 - var7[1] ) ;{即,var7=(1-1/len)*var7[1]+1/len*var0,權重分別為1-1/len和1/len}? ?? ? var8 = var8[1] + var9 * ( var1 - var8[1] ) ;? ?? ? oVolty = oVolty[1] + var9 * ( TrueRangeCustom( PriceValueH, PriceValueL, PriceValueC ) ? ?? ???- oVolty[1] ) ;? ?? ? end ;if oVolty > 0 then? ?? ? begin? ?? ? oDMIPlus = 100 * var7 / oVolty ;? ?? ? oDMIMinus = 100 * var8 / oVolty ;{平均正向波動值與平均真實波動幅度的比值得到+DI,之所以乘以100,是為了使DI的值落在區間[0,100]內;平均負向波動值與平均真實波動幅度的比值得到-DI。}? ?? ? end else? ?? ? begin? ?? ? oDMIPlus = 0 ;? ?? ? oDMIMinus = 0 ;{這里當oVolty=0成立時,因為是分母為0沒有意義,會導致編譯出現錯誤,為了避免這種情況,需要在代碼中進行判斷,此時需要將+DI和-DI分別賦值為0}? ?? ? end ;var10 = oDMIPlus + oDMIMinus ;if var10 > 0 then
?
//?來源:程序化99( m.kzuj.com.cn )在代碼的編寫時,所有的變量做分母時都需要判斷一下? ?? ? oDMI = 100 * AbsValue( oDMIPlus - oDMIMinus ) / var10 {計算得到DX值}else? ?? ? oDMI = 0 ;??condition1 = CurrentBar <= Len and CurrentBar > 0 ;{從這里之后的部分,需要計算ADX和ADXR,ADX是DX的平均計算,而DX的計算已經是基于len根bar的平均計算,所以ADX的計算是二次平均計算,是基于2*len根bar的平均計算}if condition1 then? ?? ? begin? ?? ? oADX = Cum( oDMI ) / CurrentBar ;? ?? ? oADXR = ( oADX + oADX[ CurrentBar - 1 ] ) * .5 ;? ?{這里,由于currentbar<=len,即bar的數目不夠,所以需要進行一次特殊的平均計算,計算ADX使用的分母是currentbar;同樣,ADXR的計算也進行了特殊的計算}??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? ? ?? ? endelse? ?? ? begin? ?? ? oADX = oADX[1] + var9 * ( oDMI - oADX[1] ) ;? ?? ? oADXR = ( oADX + oADX[ Len - 1 ] ) * .5 ;{對ADX進行加權移動平均計算,權重分別為1-1/len和1/len;ADXR的計算見代碼}? ?? ? end ;DirMovement = 1 ;??
?
//?來源:程序化99( m.kzuj.com.cn )這個函數的返回值沒有意義,關鍵是傳址參數的使用1.4 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的數目,返回平均真實波動幅度值。
本主題由 Alex 于 14?小時前 限時置頂
?
?
公式導入教程: 【通達信公式源碼導入方法教程】 【同花順公式源碼導入方法教程】 【大智慧新一代公式源碼導入方法教程】
?
有思路,想編寫各種指標公式,程序化交易模型,選股公式,預警公式的朋友
可聯系技術人員 QQ: 511411198 進行 有償 編寫!(不貴!點擊查看價格!)
相關文章
-
沒有相關內容