2014年7月30日 星期三

交易訊號之直覺操作 - 豬陽變色 [程式碼]

EasyTrader ArtNo 186
一個多頭趨勢發展中,K線收紅代表順向的力量,而K線收黑代表賣壓出籠,那麼趨勢若要維持原方向,第一個動作便是要突破黑K線的最高點,即粉碎空方的防線,也代表一個多頭的買進訊號 ;相反的 ,如果行情是空頭趨勢,收黑K線是常態,代表順向的慣性運動,而出現紅K線,代表多方試圖建立底部防禦陣線,若空頭趨勢仍要繼續發展,它必需要向下摜破紅K線的最低點,讓多方買盤棄守停損,因此這個破低的位置,也就是作空的訊號;從黑K線突破轉為紅K線,或紅K線跌破轉為黑K線,我們稱之為豬"陽"變色.
摘錄 交易訊號之直覺操作-豬陽變色篇



留倉交易邏輯建立[ 葛蘭碧均線法則應用 ]

買方環境
1.均線上揚,價格自高點回落到觸及均線後,馬上彈升展開波段行情
2.均線仍在上揚中,價格自高點回落到均線以下,在均線上揚助漲下,價格不久後又站上均線之上,仍有波段行情可期

賣方環境
1.均線下跌,價格出現反彈回漲,觸及均線馬上跌破時
2.均線下跌,價格出現反彈超過均線,因為均線向下,具有助跌效果隨後價格重新跌破至均線,是為賣點訊號

[圖一 ]台指期 日K 留倉 交易週期 2004/6/30 ~ 2014/6/30 交易成本 1200

