【系統CODE】一個可實盤交易的系統 [開拓者 TB]
- 咨詢內容:
maharaj發自海洋論壇
尋TB的編碼,現將原貼附上,看大家是否可幫他的忙:
一直做美盤,最近對國內期貨有些興趣,買了些數據來做測試。發現有一個系統在白糖上不錯。這個系統是 Michael Chalek 在80 年代開發的 Dual Thrust。基本原理很簡單,描述出來如下,這樣不懂編程的人都可以明白:
1. 在今天的收盤,計算兩個值: 最高價-收盤價, 和 收盤價-最低價。然后取這兩個值較大的那個,乘以k值0.7。把結果稱為 觸發值。
2. 在明天的開盤,記錄開盤價,然后在價格超過(開盤+觸發值)時馬上買入,或者價格低于(開盤-觸發值)時馬上賣空。
3. 沒有明確止損。這個系統是反轉系統,也就是說,如果在價格超過(開盤+觸發值)時手頭有一口空單,則買入兩口。同理,如果在價格低于(開盤-觸發值)時手上有一口多單,則賣出兩口。
我用TradeStation測試的結果如下:
測試條件: 一口合約,已減去交易費用50元
時期: 2006-1-6 (白糖開始交易)至 2009-1-8
交易次數: 249
勝率: 48.59%
平均贏利: 223.17元
最大連虧: 5880 元
這是資金曲線圖:
要求不高的話,這已經是一個可以投入實盤交易的系統了。k是唯一的參數,在大范圍內變動(0.5-1.1)時,系統贏利都不錯。有興趣的同好可以試驗各種濾網,看哪種濾網能顯著提高績效。如果有時間,我會在其他的品種上都測試一下。
因為交易美盤,我沒法人工交易國內期貨。哪位朋友可以編出TB的代碼,或者有自動交易的建議,請告訴我一下。謝謝。
[ 本帖最后由 一朵祥云 于 2009-1-31 22:08 編輯 ] - TB技術人員:
- Params
- numeric K(0.7);
- Vars
- numeric Spreadvalue;
- numericseries daynum;
- Begin
- spreadvalue=max(closed(1)-LowD(1),highd(1)-closed(1));
- if(barstatus==0)
- {
- daynum=0;
- }else if(barstatus==1 and day!=day[1])
- {
- daynum=daynum+1;
- }Else
- {
- daynum=daynum[1];
- }
- if(daynum>0)
- {
- if(high>opend(0)+K*spreadvalue)
- {
- buy(0,min(opend(0)+K*spreadvalue+2*minmove*pricescale,high));
- }
- if(low<opend(0)-K*spreadvalue)
- {
- sellshort(0,max(opend(0)-k*spreadvalue-2*minmove*pricescale,low));
- }
- }
- end
- Params
- TB客服:
感謝孤舟騎浪的分享!大家可以在不同品種和周期上回測一下,發現了什么?
歡迎繼續積極討論完善思路和實現辦法! - 網友回復:
以下是海洋論壇TTL所發,zzhang朋友編寫的TB代碼:
原帖及相關討論可見http://www.hylt.net/vb/showthread.php?t=18385&page=2
Params
Numeric K1(0.5);
Numeric K2(0.5);
Numeric Mday(1);
Numeric lots(1); //交易手數
Vars
Numeric BuyRange(0);
Numeric SellRange(0);
Numeric BuyTrig(0);
Numeric SellTrig(0);
Numeric HH(0);
Numeric LL(0);
Numeric HC(0);
Numeric LC(0);
Begin
HH = Highest(HighD(1),Mday);
HC = Highest(CloseD(1),Mday);
LL = Lowest(LowD(1),Mday);
LC = Lowest(CloseD(1),Mday);
If((HH - LC) >= (HC - LL)) BuyRange = HH - LC;
else BuyRange = HC - LL;
SellRange=BuyRange;
BuyTrig = K1*BuyRange;
SellTrig = K2*SellRange;
If(MarketPosition !=1 && High>=(OpenD(0)+BuyTrig)) Buy(lots,OpenD(0)+BuyTrig); // 多頭建倉
If(MarketPosition !=-1 && Low<=(OpenD(0)-SellTrig)) SellShort(lots,OpenD(0)-SellTrig); // 空頭建倉
End
[ 本帖最后由 一朵祥云 于 2009-1-20 16:02 編輯 ] - 網友回復:
經過仔細研究,加了一點東西,但感覺還是沒什么作用。或許交易的本質就是用非常大的資金,非常小的頭寸,非常多的正期望值的系統,分散非常多的市場,最終忽略局部的小得失,而整體上實現了盈利。小資金和單系統,需有很好的運氣(技巧性改善,就是要有堅強的耐性,等到連續虧損次數遠遠大于概率之外時介入,還有一丁點希望)。 - Params
- numeric K(0.7);
- Vars
- numeric Spreadvalue;
- numericseries daynum;
- boolseries btrailing(false);
- Begin
- btrailing=btrailing[1];
- spreadvalue=max(closed(1)-LowD(1),highd(1)-closed(1));
- if(barstatus==0)
- {
- daynum=0;
- }else if(barstatus==1 and day!=day[1])
- {
- daynum=daynum+1;
- }Else
- {
- daynum=daynum[1];
- }
- if(daynum>0 and spreadvalue>20*minmove*pricescale)
- {
- if(marketposition!=1 and high>opend(0)+K*spreadvalue)
- {
- btrailing=false;
- buy(0,min(opend(0)+K*spreadvalue+2*minmove*pricescale,high));
- setglobalvar(0,opend(0));
- setglobalvar(1,avgentryprice-OpenD(0));
- }
- if(marketposition!=-1 and low<opend(0)-K*spreadvalue)
- {
- btrailing=false;
- sellshort(0,max(opend(0)-k*spreadvalue-2*minmove*pricescale,low));
- setglobalvar(0,opend(0));
- setglobalvar(1,opend(0)-avgentryprice);
- }
- }
- if(marketposition==1)
- {
- if(low<getglobalvar(0))
- {
- sell(0,getglobalvar(0)-2*minmove*pricescale);
- }
- if(high>AvgEntryPrice+3*getglobalvar(1))
- {
- btrailing=true;
- }
- if(btrailing==true and low<highest(high,barssinceentry)-2*getglobalvar(1))
- {
- sell(0,max(highest(high,barssinceentry)-2*getglobalvar(1)-2*minmove*pricescale,low));
- }
- }
- if(marketposition==-1)
- {
- if(high>getglobalvar(0))
- {
- buytocover(0,getglobalvar(0)+2*minmove*pricescale);
- }
- if(low<AvgEntryPrice-3*getglobalvar(1))
- {
- btrailing=true;
- }
- if(btrailing==true and high>lowest(low,barssinceentry)+2*getglobalvar(1))
- {
- buytocover(0,min(lowest(low,barssinceentry)+2*getglobalvar(1)+2*minmove*pricescale,high));
- }
- }
- Commentary("單手虧損量"+text(K*spreadvalue*ContractUnit/pricescale)+"元。");
- end
- Params
如果以上指標公式不適用于您常用的行情軟件
或者您想改編成選股公式,以便快速選出某種形態個股的話,
相關文章
-
沒有相關內容