2014年4月9日 星期三

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

EasyTrader ArtNo 135
在網路上看到一篇談逆勢策略的文章 , 內容簡述如下
在所有交易中最古老的格言之一是"趨勢是你的朋友"。這已成為古老的格言,主要是由於它是真實的事實。當一個可交易的股票或商品的主要價格運動方向變成一個有力趨勢時,只要這個趨勢持續存在,順勢而為總是比逆勢而行的獲利要好的多.

然而人的天性總是想買在最低點,賣在最高點. 這樣做在金融市場中的唯一方法是”買在底部,賣在頂部”的交易,顧名思義的定義就是逆勢交易



每個交易日中,那些企圖順勢買賣的交易者總和那些企圖接近低點買入和賣在高點附近之間交易者的戰爭持續上演著。兩種類型的交易者有非常令人信服的論據論證為什麼他們的做法是比對方優越。然而,有趣的是,長遠來說,最好的方法之一可能只是涉及融合這兩種看似不同方法。通常,簡單的解決方案是最好的一個 - 結合趨勢追隨和逆勢技術:
  • 找出一個能定義長期趨勢的好方式
  • 找出一個能在長期趨勢中定義並確認回落( pullback)的好方式
儘管尋找最佳的方法可能需要一些時間和精力,但是可以使用一些非常簡單的技巧來突顯這一潛在的有用的概念

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




依據所述內容轉成程式碼如下
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]

0 留言:

張貼留言

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

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