2014年3月5日 星期三

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

EasyTrader ARtNo 117
關於趨向指標的運用,最重要的延伸可能是平均趨向指數(average directional movement index,簡稱ADX)。ADX就是趨向變動指數的移動平均,移動平均期間通常設定與前述計算的期間相同(換言之,14)。

 拉寶與盧卡斯表示,「適當解釋ADX可以顯著提升交易者選擇好市場的成功率。」他們相信ADX可以把價格趨勢強度數量化,而且他們自認為在這方面的研究相當投入。我與拉寶經常一起舉辦講座,相當瞭解他對於ADX的熱愛與運用。

 大體上,ADX讀數愈大,市場的趨向愈明確。可是,我們不知道趨勢究竟是向上或向下。另外,ADX讀數愈小,市場愈缺乏趨向。所以,ADX讀數大小,可以顯示市場的趨勢強度,但沒有顯示趨勢方向。

拉寶與盧卡斯認為,我們不能根據ADX數值大小而判斷趨勢的強弱。他們提出下列建議:
1.只要ADX讚數位在15之上,而且讀數繼續上升,就代表市場存在趨勢。
2. ADX的上升速度愈快,趨勢愈強。舉例來說,ADX由15上升到20,其代表的趨勢,可能強過ADX由25上升到27。
3. ADX讀數下降,代表趨勢轉弱,市場已經不存在明確趨勢。
4.只要ADX處於上升狀態,擺盪指標所顯示的超買或超賣,將沒有意義。換言之,顯示超買或超賣的擺盪指標,只有在ADX處於下降狀態才有用。

說明ADX的進場訊號之前,首先談談ADX經常碰到的兩個問題突兀變動與時間落後。

如果價格走向突然改變 (換言之,價格走勢圖出現突兀線型)ADX很難調整。舉例來說,如果行情突然改變方向,拉寶與盧卡斯建議使用的長期ADX會突然走平,顯示市場缺乏趨勢。所以,這很可能讓交易者忽略了可交易的反向趨勢。

其次,就如同任何長期移動平均一樣,長期ADX存在時間落後的問題。換言之,唯有當趨勢已經進行相當程度,ADX才會呈現趨勢明確的訊號。所以,對於短線交易者,或者想要及早進場的人,這都是很可慮的缺點。當然,如果我們只想掌握非常強勁的趨勢,那麼ADX 的時間落後就不是問題。

本篇的重點在於組合 DMI+ADX兩種元素,建構不同的進出場邏輯
基本設定 台指期 日K 回測週期 2001/1 ~ 2014/2 交易成本 1200

多單進場 DMI 鑼輯 空單進場 DMI+ADX




測試程式碼
inputs: XL1(10),XS1(10),XL2(10),XS2(1),NL1(20),NS1(8),NL2(15),NS2(18),SFT_L1(9),SFT_S1(14),SFT_L2(100),SFT_S2(10) ;
inputs: NBar_LE(4),Frac_LE(1.34),TRLen_L(40),Ratio_TL(1.24),TRPct_L(47),NBar_LM(6),Frac_LMM(2.68),NBar_LX(17),Bar_L1(3) ;
inputs: NBar_SE(8),Frac_SE(1.2),TRLen_S(40),Ratio_TS(1.2),TRPct_S(60),NBar_SM(6),Frac_SMM(3.77),NBar_SX(6),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);

Var:ATRL(0),ATRS (0);

ATRL = Average(TrueRange, NBar_LE);
ATRS = Average(TrueRange, NBar_SE);

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

VarL1 = DMI(NL1);
VarL2 = DMI(NL2)[SFT_L1];
VarS1 = DMI(NS1);
VarS2 = ADX(NS2)[SFT_S1];
Cond_LE = VarL1 <= VarL2;
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 * ATRL;
       Trigger_TL = false;
   end;

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

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

   If BarsSinceEntry >= NBar_LX then ExitLong next bar at market;
   ExitLong next bar at BuyStop stop;
end;

If MarketPosition < 0 then begin
   If BarsSinceEntry = 0 then begin
       SellSTOP = EntryPrice + Frac_SMM * ATRS;
   end;
   If BarsSinceEntry >= NBar_SX then ExitShort next bar at market;
   ExitShort next bar at SellSTOP stop;
end;

多單進場 ADX 鑼輯 空單進場 ADX + DMI




讀者也可以用上述的程式碼作變化試試囉!
MagicQS045_1

沒有留言:

張貼留言