2014年6月3日 星期二

●國外當沖策略的台指期應用 [程式碼]

EasyTrader ArtNo 160
延續前篇,進行當沖策略測試。
從內容來看是作為類似開盤區間突破(Open Range Breakout )的改良,並加上動量濾網 ;就如同以往 - 直接套用國外策略通常在台指期應用上都還需要調整 ~ 為了作測試研究,我將內容作了一些修改 ,並作說明:


首先我將程式碼內的突破價格轉成指標 如下圖
inputs: AvgLenL(3),AvgLenS(3),Ratio(0.5);
Vars: LowOffsetL(0),HighOffsetL(0),MaxOffsetAvgL(0),MaxOffsetL(0),SumOffsetL(0) ;
Vars: LowOffsetS(0),HighOffsetS(0),MaxOffsetAvgS(0),MaxOffsetS(0),SumOffsetS(0) ;

if Date <> Date[1] then begin
SumOffsetL = 0 ;
For Value3 = 1 to AvgLenL Begin
LowOffsetL = AbsValue(CloseD(Value3)-LowD(Value3)) ;
HighOffsetL = AbsValue(CloseD(Value3)-HighD(Value3)) ;
MaxOffsetL = MaxList(HighOffsetL,LowOffsetL) ;
SumOffsetL = SumOffsetL + MaxOffsetL ;
end;

if AvgLenL <> 0 then MaxOffsetAvgL = SumOffsetL/AvgLenL*Ratio ;
SumOffsetS = 0 ;
For Value4 = 1 to AvgLenS Begin
LowOffsetS = AbsValue(CloseD(Value4)-LowD(Value4)) ;
HighOffsetS = AbsValue(CloseD(Value4)-HighD(Value4)) ;
MaxOffsetS = MaxList(HighOffsetS,LowOffsetS) ;
SumOffsetS = SumOffsetS + MaxOffsetS ;
end;
if AvgLenS <> 0 then MaxOffsetAvgS = SumOffsetS/AvgLenS*Ratio ;
end ;

Plot1(OpenD(0)+MaxOffsetAvgL,"OpenSetL") ;
Plot2(CloseD(1)+MaxOffsetAvgL,"CloseSetL") ;
Plot3(OpenD(0)-MaxOffsetAvgS,"OpenSetS") ;
Plot4(CloseD(1)-MaxOffsetAvgS,"CloseSetS") ;


接下來依據可能的測試需要加入參數,作成如下程式碼
input: TimeEntry(900),TimeExit(1310),LookBackL(25),AvgLenL(1),RatioL(2.08),LookBackS(46);
input: ,AvgLenS(2),RatioS(2.09),HighRatio(0.02),LowRatio(0) ,JudgeL(1),JudgeS(1) ;
Vars: MomtL(0),LowOffsetL(0),HighOffsetL(0),MaxOffsetAvgL(0),MaxOffsetL(0),LookBackSumL(0),LookBackAvgL(0),SumOffsetL(0) ;
Vars: MomtS(0),LowOffsetS(0),HighOffsetS(0),MaxOffsetAvgS(0),MaxOffsetS(0),LookBackSumS(0),LookBackAvgS(0),SumOffsetS(0) ;

{ 原作者為使用 data2 來取得日K資料, 這裡我改變方式來取得相同的資料 }
{當交易日變換時}
if Date <> Date[1] then begin

{計算買方環境回溯天數的收盤價的加總 }
LookBackSumL = 0 ;
For value1 = 1 to LookBackL Begin
LookBackSumL = LookBackSumL + CloseD(value1) ;
end ;

{計算平均值 }
if LookBackL <> 0 then LookBackAvgL = LookBackSumL/LookBackL ;
{計算當作多方濾網的動量}
MomtL = CloseD(1)- LookBackAvgL ;


{ 原作者只作多單 ,我加上相反的邏輯來作空方進場設定 }
{計算賣方環境回溯天數的收盤價的加總 }
LookBackSumS = 0 ;
For value2 = 1 to LookBackS Begin
LookBackSumS = LookBackSumS + CloseD(value2) ;
end ;

{計算平均值 }
if LookBackS <> 0 then LookBackAvgS = LookBackSumS/LookBackS ;
{計算當作空方濾網的動量}
MomtS = CloseD(1)- LookBackAvgS ;


{計算多方進場的突破參考價}
SumOffsetL = 0 ;
{ 計算多方 N天最大日偏移量加總 }
For Value3 = 1 to AvgLenL Begin
LowOffsetL = AbsValue(CloseD(Value3)-LowD(Value3)) ;
HighOffsetL = AbsValue(CloseD(Value3)-HighD(Value3)) ;
MaxOffsetL = MaxList(HighOffsetL,LowOffsetL) ;
SumOffsetL = SumOffsetL + MaxOffsetL ;
end;

{ 計算 N天最大日偏移量平均值}
if AvgLenL <> 0 then MaxOffsetAvgL = SumOffsetL/AvgLenL*JudgeL ;


{計算空方進場的跌破參考價}
SumOffsetS = 0 ;

{ 計算空方 N天最大日偏移量加總 }
For Value4 = 1 to AvgLenS Begin
LowOffsetS = AbsValue(CloseD(Value4)-LowD(Value4)) ;
HighOffsetS = AbsValue(CloseD(Value4)-HighD(Value4)) ;
MaxOffsetS = MaxList(HighOffsetS,LowOffsetS) ;
SumOffsetS = SumOffsetS + MaxOffsetS ;
end;

{ 計算 N天最大日偏移量平均值}
if AvgLenS <> 0 then MaxOffsetAvgS = SumOffsetS/AvgLenS*JudgeS ;

end ;

{ 加上時間濾網 }
if time > TimeEntry and time < TimeExit then Begin

{當動量為負值 [回落下降] 時,再突破進場 ,可使用日開盤價或前日收盤價當基準}
if MomtL < -LookBackAvgL*LowRatio and EntriesToday(date) <= 1 then
Buy ("LE") next bar at CloseD(1)+ MaxOffsetAvgL stop ;

{當動量為正值 [反彈上升] 時,等跌破進場 ,可使用日開盤價或前日收盤價當基準 }
if MomtS > LookBackAvgS*HighRatio and EntriesToday(date) <= 1 then
Sell ("SE") next bar at OpenD(0)- MaxOffsetAvgS stop ;
end;

{ 定時出場 }
if time = ExitTime then ExitLong next bar at Market ;
if time = ExitTime then ExitShort next bar at Market ;

{ 固定停損 }
if RatioL <> 0 then Value5 = MaxOffsetAvgL/RatioL ;
if MarketPosition > 0 then ExitLong next bar at EntryPrice-Value5 Stop ;
if RatioS <> 0 then Value6 = MaxOffsetAvgS/RatioS ;
if MarketPosition < 0 then ExitLong next bar at EntryPrice+Value6 Stop ;

{收盤出場 }
SetExitonClose ;
台指期 日內交易 回測週期 2004/5/25 ~ 2014/5/23 交易成本 1200

從報表來看 ,同樣是在 2011年以後,績效就停滯橫盤了
若是改成波段留倉策略的結果呢 ?

近一年的表現算是穩定成長喔

0 留言:

張貼留言

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

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