【系统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
如果以上指标公式不适用于您常用的行情软件
或者您想改编成选股公式,以便快速选出某种形态个股的话,
相关文章
-
没有相关内容