電子信箱 service [at] bituzi.com
幣圖誌首頁 facebook粉絲團 google plus google plus

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


幣圖誌牧大發表了一篇將讀者交易元素的想法作一深入分析的好文章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
N ( 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 ;
結論:交易策略開發過程中,若有朋友可以討論互動,會比自己獨立作戰更能快速突破。教學相長,腦力激盪永遠都是加速自己能力的不二法門之一

0 意見: