米小兔 发表于 2013-4-9 15:03:49

经典策略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公式修改和重写的权利
//------------------------------------------------------------------------

曙光 发表于 2013-4-9 16:30:57

这个系统是连续在市系统吧,任何时候都有持仓

米小兔 发表于 2013-4-9 17:16:23

原版是这样的,修改之后就会有空仓的情况。

喜爱川菜 发表于 2013-5-24 11:35:26

弱弱的问下,这个可以做实盘自动下单吗?

米小兔 发表于 2013-5-30 14:46:05

只要你接受风险收益比,就可以实盘啦

LiuxiaoqiangTB 发表于 2014-6-2 20:07:43

不错,赞一下。

pb830806clone 发表于 2016-4-3 13:40:52

学习一下,return这么用我研究下

gldh5000601060 发表于 2018-1-18 09:03:01

这个代码是有问题的。

szhetong 发表于 2018-1-23 16:57:34

复制上去,测试通不过,有好多个地方错误

gfsauce 发表于 2018-8-6 14:25:24

If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改

如果不算夜盘的话 这里不应该是45吗? 4*12-3=45
页: [1] 2
查看完整版本: 经典策略DualThrust改进(带源码)