EasyTrader ArtNo 160
這是 Wen 大的網站提供的Emini S&P500 當沖策略測試,從內容來看是作為類似開盤區間突破(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年以後,績效就停滯橫盤了
若是改成波段留倉策略的結果呢 ?
近一年的表現算是穩定成長喔
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年以後,績效就停滯橫盤了
若是改成波段留倉策略的結果呢 ?
近一年的表現算是穩定成長喔
MagicQS077
請問為什麼我用在MC上卻無法執行呢??
回覆刪除有出現其他信息嗎
回覆刪除