2014年3月3日 星期一

DMI趨向指標的交易模型 [1] (程式碼)

EasyTrader ARtNo 116
趨向指標(Directional Movement Index)簡稱為DMI,是由技術分析大師威爾德(J. Welles Wilder)所開創出來一組技術工具。它不僅是威爾德自認為最實用的技術分析工具,同時也是深受一般技術分析師肯定的分析工具之一。DMI指標是一套在理論與實際應用上都相當複雜的技術指標。

DMI指標在線圖的設計上,將呈現出二條的方向線(+DI、-DI)與一條趨向平均線(ADX)來。使用者便是以此來估算出買賣雙方所累積的力量,並且以此來尋求雙方力量的均衡點,進而求知在雙方力量互動下,價格波動循環的過程。

在計算DMI的方向線與趨向平均線值之前,首先得先求得它們形成的根本來源,即每日行情的趨向變動值DM(Directional Movement 或者稱為創新幅度值)與真正波幅值TR(True Range)。其中趨向變動值又可依據創新幅度的向上與向下而區分為正趨向變動值+DM (positive directional movement value)與負趨向變動值-

原來DMI說的是:在每日股價的真正波動幅度(TR)中,往上創新高的力量有多少(+DI t線);以及往下創新低的力量又有多少(-DI t線).所以,只要+DI值大於-DI值,那麼就是買盤力道強於賣盤,是股價的漲升階段,該買進;反之,如果是-DI大於 +DI值,那麼就是賣盤力道強於買盤,是股價的下跌階段,該賣出.
最後,威爾德乾脆又作了個指標,將這兩條線設計了一個特別的公式,直接以這指標來指示股價的變動方向,這指標是ADXt 線.這條線向上則股價上漲,這條線向下,則股價下跌.不過,在實證上,這條ADXt線的準確性不是很好.反而不如直接將+DI線直接減去-DI線所得到的DMO(Directional Movement Oscillator)趨向擺盪線來得準確。

由於DMI指標主要的用途在於作趨勢成立的判斷,因此是屬於較為長期交易的技術指標。而DMI指標的三條線中,ADX線可以說是相當奇特的一條線。ADX線在上昇趨勢開始形成時,會從底部往上攀昇,直到上昇趨勢開始平緩而盤旋時,ADX線便回轉向下。而當下降趨勢開始時,ADX線同樣的又開始從底部往上爬昇,直到下降趨勢和緩而盤整時,ADX線又開始向下回轉。

因此,上昇中的ADX線所代表的意義是,一個新的趨勢正在形成當中,有可能是上昇趨勢,但也有可能是下降趨勢。一般認為ADX值超過20到25以上時,可以認定趨勢確實已經形成。此時可以利用二條DI線的交叉關係來作買賣依據的訊號,即當+DI由下往上升而突破下降中的-DI時,為買進訊號,行情為進入上升趨勢中;而當+DI由上往下跌破上升中的-DI時,則為賣出訊號,行情為進入下跌趨勢中。

應用法則
1.+DI為上漲方向指標,+DI值愈高,代表漲勢愈明確且強烈;-DI為下跌方向指標,-DI值愈高時,代表跌勢愈明確且乏力。
2.+DI線由下向上突破 -DI線時,為買進訊號,若ADX線再上揚,則漲勢將更強。因股價上漲,+DI線會向上攀升,顯示上升動量的增強,-DI線則會下跌,反映下跌動量的減弱。
3.+DI線由上向下跌破 -DI線時,為賣出訊號,若ADX線再走上揚,則跌勢將更凶。
4.ADX為趨勢動量指標,在漲勢或跌勢明顯的階段,ADX線會逐漸增加,代表上漲或下跌的力量已經增強。因此若ADX經常在低檔徘徊時,表示行情處於漲升乏力的弱勢市場中;若ADX經常在高檔徘徊,則代表行情處於作多有利的強勢市場中。

以上為技術指標上的理論依據, 單獨DMI 或是 ADX 是否也能成為策略元素呢 ?以下為台指期日K 2001/1 ~2014/2 的測試 ,交易成本 1200

DMI 測試



ADX 測試



看起來只要是有不同的想法還是有機會的

測試程式碼(DMI)
inputs: XL1(10),XS1(10),XL2(10),XS2(1),NL1(10),NS1(8),NL2(10),NS2(15),SFT_L1(10),SFT_S1(6),SFT_L2(100),SFT_S2(10) ;

inputs: NBar_LE(9),Frac_LE(1.74),TRLen_L(2),Ratio_TL(2.38),TRPct_L(60),NBar_LM(9),Frac_LMM(1.3),NBar_LX(12),Bar_L1(3) ;

inputs: NBar_SE(5),Frac_SE(1.2),TRLen_S(40),Ratio_TS(1.2),TRPct_S(60),NBar_SM(6),Frac_SMM(1.2),NBar_SX(10),Bar_S1(3) ;

inputs: TradeProfit(0.05),TradeStopLoss(0.03) ;

Var:LE_ATR(0),TL_ATR(0),LMM_ATR(0),SE_ATR(0),TS_ATR(0),SMM_ATR(0) ;
Var:UBuy(0),BuyStop(0),NewBuyStop(0),Trigger_TL(false),USell(0),SellSTOP(0),NewSellStop(0),Trigger_TS(false) ;
Var:VarL1(0),VarL2(0),VarL3(0),VarL4(0),VarS1(0),VarS2(0),VarS3(0),VarS4(0),Cond_LE(false),Cond_SE(false);

LE_ATR = Average(TrueRange, NBar_LE);
LMM_ATR = Average(TrueRange, NBar_LM);
TL_ATR = Average(TrueRange, TRLen_L);

UBuy = Low + Frac_LE * LE_ATR;
USell = Low ;

VarS1 = DMI(NS1)[SFT_S1];
VarS2 = DMI(NS2);

Cond_LE = true;
Cond_SE = VarS1 >= VarS2;

If Cond_LE then begin
   Buy next bar at UBuy stop;
end;

If Cond_SE then begin
   Sell next bar at USell stop;
end;

If MarketPosition > 0 then begin
   If BarsSinceEntry = 0 then begin
      BuyStop = EntryPrice - Frac_LMM * LMM_ATR;
   Trigger_TL = false;
   end;

   If Close - EntryPrice > Ratio_TL * TL_ATR then  Trigger_TL = true;

   If Trigger_TL then begin
      NewBuyStop = EntryPrice + TRPct_L * (Close - EntryPrice)/100.;
      BuyStop = MaxList(BuyStop, NewBuyStop);
   end;

   ExitLong next bar at BuyStop stop;
end;

If MarketPosition < 0 then begin
   If BarsSinceEntry >= NBar_SX then ExitShort next bar at market;
end;

沒有留言:

張貼留言