2014年6月23日 星期一

彈性指數動態平均線(VIDYA) [程式碼]

EasyTrader ArtNo 168
彈性指數動態平均線 (Chande's Variable Index Dynamic Average, VIDYA)與指數加權移動平均線 (EMA) 相似,但是它會根據價格的波動率自動調整平滑權重。
VIDYA 由 Tushar Chande 創立,並於 1992 年 3 月在《股票與商品技術分析》(Technical Analysis of Stocks & Commodities) 雜誌中提出。在第一個版本中,標準差被用作波動率指數。1995 年 10 月,Chande 對 VIDYA 進行了修改,使用新的錢德動量擺動指標 (CMO)作為波動率指數。
VIDYA 透過以下公式計算:


其中:F 是由以下公式算出的平滑因數:


是指數加權移動平均線 (EMA) 的週期數;
是錢德動量擺動指標 (CMO) 的當前絕對值;
是上一週期內的 VIDYA 值。

用途 - VIDYA 本身一般不用於交易,而是使用 VIDYA 上下 N% 的邊界(軌線)。

VIDYA 可用於識別市場趨勢:
當市價突破 VIDYA 上軌時,可能表明上升趨勢的開始。
當市價突破 VIDYA 下軌時,可能表明下降趨勢的開始。


買進和賣出信號
當價格向上及向下穿越軌線時,VIDYA 產生買進和賣出信號:
價格穿越 VIDYA 上軌時,可解讀為買進信號。
價格穿越 VIDYA 下軌時,可解讀為賣出信號。

不過本篇我們使用另一個方式來測試,礎邏輯為長短週期 Vidya 的交叉作多空進出,加上一個 MACD 作濾網確認 , 當進場條件消失則出場或其他停損利方式出場

{ Function _SS_Vidya 公式內容有一些不同}
Inputs: Length(NumericSimple), Smooth(NumericSimple);
Vars: Up(0), Dn(0), UpSum(0), DnSum(0), AbsCMO(0), SC(0);
Up=IFF(Close>Close[1], Close-Close[1],0);
Dn=IFF(Close<Close[1],AbsValue(Close-Close[1]),0) ;
UpSum=Summation(Up,Length);
DnSum=Summation(Dn,Length);

if(UpSum+DnSum) <> 0 then AbsCMO=AbsValue((UpSum-DnSum)/(UpSum+DnSum));
if (Smooth+1) <> 0 then SC= (2/(Smooth+1)) * AbsCMO;
If Currentbar=Length then _SS_Vidya=Close;
If Currentbar>Length then _SS_Vidya=(SC*Close)+((1-SC)*_SS_Vidya[1]);

策略程式碼
input:EntryType(1),ExitType(0);
Vars:FastLen(12),SlowLen(26),AvgLen(9) ;
vars:Ref_L(14),Trend_L(3.6),Ref_S(30),Trend_S(3.7) ;
vars: BarNo(10),NBarL(29),NBarS(31),TradeProfit(0.051),TradeStopLoss(0.053) ;
Vars: ATRs_L(9.4),ATRs_S(2.3);
vars: IsBalanceDay(False),MP(0),PF(0),PL(0);

MP = MarketPosition ;

if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;

PF = AvgPrice*TradeProfit ;
PL = AvgPrice*TradeStopLoss ;

Value1 = Macd(Close,FastLen,SlowLen)-Xaverage(Macd(Close,FastLen,SlowLen),AvgLen) ;

{ 均線向上交叉進場 + 濾網確認 }
if _SS_Vidya(Ref_L,Trend_L) Cross over _SS_Vidya(Ref_S,Trend_s) and Value1 > 0 then 
   Buy next bar at Market ;

{ 進場條件消失則出場 }
if _SS_Vidya(Ref_L,Trend_L) Cross under _SS_Vidya(Ref_S,Trend_s) then
   Exitlong next bar at Market ;

{ 均線向下交叉進場 + 濾網確認 }
if _SS_Vidya(Ref_L,Trend_L) Cross under _SS_Vidya(Ref_S,Trend_s) and Value1 < 0 then 
   Sell next bar at Market ;

{ 進場條件消失則出場 }
if _SS_Vidya(Ref_L,Trend_L) Cross over _SS_Vidya(Ref_S,Trend_s) then 
   ExitShort next bar at Market ;

{ 其它出場方式 }

if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

if ExitType = 2 then Begin
   SetStopLoss(PL * BigPointValue) ;
   SetProfitTarget(PF * BigPointValue) ;
end;

if ExitType = 3 then Begin
   if MP > 0 and BarsSinceEntry = NBarL then ExitLong next bar at Market ;
   if MP < 0 and BarsSinceEntry = NBarS then ExitShort next bar at Market ;
end;

if ExitType = 4 then Begin
   SetStopLoss(PL * BigPointValue) ;
   SetProfitTarget(PF * BigPointValue) ;
   if MP > 0 and BarsSinceEntry = NBarL then Sell {ExitLong} next bar at Market ;
   if MP < 0 and BarsSinceEntry = NBarS then Buy {ExitShort} next bar at Market ;
end;

if ExitType = 5 then Begin

  {Inputs: ATRs_L(3);}
  Variables: PosHigh(0), ATRVal_L(0);
   ATRVal_L = AvgTrueRange(10) * ATRs_L;

   If BarsSinceEntry = 0 Then PosHigh = High;
   If MarketPosition = 1 Then Begin
      If High > PosHigh Then PosHigh = High;
      ExitLong ("ATR") Next Bar at PosHigh - ATRVal_L Stop;
   End else ExitLong ("ATR eb") Next bar at High - ATRVal_L Stop;
  {Inputs: ATRs_S(3);}
   Variables: PosLow(0), ATRVal_S(0);
   ATRVal_S = AvgTrueRange(10) * ATRs_S;

   If BarsSinceEntry = 0 Then PosLow = Low;

   If MarketPosition = -1 Then Begin
      If Low < PosLow Then PosLow = Low;
       ExitShort ("ATR_1") Next Bar at PosLow + ATRVal_S Stop;
    End else ExitShort ("ATR_1 eb") Next bar at Low + ATRVal_S Stop;
end;

if IsBalanceDay then setExitonClose ;

台指期 日K 留倉 2004/5/31 ~ 2014/5/30 交易成本 1200



台指期 60分K 留倉 2004/5/31 ~ 2014/5/30 交易成本 1200


MagicQS089

沒有留言:

張貼留言