測試程式碼
input:EntryType(0),ExitType(0) ,BaseLen(10);
inputs: NBarL(2),NBarS(2),TradeProfit(0.05),TradeStopLoss(0.05),ATRs_L(3),ATRs_S(3);
vars: IsBalanceDay(False),MP(0),PF(0),PL(0);
vars:FastTrendL(false),MEdTrendL(false),SlowTrendL(false),FastTrendS(false),MEdTrendS(false),SlowTrendS(false),HighPoint(0),LowPoint(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 ;

[圖一 ]計算方式
{ 計算買方環境 , 利用 BaseLen 的倍數區分短中長期均線}
FastTrendL = XAverage(AvgPrice,BaseLen) > XAverage(AvgPrice,BaseLen)[1] ;
MedTrendL = XAverage(AvgPrice,BaseLen*2) > XAverage(AvgPrice,BaseLen*2)[1] ;
SlowTrendL = XAverage(AvgPrice,BaseLen*6) > XAverage(AvgPrice,BaseLen*6)[1] ;
{ 計算賣方環境  , 利用 BaseLen 的倍數區分短中長期均線}
FastTrendS = XAverage(AvgPrice,BaseLen) < XAverage(AvgPrice,BaseLen)[1] ;
MedTrendS = XAverage(AvgPrice,BaseLen*2) < XAverage(AvgPrice,BaseLen*2)[1] ;
SlowTrendS = XAverage(AvgPrice,BaseLen*6) < XAverage(AvgPrice,BaseLen*6)[1] ;

{ 為什麼要使用 BaseLen , BaseLen*2 , BaseLen*6 ? 想法來自於 10日線 ,月線(20), 季線(60) 彼此的對應關係 ,同時作最佳化時只要變動一個參數即可 }

{ 收紅記錄低點 ,收黑記錄高點 作為跌破賣/突破買進場點 }
if Close <= Open then HighPoint = High ;
if Close >= Open then LowPoint = Low ;

if EntryType = 1 then Begin
{ 當短期均線向上,且3根K棒內發生過收黑,則突破收黑K棒高點時買進作多 }
if FastTrendL and MRO(Close <= Open,3,1) > -1 then Buy next bar at HighPoint stop ;

{ 當短期均線向下,且3根K棒內發生過收紅,則跌破收紅K棒低點時賣出作空 }
if FastTrendS and MRO(Close >= Open,3,1) > -1 then Sell next bar at LowPoint stop ;
end;

這裡使用到 MRO 函數 , 是用來檢查過去幾根K棒內,是否發生過的事件
MRO( 條件描述 , 回溯K棒數 , 最近N次) , 若沒發生傳回 -1

{ EntryType 2 ~3 只是不同的均線長度 }
if EntryType = 2 then Begin
if MedTrendL and MRO(Close <= Open,3,1) > -1 then Buy next bar at HighPoint stop ;
if MedTrendS and MRO(Close >= Open,3,1) > -1 then Sell next bar at LowPoint stop ;
end;

if EntryType = 3 then Begin
if SlowTrendL and MRO(Close <= Open,3,1) > -1 then Buy next bar at HighPoint stop ;
if SlowTrendS and MRO(Close >= Open,3,1) > -1 then Sell next bar at LowPoint stop ;
end;

{ 另外依據書中介紹的價格與均線碰撞的原理 ,可以變化為如下的進場方式 }
[圖二 ]計算方式
{短期均線向上 ,收盤價回落後向上交叉短期均線 }
FastTrendL = XAverage(AvgPrice,BaseLen) > XAverage(AvgPrice,BaseLen)[1] and Close Cross over XAverage(AvgPrice,BaseLen) ;
{中期均線向上 ,收盤價回落後向上交叉中期均線 }
MedTrendL = XAverage(AvgPrice,BaseLen*2) > XAverage(AvgPrice,BaseLen*2)[1]  and Close Cross over XAverage(AvgPrice,BaseLen*2);
{長期均線向上 ,收盤價回落後向上交叉長期均線 }
SlowTrendL = XAverage(AvgPrice,BaseLen*6) > XAverage(AvgPrice,BaseLen*6)[1]  and Close Cross over XAverage(AvgPrice,BaseLen*6);

{短期均線向下 ,收盤價反彈後向下交叉短期均線 }
FastTrendS = XAverage(AvgPrice,BaseLen) < XAverage(AvgPrice,BaseLen)[1]  and Close Cross under XAverage(AvgPrice,BaseLen);
{中期均線向下 ,收盤價反彈後向下交叉中期均線 }
MedTrendS = XAverage(AvgPrice,BaseLen*2) < XAverage(AvgPrice,BaseLen*2)[1]  and Close Cross under XAverage(AvgPrice,BaseLen*2);
{長期均線向下 ,收盤價反彈後向下交叉長期均線 }
SlowTrendS = XAverage(AvgPrice,BaseLen*6) < XAverage(AvgPrice,BaseLen*6)[1]  and Close Cross under XAverage(AvgPrice,BaseLen*6);


[圖二 ]進場方式
if EntryType = 4 then Begin
{ 短/中/長期任一情況發生回落後向上交叉均線,且突破最近一次收黑K棒的高點,買入作多}
  if  (FastTrendL or SlowTrendL or MedTrendL) and MRO(Close <= Open,3,1) > -1 then Buy next bar at HighPoint stop ;
{ 短/中/長期任一情況發生反彈後向下交叉均線,且跌破最近一次收紅K棒的低點,賣出作空}
  if  (FastTrendS or SlowTrendS or MedTrendS) and MRO(Close >= Open,3,1) > -1 then Sell next bar at LowPoint stop ;
end;

{不同的出場方式 }
{只有停損}
if ExitType = 1 then SetStopLoss(PL * BigPointValue) ;

{停損+停利}
if ExitType = 2 then Begin
SetStopLoss(PL * BigPointValue) ;
setProfitTarget(PF * BigPointValue) ;
end;

{進場後 Nbar 出場 }
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;

{進場後 Nbar 反手單 + 停損+停利}
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;

{ ATR 移動出場 }
if ExitType = 5 then Begin
{*******************************************************************
Description : ATR Trailing Stop Long Exit
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}
{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;

{*******************************************************************
Description : ATR Trailing Stop Short Exit
Provided By : Omega Research, Inc. (c) Copyright 1999
********************************************************************}
{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 ;
[圖二 ]台指期 60 分K 留倉 交易週期 2004/6/30 ~ 2014/6/30 交易成本 1200

交易次數減少 50% , MDD 下降 50% 績效仍舊維持 ,是個不錯的策略元素
MagicQS095

沒有留言:

張貼留言