2014年4月9日 星期三

趨勢中的逆勢進場[程式碼]

EasyTrader ArtNo 135
在網路上看到一篇談逆勢策略的文 , 內容簡述如下

在所有交易中最古老的格言之一是"趨勢是你的朋友"。這已成為古老的格言,主要是由於它是真實的事實。當一個可交易的股票或商品的主要價格運動方向變成一個有力趨勢時,只要這個趨勢持續存在,順勢而為總是比逆勢而行的獲利要好的多.

然而人的天性總是想買在最低點,賣在最高點. 這樣做在金融市場中的唯一方法是”買在底部,賣在頂部”的交易,顧名思義的定義就是逆勢交易
每個交易日中,那些企圖順勢買賣的交易者總和那些企圖接近低點買入和賣在高點附近之間交易者的戰爭持續上演著。兩種類型的交易者有非常令人信服的論據論證為什麼他們的做法是比對方優越。然而,有趣的是,長遠來說,最好的方法之一可能只是涉及融合這兩種看似不同方法。通常,簡單的解決方案是最好的一個 - 結合趨勢追隨和逆勢技術:
找出一個能定義長期趨勢的好方式
找出一個能在長期趨勢中定義並確認回落( pullback)的好方式

儘管尋找最佳的方法可能需要一些時間和精力,但是可以使用一些非常簡單的技巧來突顯這一潛在的有用的概念

順勢與逆勢的結合步驟

定義長期趨勢 : 短期(10日)/中期(30日)/長期(200日)均線多頭排列為上升趨勢 ,反之空頭排列為下降趨勢
加入一個簡單的擺盪指標 三日 / 十日均線的差值
找到逆勢進場位置 : 今日擺盪指標值大於前一日且前二日擺盪指標值大於前一日擺盪指標值,且前一日指標為負值






依據所述內容轉成程式碼如下
inputs:ExitType(1),TradeProfit(0.05),TradeStopLoss(0.03),NBarL(2),NBarS(2);
inputs:FastLen(3),SlowLen(10),ShortLen(10),MidRatio(3),LongRatio(20);

vars: LastTradeDay(False),MP(0),PF(0),PL(0);
vars:CTosc(0),MidLen(0),LongLen(0),ShortAvg(0),MidAvg(0),LongAvg(0),UpReverse(false),DnReverse(false) ;

MP = MarketPosition ;

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

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

{以短期 NBar 作基礎 ,作比例放大,轉為中期/長期 NBar 方便最佳化 }
MidLen = IntPortion(ShortLen * MidRatio)+1 ;
LongLen= IntPortion(MidLen * LongRatio)+1 ;

ShortAvg = Average(Close, ShortLen) ;
MidAvg = Average(Close, MidLen) ;
LongAvg= Average(Close, LongLen) ;

{計算兩均線間擺盪指標}
CTosc = Average(Close,FastLen) - Average(Close,SlowLen) ;

{進場邏輯 - 上漲拉回與下跌反彈 }
UpReverse = CTosc > CTosc[1] and Ctosc[2] > CTosc[1] and CTosc < 0 ;
DnReverse = CTosc < CTosc[1] and Ctosc[2] < CTosc[1] and CTosc > 0 ;

if LastTradeDay = false then Begin

{ 多頭排列與拉回 }

   if ShortAvg > MidAvg and MidAvg > LongAvg and Close > LongAvg then
   if UpReverse then Buy next bar at Market ;

{空頭排列與反彈}
  if ShortAvg < MidAvg and MidAvg < LongAvg and Close < LongAvg then
  if DnReverse then Sell next bar at Market ;

end ;

{一些不同的出場方式 }
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 ExitType = 6 then Begin
   inputs: RSILen_LX(2),RSILen_SX(2),UPBand(65),DnBand(35) ;
   if MP > 0 and RSI(Close,RSILen_LX) > UpBand then ExitLong next bar at Market ;
   if MP < 0 and RSI(Close,RSILen_SX) < DnBand then ExitShort next bar at Market ;
end;

if LastTradeDay then setExitonClose ;

[台指期 30分K 留倉 2004/3/31~2014/3/31 交易成本 1200]




加入如意多空網



MagicQS056

沒有留言:

張貼留言