2016年1月6日 星期三

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

EasyTrader ArtNo 283
當我們在市場上漲趨勢中持有多單,一旦趨勢反轉向下時所採取的行動是平倉出場在邊線觀望或是嘗試修正交易方向來追隨趨勢,本篇文章介紹一個使用眾所熟悉的RSI指標所設計的策略。作者 Peter Konner 在設計此策略所期望的目標是

1.應基於單一的模型或保持盡可能簡單和盡可能透明的指標。
2.它以週的時間框架作交易。(因為作者有一份全職工作,只能在週末花時間分析股票)。
3.從圖表上作主觀分析的需求 --例如支撐線、通道等等,應減至最低。
4.策略以上漲趨勢持有多單為主,但也在跌勢中作交易的修正。
5.策略的執行必需是相當簡單的。

RSI 相對強弱指標是在給定期間的內,衡量價格的上升運動與所有動作的總和的比值。
首先我們將K線圖中放入快速與慢速兩個均線作為支撐線,另加入兩個RSI圖表作為長短週期的強弱指標比較,如下圖


原作者以作多為主,我們按例改為多空雙向的策略開發 文章參考這裡

{系統參數與變數} 
input:EntryType(1),ExitType(1);
inputs:NBarL(16),NBarS(14),TradeProfit(0.035),TradeStopLoss(0.04),ATRs_L(3.9),ATRs_S(15.8);
vars:IsBalanceDay(False),MP(0),PF(0),PL(0);

inputs:QuickRSILen(3),RSIRatio(2.9),QuickMALen(14),MARatio(4),RSIBuyLevel(78),RSISellLevel(12),HighBar(8),LowBar(11) ;
vars:SlowRSI(0),QuickRSI(0),SlowMA(0),QuickMA(0),SlowRSITrendDir(0),SlowRSILen(0),SlowMALen(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 ;

{利用參數來調整快速/慢速週期的比例 }
SlowRSILen = IntPortion(QuickRSILen * RSIRatio) ;
SlowMALen = IntPortion(QuickMALen * MARatio) ;

{計算快速/慢速週期的 RSI 與均線值 }
SlowRSI = RSI( Close, SlowRSILen ) ;
QuickRSI = RSI( Close, QuickRSILen ) ;

SlowMA = Average( Close, SlowMALen ) ;
QuickMA = Average( Close, QuickMALen ) ;

{ 以慢速RSI交叉買賣分界線作方向引導 }
if SlowRSI crosses above RSIBuyLevel then SlowRSITrendDir = 1
else if SlowRSI crosses below RSISellLevel then SlowRSITrendDir = -1 ;

if EntryType = 1 then begin
{ 慢速RSI向上交叉買入界線,且收盤價大於慢速均線時市價作多 }
if MP <> 1 and SlowRSI crosses above RSIBuyLevel and Close > SlowMA
then Buy ( "sRSI LE" ) next bar market ;

{ 快速RSI向上交叉買入界線,且收盤價大於快速均線,且慢速RSI方向轉空時市價作多 }
if MP <> 1 and QuickRSI crosses above RSIBuyLevel and Close > QuickMA and SlowRSITrendDir = -1 then Buy( "qRSI LE" ) next bar market ;

{ 慢速RSI向下交叉賣出界線,且收盤價小於慢速均線時市價作空 }
if MP <> -1 and SlowRSI crosses below RSISellLevel and Close < SlowMA
then Sell ( "sRSI SE" ) next bar market ;

{ 快速RSI向下交叉賣出界線,且收盤價小於快速均線,且慢速RSI方向轉多時市價作空}
if MP <> -1 and QuickRSI crosses below RSISellLevel and Close < QuickMA and SlowRSITrendDir = 1 then Sell( "qRSI SE" ) next bar market ;

end;

{ 進場方式 2與上述方式雷同 ,差別在限價進場 }
if EntryType = 2 then begin

{ Long Entries }
if MP <> 1 and SlowRSI crosses above RSIBuyLevel and Close > SlowMA
then Buy ( "sRSI LE2" ) next bar at Highest(High,HighBar) stop ;

if MP <> 1 and QuickRSI crosses above RSIBuyLevel and Close > QuickMA and SlowRSITrendDir = -1 then Buy( "qRSI LE2" ) next bar at Highest(High,HighBar) stop ; ;

{ Short Entries }
if MP <> -1 and SlowRSI crosses below RSISellLevel and Close < SlowMA
then Sell ( "sRSI SE2" ) next bar at Lowest(Low,LowBar) stop ;

if MP <> -1 and QuickRSI crosses below RSISellLevel and Close < QuickMA and SlowRSITrendDir = 1 then Sell( "qRSI SE2" ) next bar at Lowest(Low,LowBar) stop ;

end;

{ 出場方式 - 對應不同進場條件搭配不同出場條件}

if ExitType = 7 then begin
{多單出場 - 慢速 RSI 向下交叉賣出界線,或是收盤價小於慢速均線平倉出場 }
if SlowRSI crosses below RSISellLevel or Close < SlowMA
then exitlong ( "sRSI LX" ) from entry ( "sRSI LE" ) next bar market ;

{多單出場 - 快速 RSI 向下交叉賣出界線,或是收盤價小於快速均線平倉出場 }

if QuickRSI crosses below RSISellLevel or Close < QuickMA
then exitlong ( "qRSI LX" ) from entry ( "qRSI LE" ) next bar market ;

{空單出場 - 慢速 RSI 向上交叉買入界線,或是收盤價大於慢速均線平倉出場 }
if SlowRSI crosses above RSIBuyLevel or Close > SlowMA
then exitshort ( "sRSI SX" ) from entry ( "sRSI SE" ) next bar market ;

{空單出場 - 快速 RSI 向上交叉買入界線,或是收盤價大於快速均線平倉出場 }
if QuickRSI crosses above RSIBuyLevel or Close > QuickMA
then exitshort ( "qRSI SX" ) from entry ( "qRSI SE" ) next bar market ;

end;

{ 以下為常用出場方式 }

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 IsBalanceDay or date = 1150224 then setExitonClose ;

台指期 30 min K 多空留倉 交易週期 2005/6/30~ 2015/6/30 交易成本 1200


結論:雖然作者以週K為策略設計作出發點,不過其以股票操作為主,在應用實測台指期的過程中,仍以 30分K週期表現較佳,而從圖表的觀察中策略元素亦可改為當慢速與快速 RSI都向上交叉買入界線時作多,向下交叉賣出界線時作空,亦不失為一個可行策略。
MagicQS191

沒有留言:

張貼留言