2014年8月25日 星期一

海龜交易系統 - 進化版 [程式碼]

EasyTrader ArtNo 197
理查•鄧尼斯于1983年創立並教授13位學生海龜交易法規則。在這套規則中最要的是紀律、連續性、信心(遵守法則的信心)。完整的機械交易系統組成部份:市場、頭寸規模、入市、止損、離市、策略.期貨市場中各類交易法則形形色色,我們並不認為海龜交易法是就是獨一無二的交易法則,但值得讓我們學習的是這種寧做一個海龜的交易法則精神。是的,在系統交易中無論交易策略是哪種交易規則,能否嚴格執行下去是一個交易員最大的心理障礙,在海龜交易法教學中有這樣一段 ~
海龜交易法-艱難的決擇
對於大多數的交易員,海龜系統離市或許是海龜系統法則中唯一最難的部分。等待10日或20日新低出現通常可能意味著眼睜睜地瞅著20%、40%甚至100%的可觀利潤化為泡影。


人們具有一種想要早點離市的強烈傾向。你需要極強的紀律性才能為了繼續持有頭寸直到真正的大幅波動到來而眼看著你的利潤化為泡影。在大幅贏利的交易中,遵守紀律和堅持原則的能力是成功老道的交易員的特徵。也正是因為海龜交易系統多數的交易都為虧損交易只有嚴格執行以保證一單盈利交易能對沖掉所以的虧損交易。

海龜交易法-入市
入市是所有交易系統最重要的一個方面。 海龜們得到了兩種不同卻有關係的突破系統法則,我們稱這兩個系統為系統一和系統二。
系統一-以20日突破為基礎的偏短線系統
系統二-以50日突破為基礎的較簡單的長線系統

3.1 突破
海龜總是在日間突破發生時進行交易,而不會等到每日收盤或次日開盤。在開盤跳空的情況下,如果市場開盤超過了突破的價位,海龜一開盤就會建立頭寸。

如果上次突破已導致贏利的交易,系統一的突破入市信號就會被忽視。如果有贏利的10日離市之前,突破日之後的價格與頭寸方向相反波動了2N,那麼,這一突破就會被視為失敗的突破。

然而,如果系統一的入市突破由於以前的交易已經取得贏利而被忽略,還可以在55日突破時入市,以避免錯過主要的波動。這種55日突破被視為自動保險突破點(Failsafe Breakout point)。

如果你還沒有入市,在任何特定點位元都會有一些價位會觸發空頭入市,在另外一些不同的較高價位會觸發多頭入市。如果上次突破失敗,那麼,入市信號會更接近於現價(即,20日突破),如果上次突破成功,在這種情況下入市信號可能會遠得多,位於55日突破處。

系統二入市-只要有一個信號顯示價格超過了前55日的最高價或最低價就建立頭寸。
無論以前的突破是成功還是失敗,所有系統二的突破都會被接受。

海龜交易法-波動性(N)
2.1 波動性-N的含意
N就是TR(True Range,實際範圍)的20日指數移動平均,現在更普遍地稱之為ATR。從概念上來看,N表示單個交易日某個特定市場所造成的價格波動的平均範圍。

TR(實際範圍)=MAX(H-L,H-PDC,PDC-L)
H-當日最高價
L-當日最低價
PDC-前個交易日的收盤價

用下面的公式計算N:
N=(19×PDN+TR)/20
PDN-前個交易日的N值
TR-當日的實際範圍

海龜交易法-增倉
3.2 增加單位
海龜在突破時只建立一個單位的多頭頭寸,在建立頭寸後以1/2N(即二分之一N----譯注)的間隔增加頭寸。在達到最大許可單位數之前,這樣都是正確的。如果市場波動很快,有可能在一天之內就增加到最大4個單位。

海龜交易法-止損
海龜以頭寸風險為基礎設置止損。任何一筆交易都不能出現2%以上的風險。所以容許風險為2%的最大止損就是價格波動2N。

為了保證全部頭寸的風險最小,如果另外增加單位,前面單位的止損就提高1/2N。或者因開盤跳空而以較大的間隔設置的情況下,止損就有所不同。

海龜交易法-離市
海龜們知道,你在何時落袋為安會造成盈虧之間的不同。

