指標程式碼
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 意見:
張貼留言