2014年12月4日 星期四

開發商品的交易系統 - 基礎篇 [19]

EasyTrader ArtNo 224
DMI指標是由威爾斯 • 懷爾德創建,他在 1978年[技術交易系統的新概念]的書中所提出的一種概念。DMI 指標可以衡量市場是位於有方向的動能量或是無方向的橫盤,它由三條線: DMI + (DMIPlus)、 DMI-(DMIMinus) 和 ADX (平均定向指數)所組成。當 DMI + 大於 DMI-時,趨勢是向上 ;當 DMI-大於 DMI +,趨勢是下行的。
平均趨向指數(ADX)是另一種常用的趨勢衡量指標。利用多空趨向之變化差離與總和判定股價變動之平均趨勢,可反映股價走勢之高低轉折,但無法掌控波段獲利水準,因此,發生信號頻率甚多而獲利卻不穩定,常用於輔助其他指標系統操作。

 ADX無法告訴你趨勢的發展方向。可是,如果趨勢存在,ADX可以衡量趨勢的強度。不論上升趨勢或下降趨勢,ADX看起來都一樣。ADX的讀數越大,趨勢越明顯。衡量趨勢強度時,需要比較幾天的ADX 讀數,觀察ADX究竟是上升或下降。ADX讀數上升,代表趨勢轉強;如果ADX讀數下降,意味著趨勢轉弱。

平均趨向指標的交易法則
1、當DMI+ 大於DMI-時,僅由多方進行交易。當DMI-大於DMI+時,僅由空方進行交易。
1-1最適合進場做多的時機是:DMI+與ADX都位在DMI-的上方,而且ADX上升,這代表上升趨勢正在轉強,建立多頭部位之後,停損設定在最近次要低點的下側。
1-2最適合進場做空的時機是:DMI-與ADX都位在DMI+的上方,而且ADX上升,這代表下降趨勢正在轉強,建立空頭部位之後,停損設定在最近次要高點的上側。
2、當ADX下降而同時低於兩條趨向線,這代表沉悶的橫向走勢。不可採用順勢交易方法,但應該開始準備,因為這相當於是暴風雨之前的寧靜,主要的趨勢經常由此發動,這是趨向系統發出最佳訊號的位置。這種情況維持愈久,下一波走勢的基礎愈穩固。

測試程式碼

input:ExitType(2) ;
inputs:NBarL(6),NBarS(7),TradeProfit(0.05),TradeStopLoss(0.045),ATRs_L(12.7),ATRs_S(4.6);
vars: IsBalanceDay(False),MP(0),PF(0),PL(0),HLRange(100);

input: DMILen(2),ADXLen(9),ADXExit(21),DMILenS(7),ADXLenS(7),ADXExitS(30);
Vars: BuySetup(false),SellSetup(false),BuyPrice(0),SellPrice(0),DPlus(0),DMin(0),ADXVal(0),ExitSPrc(0),ExitLPrc(0);
Vars:SDPlus(0),SDMin(0),SADXVal(0) ;

MP = MarketPosition ;

if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;

PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;

{ 計算 ADX / DMI+ /DMI- }

DPlus = DMIPlus(DMILen);
DMin = DMIMinus(DMILen);
ADXVal = ADX(ADXLen);

多空不同週期使用 
SDPlus = DMIPlus(DMILenS);
SDMin = DMIMinus(DMILenS);
SADXVal = ADX(ADXLenS);
}

{ 建立買方環境 }
If DPlus > DMin AND ADXVal Crosses Over DMin and MarketPosition <> 1 then begin
BuyPrice = High + 1 point;
BuySetup = true;
ExitLPrc = Low - 1 point;
end;
If ADXVal < DMin OR MarketPosition = 1 then BuySetup = False;

{ 多空相同週期 }
{ 建立賣方環境 }
If DPlus < DMin AND ADXVal Crosses Over DPlus and MarketPosition <> -1 then begin
SellPrice = Low - 1 point;
SellSetup = true;
ExitSPrc = High + 1 point;
end;
If ADXVal < DPlus or MarketPosition = -1 then SellSetup = False;

{ 多空不同週期使用 
{ 建立賣方環境 }
If SDPlus < SDMin AND SADXVal Crosses Over SDPlus and MarketPosition <> -1 then begin
SellPrice = Low - 1 point;
SellSetup = true;
ExitSPrc = High + 1 point;
end;
If SADXVal < SDPlus or MarketPosition = -1 then SellSetup = False;
}

{ 買方環境成立下 ,突破高點進場 作多}
If BuySetup then Buy next bar at BuyPrice stop;

{ 賣方環境成立下 ,突破高點進場 作空}
If SellSetup then Sell next bar at SellPrice stop;

{ 出場方式 }
if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

if ExitType = 2 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
end;

if ExitType = 3 then Begin
if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then ExitShort next bar at Market ;
end;

if ExitType = 4 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
if MP > 0 and BarsSinceEntry = NBarL then {Sell } ExitLong next bar at Market ;
if MP < 0 and BarsSinceEntry = NBarS then {Buy} ExitShort next bar at Market ;
end;

if ExitType = 5 then Begin
{*******************************************************************
Description : ATR Trailing Stop Long Exit
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}
{Inputs: ATRs_L(3);}
Variables: PosHigh(0), ATRVal_L(0);

ATRVal_L = AvgTrueRange(10) * ATRs_L;
If BarsSinceEntry = 0 Then PosHigh = High;
If MarketPosition = 1 Then Begin
If High > PosHigh Then PosHigh = High;
ExitLong ("ATR") Next Bar at PosHigh - ATRVal_L Stop;
End else ExitLong ("ATR eb") Next bar at High - ATRVal_L Stop;

{*******************************************************************
Description : ATR Trailing Stop Short Exit
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}
{Inputs: ATRs_S(3);}
Variables: PosLow(0), ATRVal_S(0);
ATRVal_S = AvgTrueRange(10) * ATRs_S;

If BarsSinceEntry = 0 Then PosLow = Low;
If MarketPosition = -1 Then Begin
If Low < PosLow Then PosLow = Low;
ExitShort ("ATR_1") Next Bar at PosLow + ATRVal_S Stop;
End else ExitShort ("ATR_1 eb") Next bar at Low + ATRVal_S Stop;
end;

if IsBalanceDay then setExitonClose ;
(多空週期相同)
台指期 日K 留倉 回測週期 2004/11/1~2014/10/31 交易成本 1200
多空週期不相同
台指期 日K 留倉 回測週期 2004/11/1~2014/10/31 交易成本 1200

結論:因為商品的特性或是市場的慣性不同,對於策略開發者而言,非對稱式的進場邏輯,甚至多空不同的進場元素,都是可以去大膽嘗試的 !
MagicQS135

沒有留言:

張貼留言