海龜系統在突破時建立頭寸。大多數的突破並不會形成趨勢。這意味著海龜所做的大多數交易都會導致虧損。如果贏利的交易所掙的錢平均下來不夠彌補這些虧損的話,那麼,海龜就已經虧錢了。每個能夠贏利的交易系統都有不同的最佳離市點。

我們來看海龜系統。如果你在利潤為1N時退出贏利頭寸而在虧損為2N時退出虧損頭寸,你就需要兩倍的贏利才能彌補虧損交易所帶來的損失。

在交易系統的各個組成部分之間存在著複雜的關係。這意味著你不能只考慮贏利頭寸的正確離市,而不考慮入市、資金管理以及其他因素。

贏利頭寸的正確退出是交易最重要的方面之一,也是最不為人理解的一個方面。然而,它會造成盈虧之間的不同。

5.1 海龜的離市
系統一離市對於多頭頭寸為10日最低價,對於空頭頭寸為10日最高價。如果價格波動與頭寸背離至10日突破,頭寸中的所有單位都會退出。

系統二離市對於多頭頭寸為20日最低價,對於空頭頭寸為20日最高價。如果價格波動與頭寸背離至20日突破,頭寸中的所有單位都會退出。由此我們看出海龜交易法也不例外,只要是系統交易都有著嚴格的執行能力才能達到長期穩定盈利的結果。

參考轉貼資料來源
海龜交易法則與海龜交易系統
海龜交易系统程式碼
海龜系統原文


