2023年5月20日 星期六

台指期全時段交易回測篇 [14]

EasyTrader TestNo 014

參考文章 日內動量指標 (Intraday Momentum Index)

// Public Variable
vars:MP(0),PF(0),PL(0),DayLast(1345),NightLast(0500),BuyPrice(0),ShortPrice(0),BasePF(150),BasePL(100),FilterA(0),FilterB(0) ;
vars:BarPass(5),HLRange(0),WinPoint(0),HBarPos(0),LBarPos(0),ExitH(0),ExitL(0),TimeOK(false),EntryExitCond(false),SelectNo(0) ;

//****************** Basic Setup ****************************************
MP = MarketPosition ;
if MP <> 0 then Begin
   PF = EntryPrice*TradeProfit ;
   PL = EntryPrice*TradeStopLoss ;
end else begin
   PF = AvgPrice*TradeProfit ;
   PL = AvgPrice*TradeStopLoss ;
end ;

// 依據目前指數來設定最大停利與停損點數
if Close > 10000 then begin
   BasePF = BasePF+IntPortion((Close-10000)/1000)*30 ;
   BasePF = MinList(BasePF,450) ;
   BasePL = BasePL+IntPortion((Close-10000)/1000)*15 ;
   BasePL = MinList(BasePL,225) ;
end ;

PF = MinList(PF,BasePF) ;
PL = MinList(PL,BasePL)*iff(CurrentContracts=1,1,0.67) ;

// ************ High/Low data *****************
BarPass = MaxList(HBar,LBar) ;

// ************ for week High/Low box *****************
Vars:WH(0),WL(0);
WH = 近週高點;
WL = 近週低點 ;

// ************ for Day High/Low box *****************
Vars:DayLong(5),DayShort(5),DH(0),DL(0),HLDay(0),DCount(0) ;
DH = 近日高點;
DL = 近日低點 ;

if BarNumber = 1 then begin
   Buy this bar on Close ;
   Sell this bar on Close ;
end ;

// ************* Time Set Up *************
TimeOK = ((time >= 1000 and time <= 2100)) or (time >= 0300 and time <= 0500 ) ;

//***************** BuyPrice & ShortPrice Setup *****************
BuyPrice = DH-Range ;
ShortPrice = WL ;

// ********** Main Strategy *********
vars:CandleBarNo(0),CandleHL(0),SumBar(0),SumIMI(0),IMI(0),IMIPlus(0),Strength(0);

CandleBarNo = MaxList(IntPortion(BarPass*1.6),25) ;

//計算區間平均動量
SumBar = Summation(AbsValue(Close-Open),CandleBarNo) ;
if SumBar <> 0 then IMI = (Summation(iff(Close > Open ,Close-Open,0),CandleBarNo)/SumBar)*100 ;

//計算區間上漲動量
SumIMI = Summation(AbsValue(IMI-50),CandleBarNo) ;
IMIPlus = Summation(iff((IMI-50)>0,(IMI-50),0),CandleBarNo) ;
if SumIMI <> 0 then Strength = IMIPlus/SumIMI * 100 ;

   if TimeOK then begin

//動量強度大於50 且收盤價突破特定價格 進場做多
      if MP <> 1 and Strength > MaxList(HighBand*4,50) and Close < BuyPrice then 
         Buy ("LE_IMI_2T") next bar at BuyPrice stop ;

//動量強度小於50 且收盤價跌破特定價格 進場做空
      if MP <> -1 and Strength < MinList(LowBand*4,50) and Close > ShortPrice then 
         SellShort ("SE_IMI_2T") next bar at ShortPrice stop ;
   end ;


//基本停利+移動停損出場
// ************* Base Exit *************
if MP > 0 then Sell ("PL1_"+NumtoStr(PL,0)) next bar at HighSinceEntry-PL stop ;
if MP > 0 then Sell ("PF1_"+NumtoStr(PF,0)) next bar at EntryPrice+PF limit ;
if MP < 0 then BuytoCover ("PL2_"+NumtoStr(PL,0)) next bar at LowSinceEntry+PL stop ;
if MP < 0 then BuytoCover ("PF2_"+NumtoStr(PF,0)) next bar at EntryPrice-PF limit ;

//進場後部位虧損大於預期則反手單進場
   if MP > 0 and (BarsSinceEntry <= 300/Barinterval and maxpositionloss/currentcontracts < -20000)
      then Sellshort ("WrongEntryL8") next bar at Close stop ;


// ************* rev N Day trade Exit *************
//收盤價自近日高點回落一段距離 再次突破該價格 反手做多
   if MP < 0 and Close < DH-(HLday*FracA*0.1) then 
      buy ("rLX_DTrade1") next bar at DH-(HLday*FracA*0.1)+Range Stop ;

//收盤價自近日低點反彈一段距離 再次跌破該價格 反手做空
   if MP > 0 and Close > DL+(HLday*FracB*0.1) then 
      sellshort ("rSX_DTrade1") next bar at DL+(HLday*FracB*0.1)-Range Stop ;

//結算日出場
if _IsSettlementDay and time >= CalcTime(1300,-1*BarInterVal) and Time <= 1330 then begin
   if MP > 0 then Sell ("LX_Bal") next bar at market ;
   if MP < 0 then BuyToCover ("SX_Bal") next bar at market ;
end;

台指期  留倉 交易週期 2018/1/1 ~ 2022/12/31 交易成本 1200






沒有留言:

張貼留言