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


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

4 留言:

匿名 提到...

哈哈...H-當日最高價; L-當日最低價,當日未收市那知最低/高價?

sbluo 提到...

這個程式碼不能直接使用吧?變數 LastTrade 只有定義而沒有運算,不知版主結果是如何得出?我預設版主佛心來著,用上面的原始碼直接複製貼上就可使用。

另外發現二個小細節:
1. 程式碼未包含原始海龜的 Whipsaw 停損法則。
2. 如果要「原汁原味」的話,應該是按照 PDF 裡面 System 2 的 55 天而不是 50 天突破。
3. 根據原始海龜交易規則 PDF 第 18 頁,用 20 天或 55 天突破是由海龜自行決定,版主是用那一種?

PS 無聊考古了一下,版主的程式碼最原始出處在 https://community.tradestation.com/Discussions/Topic.aspx?Topic_ID=20466,有 TradeStation 帳號的可以自己去看,那裡有另一隻海龜(Original Turtle) Russell Sands 提供的另一種版本原始碼。

EasyTrader 提到...

您好
LastTrade 在 if Tracker = 1 & if Tracker = - 1裡計算
50天 or 55 天的原始程式直接套入台指期的績效普通 , MDD 還蠻大的
最後的結果在 60 min K 與 30 minK都不是原來的 20 天或 55天

Unknown 提到...

我用一百萬的資金回測,開不暸部位@_@

張貼留言

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

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