2014年6月25日 星期三

●HMA移動平均線交易策略(續) [程式碼]

EasyTrader ArtNo 169
近期曾介紹隨機相對強弱指標 ,其中RSI的修改版是使用 SlowD替換,本篇介紹一個利用 HMA均線的RSI函數 - RSI(HMA( HMAPrice, HMALength ),RSILength) ,這是一個在 TS論壇 2010年所討論的主題,使用HMA 搭配 RSI 作策略,不過原作只有多單進場範例,我另外依樣畫葫蘆加上反向空單進場


多單進場邏輯
  1. 四日HMA 均線轉折向上
  2. 收盤價在長期均線 MA(50) 之上
  3. RSI (HMA,N)小於 50
  4. 收盤價大於 59日前收盤價
多單出場
  1. RSI (HMA,N)大於 90
  2. 低於進場價 5% 停損出場
  3. 高於進場價 15% 停利出場

空單進場邏輯
  1. 四日HMA 均線轉折向下
  2. 收盤價在長期均線 MA(50) 之下
  3. RSI (HMA,N)大於 50
  4. 收盤價小於 59日前收盤價
空單出場
  1. RSI (HMA,N)小於 10
  2. 低於進場價 5% 停損出場
  3. 高於進場價 15% 停利出場


策略程式碼 (藍字部份為另外自行加入的空單邏輯)
inputs: RSILength(9), HMALength(9), HMAPrice(Close), ExitPercent(15), StopLossPercent(5) ;
vars: EP(0), MP(0), HullMA(0), HMAForTurnUp(0), RSIofHMA(0), HMATurnUp( false ),
HMATurnDn( false), ExitTarget(0), StopLoss(0),IsBalanceDay(False) ;

EP = EntryPrice ;
MP = MarketPosition ;

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

HullMA = HMA( HMAPrice, HMALength ) ;
HMAForTurnUp = HMA( HMAPrice, 4 ) ;
RSIofHMA = RSI( HullMA, RSILength ) ;

{ HMA 轉折向上 }
HMATurnUp = CurrentBar > 2 and HMAForTurnUp > HMAForTurnUp[1]
and HMAForTurnUp[1] <= HMAForTurnUp[2] ;

{ HMA 轉折向下 }
HMATurnDn = CurrentBar > 2 and HMAForTurnUp < HMAForTurnUp[1]
and HMAForTurnUp[1] >= HMAForTurnUp[2] ;


{ 停損利計算 }
ExitTarget = Iff( MP = 1, EP * ( 1 + ExitPercent * 0.01 ), Close * ( 1 + ExitPercent * 0.01 ) ) ;
StopLoss = Iff( MP = 1, EP * ( 1 - StopLossPercent * 0.01 ), Close * ( 1 - StopLossPercent * 0.01 ) ) ;

{ Entry Long }
If Close > Average( Close, 50 ) and RSIofHMA <=50 and Close > Close[59] and
HMATurnUp and MP = 0 then Buy next bar market ;

{ EXITS }
{ RSI exit delayed for RSI calculation convergence }
If CurrentBar >= 10 * RSILength and RSIofHMA >= 90 then
ExitLong {Sell} ( "RSI LX" ) next bar market ;

{實測 Mark掉比較好
ExitLong {Sell} ( "Target LX" ) next bar at ExitTarget Limit ; { Profit Target }
ExitLong {Sell} ( "StopLoss LX" ) next bar at StopLoss Stop ; { Stop Loss }
}

{ Entry Short}
If Close < Average( Close, 50 ) and RSIofHMA > =50 and Close < Close[59] and
HMATurnDn and MP = 0 then Sell next bar market ;

{ EXITS }
{ RSI exit delayed for RSI calculation convergence }
If CurrentBar >= 10 * RSILength and RSIofHMA <= 10 then
ExitShort {BuytoCover} ( "RSI SX" ) next bar market ;


{ 實測 Mark掉比較好
ExitShort {BuytoCover} ( "Target SX" ) next bar at ExitTarget Limit ; { Profit Target }
ExitShort {BuytoCover} ( "StopLoss SX" ) next bar at StopLoss Stop ; { Stop Loss }
}


if IsBalanceDay then setExitonClose ;
台指期 日K 留倉 2004/5/31 ~ 2014/5/30 交易成本 1200



相當不錯的勝率,如果改用隨機參數搭配常用測試模組測試呢 ?

應用好的方式,能加速找到好的變數範圍 ~~

4 留言:

匿名 提到...

請問站長~為何我編譯下面這一段會出現問題呢??
'Next Bar' can only be applied to 'Open', 'Date', 'Time' or 'Time_s'
errLine 33, errColumn 1, errLineEnd 33, errColumnEnd 1
感謝!!

{ EXITS }
{ RSI exit delayed for RSI calculation convergence }
If CurrentBar >= 10 * RSILength and RSIofHMA >= 90 then
ExitLong {Sell} ( "RSI LX" ) next bar market ;

EasyTrader 提到...

如果您使用MC,需將買賣指令作修改 sell -> sellshort, exitlong-> sell ,exitshort-> buytocover

匿名 提到...

感謝站長的回答~可再請問一問題...
HullMA = HMA( HMAPrice, HMALength ) ;
HMAForTurnUp = HMA( HMAPrice, 4 ) ;
RSIofHMA = RSI( HullMA, RSILength ) ;

為何MC編譯也有問題?
------ 編譯時產生錯誤: ------
Unknown Function
errLine 10, errColumn 10, errLineEnd 10, errColumnEnd 13
編譯錯誤: (函數)

EasyTrader 提到...

要先依前一篇文章建立一自定義函數 HMA ,就可以使用

張貼留言

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

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