2014年10月21日 星期二

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

EasyTrader ArtNo 212
幣圖誌 牧大發表了一篇將讀者交易元素的想法作一深入分析的好文章Day-Trade Pattern計畫(III) 之 XYZ 當沖交易策略,我就搭個便車來作進一步測試,我們先將想法作成指標觀察,方便對原策略的進出場時機作適當調整

指標程式碼
vars:TodayHigh(high),TodayLow(low),Price1(0),Price2(0) ;

{ 0845 ~1100 之間的當日高低點記錄 }
if time <= 1100 then Begin
TodayHigh = HighD(0) ;
TodayLow = LowD(0) ;

{ 計算三分割 XYZ 的區隔線 }
Price1 = TodayHigh-(TodayHigh-TodayLow)/3 ;
Price2 = TodayLow +(TodayHigh-TodayLow)/3 ;
end;

{ 繪圖 }
Plot1(TodayHigh,"TH") ;
Plot2(Price1,"ZoneX") ;
Plot3(Price2,"ZoneY") ;
Plot4(TodayLow,"TL") ;

原文介紹的部份為符合條件時市價進場,在對進出場的K棒作觀察後,我改為符合條件下過高破低進場

台指期 當沖 測試週期 5 min K 期間 2001/1 ~ 2014/9/30 交易成本 1200
Case01 改為TodayHigh/TodayLow 突破進場


Case02 改為TodayHigh/TodayLow 突破進場 + 平盤多空濾網
{ 濾網 - 平盤上作多 , 平盤下才作空 }

if DataCompression  < 2 then 

 if  Close > OpenD(0) and OpenD(0) > CloseD(1) then Trend = 1 

     else if Close < OpenD(0) and OpenD(0) <  CloseD(1) then Trend = -1 ;

交易次數降低MDD也大幅改善 { 交易成本也是一項能否獲利的重要考慮因素 }

既然是順勢過高破低 ,我們就可以使用反向的區隔線當作停損參考 ,這是將指標線畫出來觀察的好處。當然作多時也可能用 (Price1+Price2)/2 中線作停損,放在 Price2的用意是避免開盤區間拉的不夠寬時一下子被洗盤出場。

出場規則  - 以區隔線當作多空平倉停損線 }
if MP > 0 then ExitLong next bar at Price2 stop ;
if MP < 0 then ExitShort next bar at Price1 stop ;

Case03 TodayHigh/TodayLow 突破進場 + 出場規則


Case04 TodayHigh/TodayLow 突破進場 + 平盤多空濾網 + 出場規則
測試程式碼
input:EntryType(1) ,N(27);
vars: IsBalanceDay(False),MP(0)TodayHigh(High),TodayLow(Low),Price1(0),Price2(0),BuyCond(false),SellCond(false),Trend(0) ;

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

{ 平盤多空濾網 }
if DataCompression < 2 then
if Close > OpenD(0) and OpenD(0) > CloseD(1) then Trend = 1
else if Close < OpenD(0) and OpenD(0) < CloseD(1) then Trend = -1 ;

{ 當倉位有變動 ,則取消進出場條件 ,避免隔日開盤就進場 }
if MP <> MP[1] then Begin
SellCond = false ;
BuyCond = false ;
end;

{為了要方便回測 ,開盤區間的截止點是 11:00 好 ? 還是 10:00好 ? 所以利用 CalcTime 內建函數 用法說明如下 :

CalcTime(Sess1StartTime, BarInterval * N )}
Sess1StartTime 啟始時間 交易時段的開始時間 ( 台指期為 0845 ) , 也可以直接寫 845 
BarInterval (時間週期): 圖表的時間框架 ,或是一根 K 棒的時間 , 5分K 就是 5 , 20分K 就是 20
( K棒數 ): 移動K棒數

假設在 5 分K時間框架下 CalcTime(Sess1StartTime , Barinterval * 5) 表示從 0850 開始的 5根K棒也就是 0910 

若要從收盤時間往回算(使用負號CalcTime(Sess1EndTime, -BarInterval * 5) 表示從 1345 開始往回算 5根K棒 也就是 1325 }

這樣子我們只要針對 N作最佳化調整就可得到到底計算到幾點的高低 XYZ區間比較合適

if time < Calctime(Sess1Starttime,Barinterval*N) then Begin
TodayHigh = HighD(0) ;
TodayLow = LowD(0) ;
Price1 = TodayHigh-(TodayHigh-TodayLow)/3 ;
Price2 = TodayLow +(TodayHigh-TodayLow)/3 ;

{作空條件 - 開盤在 X區 , 收盤在 Z 區}
SellCond = OpenD(0) <= TodayHigh and OpenD(0) > Price1 and CloseD(0) >= ToDayLow and CloseD(0) < Price2 ;
{作多條件  - 開盤在 Z區 , 收盤在 X 區}
BuyCond = CloseD(0) <= TodayHigh and CloseD(0) > Price1 and OpenD(0) >= ToDayLow and OpenD(0) < Price2 ;
end ;

原始策略市價進場
if EntryType = 1 then Begin
if time >= Calctime(Sess1Starttime,Barinterval*N) then Begin
if BuyConD then Buy next bar at Market ;
if SellCond then Sell next bar at Market ;
end;
end;

原始策略過高破低進場
if EntryType = 2 then Begin
if time >= Calctime(Sess1Starttime,Barinterval*N) then Begin
if BuyConD then Buy next bar at TodayHigh stop ;
if SellCond then Sell next bar at TodayLow stop ;
end;
end;

原始策略加入濾網
if EntryType = 3 then Begin
if time >= Calctime(Sess1Starttime,Barinterval*N) then Begin
if Trend > 0 and BuyConD then Buy next bar at Market ;
if Trend < 0 and SellCond then Sell next bar at Market ;
end;
end;

原始策略加入濾網+過高破低進場
if EntryType = 4 then Begin
if time >= Calctime(Sess1Starttime,Barinterval*N) then Begin
if Trend > 0 and BuyConD then Buy next bar at TodayHigh stop ;
if Trend < 0 and SellCond then Sell next bar at TodayLow stop ;
end;
end;

{ 出場規則 }
{if MP > 0 then ExitLong next bar at Price2 stop ;
if MP < 0 then ExitShort next bar at Price1 stop ;
}

SetExitOnClose ;

結論:交易策略開發過程中,若有朋友可以討論互動,會比自己獨立作戰更能快速突破。教學相長,腦力激盪永遠都是加速自己能力的不二法門之一
MagicQS128

3 則留言:

  1. 非常仔細的看了E大文章的程式邏輯,一系列文章給我非常多的啟發,尤其是進場和出場邏輯的安排方式,邏輯清晰,一定能有效提升策略開發效率。謝謝E大,感謝您不嗇提供後進學習的機會。

    回覆刪除
  2. 有努力學習一定會有很好的收穫 , 若有需要藏經閣產品 ,也可連結購買

    回覆刪除
    回覆
    1. 已經在規劃中囉,一定要找機會支持E大的 ^^

      刪除