经典策略DualThrust改进(带源码)
本帖最后由 米小兔 于 2013-4-9 15:10 编辑DualThrust简称DT,是海外top10交易系统中的其一.属于开盘区间突破类交易系统,以今日开盘价加\减一定比例的昨日振幅,确定上下轨.日内突破上轨时平空做多,突破下轨时平多做空.DualThrust在形式上和开盘区间突破策略类似.不同点主要体现在两个方面: DualThrust在Range的设置上,引入前N日的四个价位,使得一定时期内的Range相对稳定,可以适用于日间的趋势跟踪;DualThrust对于多头和空头的触发条件,考虑了非对称的幅度,做多和做空参考的Range可以选择不同的周期参数,也可以通过参数K1和K2来确定.
原版本DT在RB000中的测试效果,时间范围20090101-20130101.
关键绩效数据:
资金曲线:
针对缺陷的修改:
1) 日内宽幅震荡,高低点反复穿越开多触发价格和开空触发价格,导致日内反复被洗,这种心情相信实盘在用趋势跟随类策略的人都能理解.效果图如下:
针对此种情况,我们设置一个参数TimesMaxToday,用于限制当天的开仓次数,避免在震荡行情中反复被洗.
TimesMaxToday的值设置为1,意思为限定当天开仓次数1次, 有效避免了当天反复被洗的悲剧.修改过后的效果图如下:
修改后的版本命名为ITF_T_DualThrust_V101,在RB000中的测试环境设置同上,关键数据的对照,:
从关键数据的对照中可以看出,减小最大回撤的同时也损失了部分利润.
其他参数优化列表:
//------------------------------------------------------------------------
// 简称: ITF_T_DualThrust_V101
// 名称: 国贸期货上海营业部量化交易 客户群:186100158
// 类别: 公式应用
// 类型: 用户应用
// 输出:
//------------------------------------------------------------------------
Params
Numeric Lots(1);
Numeric TimesMaxToday(1); //限制当天开仓最多次数;
Numeric K1(0.5);
Numeric K2(0.5);
Numeric Mday(1);
Numeric Nday(1);
Numeric offset(0);
Vars
Numeric BuyRange(0);
Numeric SellRange(0);
Numeric BuyTrig(0);
Numeric SellTrig(0);
Numeric HH;
Numeric LL;
Numeric HC;
Numeric LC;
Numeric i_offset;
Numeric BuyPosition;
Numeric SellPosition;
NumericSeries TimesToday(0); //记录当天开仓次数;
Begin
If(Barstatus==2 )
{
If( Time==0.090000 And CurrentTime<=0.090001) Return;
If( Time==0.101500 And CurrentTime<=0.103001) Return;
If( Time==0.133000 And CurrentTime<=0.133001) Return;
}
If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改
{
i_offset = offset*MinMove*PriceScale;
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))
{
SellRange = HH - LC;
}
Else
{
SellRange = HC - LL;
}
HH = Highest(HighD(1),Nday);
HC = Highest(CloseD(1),Nday);
LL = Lowest(LowD(1),Nday);
LC = Lowest(CloseD(1),Nday);
If((HH - LC) >= (HC - LL))
{
BuyRange = HH - LC;
}
Else
{
BuyRange = HC - LL;
}
BuyTrig = K1*BuyRange;
SellTrig = K2*SellRange;
BuyPosition = OpenD(0)+BuyTrig;
SellPosition = OpenD(0)-SellTrig;
PlotNumeric("BuyPosition",BuyPosition);
PlotNumeric("SellPosition",SellPosition);
//开盘第一根K线将当天开仓次数清零;
If(BarsSinceToday==0)
{
TimesToday = 0;
}
//开仓;
If(TimesToday<TimesMaxToday And CurrentBar>90)
{
If(MarketPosition!=1)
{
If(High>=BuyPosition)
{
Buy(lots,Max(Open,BuyPosition)+i_offset);
TimesToday = TimesToday+1;
Return;
}
}
If(MarketPosition!=-1)
{
If(Low<=SellPosition)
{
SellShort(lots,Min(Open,SellPosition)-i_offset);
TimesToday = TimesToday+1;
Return;
}
}
}
//平仓;
If(MarketPosition==1 and Low<=SellPosition)
{
Sell(lots,Min(Open,SellPosition)-i_offset);
TimesToday = TimesToday+1;
Return;
}
If(MarketPosition==-1 and High>=BuyPosition)
{
BuyToCover(lots,Max(Open,BuyPosition)+i_offset);
TimesToday = TimesToday+1;
Return;
}
}
Commentary("当天开仓次数="+Text(TimesToday));
End
//------------------------------------------------------------------------
// 编译版本 GS2010.12.08
// 用户版本 2013/03/28 11:02
// 版权所有 国贸期货上海营业部量化交易 客户群:186100158
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TrabeBlazer公式修改和重写的权利
//------------------------------------------------------------------------ 这个系统是连续在市系统吧,任何时候都有持仓 原版是这样的,修改之后就会有空仓的情况。 弱弱的问下,这个可以做实盘自动下单吗? 只要你接受风险收益比,就可以实盘啦 不错,赞一下。 学习一下,return这么用我研究下 这个代码是有问题的。 复制上去,测试通不过,有好多个地方错误 If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改
如果不算夜盘的话 这里不应该是45吗? 4*12-3=45
页:
[1]
2