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


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

0 留言:

張貼留言

如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!

----------------------------------------------------------------------------------------------------
網站聲明(Disclaimer)
本教學網站內所提供之程式碼(包括函數、指標、訊號)屬開放程式碼,用意在於讓使用者學習程式語法之撰寫,使用者可以任意修改語法內容並調整參數。本網站所有之內容(包括文章、影片、歷史紀錄、程式碼、教材)限用於個人學習使用,請勿轉寄、濫用,嚴禁私自串接帳戶交易。
-------------------------------------------------------------------------------------------------