原始程式碼
vars: N(0),StopLoss(1),DV(0),BB(0),AccountBalance(0),DollarRisk(0),LTT(0),
Tracker(0),LastTrade(0),HBP(0),LBP(0);
{/// Turtle 20-Day Breakout Replica //////////////////////////////////////}
if marketposition = 0 then begin
BB = 0;
N = AvgTrueRange(20);
AccountBalance = 1000000;

{ 依 20根 K棒的真實區間平均值作波動性的計算 DV ,並依DV大小來控制部位數量與停損}
DV = N * BigPointValue;
{AccountBalance = InitialBalance + netprofit;}

{ 帳戶金額的百分比決定每次下單口數 }
DollarRisk = AccountBalance * 0.01;
LTT = IntPortion(DollarRisk/DV);

{ 停損值 }
StopLoss = 2 * DV * LTT;

if LastTrade = -1 then begin
{ 以唐契安通道 20根K棒 高點被突破就進場作多 }
buy LTT shares next bar highest(h,20) or higher;

{ 每增加 0.5倍的波動值 (N) 加碼一次 , 最多三次}
buy LTT shares next bar highest(h,20) + (0.5*N) or higher;
buy LTT shares next bar highest(h,20) + (1.0*N) or higher;
buy LTT shares next bar highest(h,20) + (1.5*N) or higher;

{ 以唐契安通道 20根K棒 低點被跌破就進場作空 }
Sell LTT shares next bar lowest(l,20) or lower;

{ 每增加 0.5倍的波動值 (N) 加碼一次 , 最多三次}
Sell LTT shares next bar lowest(l,20) - (0.5*N) or lower;
Sell LTT shares next bar lowest(l,20) - (1.0*N) or lower;
Sell LTT shares next bar lowest(l,20) - (1.5*N) or lower;
end;

if LastTrade = 1 then begin
buy LTT shares next bar highest(h,50) or higher;
buy LTT shares next bar highest(h,50) + (0.5*N) or higher;
buy LTT shares next bar highest(h,50) + (1.0*N) or higher;
buy LTT shares next bar highest(h,50) + (1.5*N) or higher;
Sell LTT shares next bar lowest(l,50) or lower;
Sell LTT shares next bar lowest(l,50) - (0.5*N) or lower;
Sell LTT shares next bar lowest(l,50) - (1.0*N) or lower;
Sell LTT shares next bar lowest(l,50) - (1.5*N) or lower;
end;
end;
{// PREVIOUS TRADE TRACKER}
if HBP = 0 and h > highest(h,19)[1] then begin
Tracker = 1; HBP = h; LBP = 0;
end;
if LBP = 0 and l < lowest(l,19)[1] then begin
Tracker = -1; LBP = l; HBP = 0;
end;
if Tracker = 1 then begin
if l < HBP - (2*N) then LastTrade = -1;
if h > HBP + (4*N) then LastTrade = 1;
end;
if Tracker = -1 then begin
if h > LBP + (2*N) then LastTrade = -1;
if l < LBP - (4*N) then LastTrade = 1;
end;
{// LONG 20 }
if LastTrade = -1 and marketposition = 1 then begin
BB = BB + 1;
if currentcontracts = LTT then begin
buy LTT shares next bar highest(h,20)[BB] + (0.5*N) or higher;
buy LTT shares next bar highest(h,20)[BB] + (1.0*N) or higher;
buy LTT shares next bar highest(h,20)[BB]+ (1.5*N) or higher;
end;
if currentcontracts = LTT * 2 then begin
buy LTT shares next bar highest(h,20)[BB] + (1.0*N) or higher;
buy LTT shares next bar highest(h,20)[BB] + (1.5*N) or higher;
end;
if currentcontracts = LTT * 3 then
buy LTT shares next bar highest(h,20)[BB] + (1.5*N) or higher;
end;
{// LONG 50}
if LastTrade = 1 and marketposition = 1 then begin
BB = BB + 1;
if currentcontracts = LTT then begin
buy LTT shares next bar highest(h,50)[BB] + (0.5*N) or higher;
buy LTT shares next bar highest(h,50)[BB] + (1.0*N) or higher;
buy LTT shares next bar highest(h,50)[BB]+ (1.5*N) or higher;
end;
if currentcontracts = LTT * 2 then begin
buy LTT shares next bar highest(h,50)[BB] + (1.0*N) or higher;
buy LTT shares next bar highest(h,50)[BB] + (1.5*N) or higher;
end;
if currentcontracts = LTT * 3 then
buy LTT shares next bar highest(h,50)[BB] + (1.5*N) or higher;
end;
ExitLong("out-S") next bar lowest(l,10) or lower;
{// SHORT 20 }
if LastTrade = -1 and marketposition = -1 then begin
BB = BB + 1;
if currentcontracts = LTT then begin
Sell LTT shares next bar lowest(l,20)[BB] - (0.5*N) or lower;
Sell LTT shares next bar lowest(l,20)[BB] - (1.0*N) or lower;
Sell LTT shares next bar lowest(l,20)[BB] - (1.5*N) or lower;
end;
if currentcontracts = LTT * 2 then begin
Sell LTT shares next bar lowest(l,20)[BB] - (1.0*N) or lower;
Sell LTT shares next bar lowest(l,20)[BB] - (1.5*N) or lower;
end;
if currentcontracts = LTT * 3 then
Sell LTT shares next bar lowest(l,20)[BB] - (1.5*N) or lower;
end;
{// SHORT 55 }
if LastTrade = 1 and marketposition = -1 then begin
BB = BB + 1;
if currentcontracts = LTT then begin
Sell LTT shares next bar lowest(l,50)[BB] - (0.5*N) or lower;
Sell LTT shares next bar lowest(l,50)[BB] - (1.0*N) or lower;
Sell LTT shares next bar lowest(l,50)[BB] - (1.5*N) or lower;
end;
if currentcontracts = LTT * 2 then begin
Sell LTT shares next bar lowest(l,50)[BB] - (1.0*N) or lower;
Sell LTT shares next bar lowest(l,50)[BB] - (1.5*N) or lower;
end;
if currentcontracts = LTT * 3 then
Sell LTT shares next bar lowest(l,50)[BB] - (1.5*N) or lower;
end;
ExitShort ("out-B") next bar highest(h,10) or higher;
{// STOPS}
if currentcontracts = (2 * LTT) then StopLoss = DV * 3.5 * LTT;
if currentcontracts = (3 * LTT) then StopLoss = DV * 4.5 * LTT;
if currentcontracts = (4 * LTT) then StopLoss = DV * 5.0 * LTT;
setstoploss (StopLoss);

原始策略 - 台指期 60 分K 留倉 回測週期 2004/8/2~2014/7/31 交易成本 1200


修正策略 (增加通道寬度濾網與加碼條件修正) 
- 台指期 60 分K 留倉 回測週期 2004/8/2~2014/7/31 交易成本 1200

加入結算日與變更移動停損出場方式
台指期 60 分K 留倉 回測週期 2004/8/2~2014/7/31 交易成本 1200

進化版 - 利用隨機參數調整通道回溯參考值
台指期 30 分K 留倉 回測週期 2004/8/2~2014/7/31 交易成本 1200

整體而言還是能適用於台指期應用

MagicQS098

沒有留言:

張貼留言