2014年9月11日 星期四

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

EasyTrader ArtNo 200
買跌賣漲交易系統(Buy Dips/Sell Rallies trading system)背後的想法是,上漲的趨勢中出現了逆勢的回檔,一旦這趨勢開始回復時我們就買進作多。同樣地,在下降趨勢中出現了逆勢的反彈,但只要回到下降趨勢的軌道我們就賣出作空。通常人們普遍認為市場價格會沿著趨勢的軌道行進且將會經歷一個或多個修正。我們希望能夠定義趨勢的發生,然後找到可能的最好進入市場點,以獲取趨勢的利潤。我們的想法是確定趨勢的發生與等待逆勢的回檔或反彈發生。
然後,如果這一趨勢在下跌或反彈後回到原來軌道,代表這種趨勢很強,可能繼續再延續一段時間,所以我們進入市場作多或作空。首先,我們需要一個方式來確定的趨勢的存在及趨勢的方向。大多數系統使用移動平均線來確定趨勢的方向,所以我們想要使用一些不同的東西。這裡我們決定使用的相對強度指數 (RSI) 指標。RSI 通常是用來找到超買和超賣條件並顯示價格背離的一個擺盪指標。最常見的 RSI 在 70 或 80 的市場被認為超買,和 RSI 低於 20 或 30 的市場被認為是超賣。

此外,中值 50 與其他擺盪指標內的零值所代表的意義是相同的。穿越 50 的上方或下方 表示目前的趨勢減緩或趨勢反轉的信號出現。本篇介紹的系統將使用 RSI 和 50 的水準來確定市場的整體方向。我們假設當 RSI 大於 50,市場是處於上升趨勢,而當 RSI 小於 50 時,市場處於下降趨勢。我們還需要另一個方法來識別逆勢價格波動的影響。這裡我們決定使用趨向指標 (DMI) 的價差。DMI利用計量分析方法,以較客觀性的態度,研判商品價格漲跌的趨勢。在研判時,未摻雜個人主觀性的判斷,且能考慮商品價格每日的最高價、最低價及收盤價三者間的波動情形,可對商品價格的波動情形做完整性分析。傳統的 DMI 指標包括的三個值:正 DMI、 負DMI ,和 ADX。正DMI 衡量價格上升的移動;負DMI 衡量價格下跌的移動。當二者之間的差異小於零處於上升趨勢,或大於零且處於下跌的趨勢時,我們可以假設逆勢的價格擺動正在發生,而這其中的關鍵點是用來計算 RSI 的 K棒期間要比計算 DMI 的期間長一些。
我們把 RSI 指標與 DMI 正負向的差值作成如下所示的指標圖

測試程式碼
input:EntryType(0),ExitType(5) ;
inputs:ATRs_L(4),ATRs_S(8),TradeProfit(0.02),TradeStopLoss(0.02);
vars: IsBalanceDay(False),MP(0),PF(0),PL(0),HLRange(100);

inputs:RSILong(20),DMILen(5),HighLevel(50),RSIShort(20),DMIShort(5),LowLevel(50);
Vars: UpTrend(False), DnTrend(False), DMISpread(0), BuySetup(False),
SellSetup(False), LongEntryPrice(0), ShortEntryPrice(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 ;

{原始設計 }
{ Setup calculations }
UpTrend = RSI(Price, RSILen) >= 50 {RSILevel};
DnTrend = RSI(Price, RSILEn) < 50 {RSILevel};

}

{ 我作了一點修正 參考價格分別使用 High/Low , 多空參考長度也不相同 }
UpTrend = RSI(High, RSILong) > HighLevel;
DnTrend = RSI(Low, RSIShort) < LowLevel;

{ 計算 DMI 正負值的差價 }
DMISpread = DMIPlus(DMILen) - DMIMinus(DMILen);

{ 買方環境判定}
If UpTrend and DMISpread < 0 then Begin
BuySetup = True;
SellSetup = False;
End;

{ 賣方環境判定}
If DNTrend and DMISpread > 0 then Begin
SellSetup = True;
BuySetup = False;
End;

{ 當空手且買方環境剛確認,以當根K棒高點作為買進作多價格 }
If BuySetup and MarketPosition = 0 then Begin
If BuySetup[1] = False then LongEntryprice = High;
Buy next bar at LongEntryPrice Stop;
End;

{ 當空手且賣方環境剛確認,以當根K棒低點作為賣出作空價格 }
If SellSetup = True and MarketPosition = 0 then Begin
If SellSetup[1] = False then ShortEntryPrice = Low;
Sell next bar at ShortEntryprice Stop;
End;

{ Exit Orders }
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;

{ 原始出場策略 Exit Orders }
if ExitType = 6 then begin
{多單進場後以當根K棒低點減去四根振幅平均值作為初始停損價}
If MP = 1 and MP[1] <> 1 then StopPrice = Low - Average(Range,4);

{空單進場後以當根K棒高點加上四根振幅平均值作為初始停損價}
If MP = -1 and MP[1] <> -1 then StopPrice = High + Average(Range,4);

If MP = 1 then Begin
Exitlong next bar at StopPrice Stop;
{ 隨持倉時間增加逐步調整停損價以保持最大獲利}
StopPrice = StopPrice + (Low - StopPrice)/3;
End;

If MP = -1 then Begin
Exitshort next bar at StopPrice Stop;
{ 隨持倉時間增加逐步調整停損價以保持最大獲利}
StopPrice = StopPrice - (StopPrice - High)/3;
End;

end;

if IsBalanceDay then setExitonClose ;
台指期 日K 留倉 交易週期 2004/8/2 ~ 2014/7/31 交易成本 1200
台指期 60 min K 留倉 交易週期 2004/8/2 ~ 2014/7/31 交易成本 1200
結論:早期的策略多半是屬於對稱式的多空進出場設計或是以收盤價作為計算的基準,我們在開發的過程中其實可以作一些變化來作修正,以本例來說 RSI價格更換成 High/Low 或是 AvgPrice (四價均值) 都會比Close 來的好
MagicQS113

沒有留言:

張貼留言