小孩脱发原因及治疗:国外知名策略-dual thrust

来源:百度文库 编辑:中财网 时间:2024/05/11 13:02:40

标题: 国外知名策略-dual thrust分享 [打印本页]

作者: 穿堂风    时间: 2011-7-24 03:45     标题: 国外知名策略-dual thrust分享

oliverzrl的老弟在一个贴子中提到他的股指系统是根据dual thrust系统为雏形,所以特意找了一下这个系统。
dual thrust是八几年一个老外写的,目前在自动化交易里应该还能排到前三吧。
这个系统核心相当简单,我一直都相信越简单越有效,而且作者的思想很有借鉴之处,为方便与大家分享,我重写了一个TB版本。
原形很简单,很多人经验都比我丰富,一定能扩充不少,如加入止损,止赢,加入资金/风险管理,改成日内系统等,从而打造成为自己的一个利器。

写在前面的话:
从看dualthrust的原形到重写TB代码,用时大概半小时,因为我本人是从事研发工作,代码从构思开始就会首先考虑逻辑思维的严密和健壮性,但也很可能有疏忽之处,比如这个系统我就没有加入涨跌停和最小幅度控制(我只想原汁原味重写,其它的大家自己扩充吧),所以大家在提问的时候,不要先入为主的认为我会犯很多低级错误,一定要认真读过代码,并对TB机制有足够的了解,这也是对我的尊重吧,坦白说,前几次发分享系统,看到大家的回复,我有些失落。
另外:很多朋友通过QQ直接跟我沟通,因为本人用于维持生计的工作跟期货没任何关系,而且一直都很忙,写系统时要么是在上班的时候忙里偷闲偷偷摸摸的写上一段,要么就是利用休息时间,像重写这个系统就是在凌晨3点多,所以很多留言和询问我可能没有时间去关注,碰到没有回复的朋友,还请谅解。
如果以后有时间的话,我会再重写一些MT4上比较有价值的策略和大家分享。
作者: 穿堂风    时间: 2011-7-24 03:47

dual thrust系统原形
  1. Inputs: K1(.5),K2(.5),Mday(1),Nday(1);
  2. Vars: BuyRange(0), SellRange(0);
  3. Vars: BuyTrig(0),SellTrig(0);
  4. Vars: HH(0),LL(0),HC(0),LC(0);

  5. If CurrentBar > 1 Then Begin
  6. HH = Highest(High,Mday);
  7. HC = Highest(Close,Mday);
  8. LL = Lowest(Low,Mday);
  9. LC = Lowest(Close,Mday);

  10. If (HH - LC) >= (HC - LL) Then Begin
  11. SellRange = HH - LC;
  12. End Else Begin
  13. SellRange = HC - LL;
  14. End;

  15. HH = Highest(High,Nday);
  16. HC = Highest(Close,Nday);
  17. LL = Lowest(Low,Nday);
  18. LC = Lowest(Close,Nday);

  19. If (HH - LC) >= (HC - LL) Then Begin
  20. BuyRange = HH - LC;
  21. End Else Begin
  22. BuyRange = HC - LL;
  23. End;

  24. BuyTrig = K1*BuyRange;
  25. SellTrig = K2*SellRange;

  26. If MarketPosition = 0 Then Begin
  27. Buy at Open of next bar + BuyTrig Stop;
  28. Sell at Open of next bar - SellTrig Stop;
  29. End;

  30. If MarketPosition = -1 Then Begin
  31. Buy at Open of next bar + Buytrig Stop;
  32. End;

  33. If MarketPosition = 1 Then Begin
  34. Sell at Open of next bar - SellTrig Stop;
  35. End;

  36. End;
复制代码
作者: 穿堂风    时间: 2011-7-24 03:49

本人重写的TB源码
转载注明出处
  1. //------------------------------------------------------------------------
  2. // 简称: dual_thrust
  3. // 名称:
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出: 穿堂风
  7. //------------------------------------------------------------------------


  8. Params
  9. Numeric K1(0.5);
  10. Numeric K2(0.5);
  11. Numeric Mday(1);
  12. Numeric Nday(1);
  13. Numeric lots(1);
  14. Numeric offset(0);

  15. Vars
  16. Numeric BuyRange(0);
  17. Numeric SellRange(0);
  18. Numeric BuyTrig(0);
  19. Numeric SellTrig(0);
  20. Numeric HH;
  21. Numeric LL;
  22. Numeric HC;
  23. Numeric LC;
  24. Numeric i_offset;
  25. Numeric BuyPosition;
  26. Numeric SellPosition;

  27. Begin
  28. If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改
  29. {
  30.         i_offset = offset*MinMove*PriceScale;
  31.         HH = Highest(HighD(1),Mday);
  32.         HC = Highest(CloseD(1),Mday);
  33.         LL = Lowest(LowD(1),Mday);
  34.         LC = Lowest(CloseD(1),Mday);

  35.         If((HH - LC) >= (HC - LL))
  36.         {
  37.                 SellRange = HH - LC;
  38.         }
  39.         Else
  40.         {
  41.                 SellRange = HC - LL;
  42.         }

  43.         HH = Highest(HighD(1),Nday);
  44.         HC = Highest(CloseD(1),Nday);
  45.         LL = Lowest(LowD(1),Nday);
  46.         LC = Lowest(CloseD(1),Nday);

  47.         If((HH - LC) >= (HC - LL))
  48.         {
  49.                 BuyRange = HH - LC;
  50.         }
  51.         Else
  52.         {
  53.                 BuyRange = HC - LL;
  54.         }

  55.         BuyTrig = K1*BuyRange;
  56.         SellTrig = K2*SellRange;
  57.        
  58.         BuyPosition = OpenD(0)+BuyTrig;
  59.         SellPosition = OpenD(0)-SellTrig;
  60.        
  61.         PlotNumeric("BuyPosition",BuyPosition);
  62.         PlotNumeric("SellPosition",SellPosition);

  63.         If(MarketPosition == 0)
  64.         {
  65.                 If(High>=BuyPosition)
  66.                 {
  67.                         Buy(lots,Max(Open,BuyPosition)+i_offset);
  68.                         Return;
  69.                 }
  70.                
  71.                 If(Low<=SellPosition)
  72.                 {
  73.                         SellShort(lots,Min(Open,SellPosition)-i_offset);
  74.                         Return;
  75.                 }
  76.         }

  77.         If(MarketPosition == -1)
  78.         {
  79.                 If(High>=BuyPosition)
  80.                 {
  81.                         Buy(lots,Max(Open,BuyPosition)+i_offset);
  82.                         Return;
  83.                 }
  84.         }

  85.         If(MarketPosition == 1)
  86.         {
  87.                 If(Low<=SellPosition)
  88.                 {
  89.                         SellShort(lots,Min(Open,SellPosition)-i_offset);
  90.                         Return;
  91.                 }
  92.         }
  93. }
  94. End

  95. //------------------------------------------------------------------------
  96. // 编译版本        GS2010.12.08
  97. // 用户版本        2011/07/24 02:14
  98. // 版权所有        穿堂风
  99. // 更改声明        TradeBlazer Software保留对TradeBlazer平台
  100. //                        每一版本的TrabeBlazer公式修改和重写的权利
  101. //------------------------------------------------------------------------
复制代码
作者: 穿堂风    时间: 2011-7-24 03:53

RB 5分钟周期
使用默认参数,未作优化
其它品种大家可以去试试



图片附件: 1.jpg (2011-7-24 03:52, 93.48 KB) / 下载次数 0
http://www.tradeblazer.net/forum/attachment.php?aid=4843&k=a91d7900b657916289a0bfe4d6397dd1&t=1312554775&sid=3aw86f



图片附件: 2.jpg (2011-7-24 03:52, 69.76 KB) / 下载次数 0
http://www.tradeblazer.net/forum/attachment.php?aid=4844&k=1ac8deda66349b11043e8a4b46aef813&t=1312554775&sid=3aw86f


作者: 穿堂风    时间: 2011-7-24 03:57

参数设置说明


图片附件: 3.jpg (2011-7-24 03:57, 40.65 KB) / 下载次数 0
http://www.tradeblazer.net/forum/attachment.php?aid=4845&k=524ee2a9d10bf8237229744b43999480&t=1312554775&sid=3aw86f


作者: 穿堂风    时间: 2011-7-24 04:03

忘说了,重写的是使用V4版本。
编译时下边提示框提示编译警告,说“包含系列函数,可能有逻辑错误”,不用管。
虽然可以把openD放if外边去掉警告,但没必要那么做,因为我们自己知道,这里没有逻辑错误。
作者: 穿堂风    时间: 2011-7-24 04:26

股指默认参数也是杠杠的
因本人现在连螺纹都买不起(不是想拉资金,本人现在一点想代客的心情都没有),IF更是没碰过,手续费设置的2%%,不知道对不对。



图片附件: 1.jpg (2011-7-24 04:20, 95.61 KB) / 下载次数 0
http://www.tradeblazer.net/forum/attachment.php?aid=4846&k=aab7ef8915e9a20bdef3a4ad51d5815f&t=1312554775&sid=3aw86f



图片附件: 2.jpg (2011-7-24 04:20, 72.34 KB) / 下载次数 0
http://www.tradeblazer.net/forum/attachment.php?aid=4847&k=d4d49db5fa1db299207e3ad8951f54a9&t=1312554775&sid=3aw86f


作者: Joseph0727    时间: 2011-7-24 06:56

仔细研究下!
作者: Joseph0727    时间: 2011-7-24 07:12

If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改
这个44是采用相应周期下面的日内bar数吗?比如采用股指5分钟数据,应该就写成
If(CurrentBar > 54*Max(Mday,Nday)) 是这个意思吗?谢谢
作者: 穿堂风    时间: 2011-7-24 09:25

If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改
这个44是采用相应周期 ...
Joseph0727 发表于 2011-7-24 07:12



    恩,是这个意思,我上边写错了,应该是45,不过没关系,这块写的不对,也只是影响测试的前边一两次交易
作者: bluefox    时间: 2011-7-24 12:29

无条件顶。。。。。。。。。。。。。
作者: 道勤    时间: 2011-7-24 13:42

十分感谢分享!
作者: weibo-lwb    时间: 2011-7-25 01:12

如果当天走势一直在上下穿多空临界点怎么办啊。
作者: 穿堂风    时间: 2011-7-25 09:18

如果当天走势一直在上下穿多空临界点怎么办啊。
weibo-lwb 发表于 2011-7-25 01:12



    趋势系统一般都会有这个问题,在原有模型上再扩充吧,比如上边我也说到了,设定一个最小波动范围,或者限定一段时间内的失败次数……
作者: weorc    时间: 2011-7-25 12:34

感谢穿大侠的分享
作者: 趋势跟踪    时间: 2011-7-25 13:03

顶一个,谢谢穿堂风老弟无私奉献!
作者: beijib    时间: 2011-7-25 15:56

凌晨发帖,保重身体啊
作者: illidanyl    时间: 2011-7-26 16:53

今天针对楼主这个做了个日内的模型测试了下 效果感觉一般的说。。。
作者: illidanyl    时间: 2011-7-26 16:55

类似于这套系统
  1. //------------------------------------------------------------------------
  2. // 简称: B1
  3. // 名称:
  4. // 类别: 公式应用
  5. // 类型: 用户应用
  6. // 输出:
  7. //------------------------------------------------------------------------

  8. Params
  9.    Numeric Lot(1);            //交易仓位
  10.    Numeric OffsetPoint(2);    //滑点
  11.    Numeric MoneyLoss(0.2); //亏损平仓值  
  12.    Numeric PercentOfRange(0.3);

  13. Vars
  14.    String name;

  15.    Numeric bTime;             //Bar的建立时间
  16.    Numeric Offset;            //滑点
  17.    NumericSeries Position;          //仓位
  18.    NumericSeries estP;              //极值
  19.    NumericSeries ExitP;             //止损线
  20.    NumericSeries Trade;
  21.    NumericSeries Up;
  22.    NumericSeries Down;
  23.    Numeric DayOpen;
  24.    Numeric preDayRange;
  25.    Numeric UpperBand;
  26.    Numeric LowerBand;
  27.    Bool BarUp;
  28.    Bool BarDown;
  29.    Bool bTimeCon;

  30. Begin
  31.    If(Date != Date[1] And High == Low) Return;//接近涨跌停板时不做交易

  32.    bTime = IntPart(Time*10000);
  33.    Offset = OffsetPoint* PriceScale*MinMove;
  34.    Up = OpenD(0) + (HighD(1) -  LowD(1))*PercentOfRange;
  35.    Down = OpenD(0) - (HighD(1) -  LowD(1))*PercentOfRange;
  36.    DayOpen = OpenD(0);

  37.    BarUp = Open > Up;
  38.    BarDown = Open < Down;
  39.    bTimeCon = (bTime > 0910) And (bTime < 1456);

  40.    If(Position > 0 And estP < High) estP = High[1];
  41.    If(Position < 0 And estP > Low) estP = Low[1];
  42.    If(Position > 0)
  43.       ExitP = estP * (100 - MoneyLoss) / 100;
  44.    Else
  45.       ExitP = estP * (100 + MoneyLoss) / 100;
  46.    If(Trade == 1 And Low < Up) Trade = 0;
  47.    If(Trade == 2 And High > Down) Trade = 0;

  48.    PlotNumeric("UpperBand",Up);
  49.    PlotNumeric("LowerBand",Down);
  50.    PlotNumeric("MidLine",DayOpen);

  51.    If(bTimeCon)
  52.    {
  53.       If(Position == 0)
  54.       {
  55.          If(BarUp And Trade != 1)         //Long Open
  56.          {
  57.             Buy(lot,Open);
  58.             Position = lot;
  59.             estP = Up;
  60.             ExitP = Up;
  61.          }
  62.    
  63.          If(BarDown And Trade != 2)
  64.          {
  65.             SellShort(lot,Open);
  66.             Position = lot * -1;
  67.             estP = Down;
  68.             ExitP = Down;
  69.          }
  70.       }
  71.       Else
  72.       If(Position != 0)
  73.       {
  74.          If(Position > 0 And Low < DayOpen)
  75.          {
  76.             Sell(lot,DayOpen);
  77.             Position = 0;
  78.             Commentary("1");
  79.             Trade = 1;
  80.          }
  81.       
  82.          If(Position < 0 And High > DayOpen)
  83.          {
  84.             BuyToCover(lot,DayOpen);
  85.             Position = 0;
  86.             Commentary("2");
  87.             Trade = 2;
  88.          }
  89.    
  90.          If(Position > 0 And Low < ExitP)
  91.          {
  92.             Sell(lot,ExitP);
  93.             Position = 0;
  94.             Commentary("3");
  95.             Trade = 1;
  96.          }
  97.    
  98.          If(Position < 0 And High > ExitP)
  99.          {
  100.             BuyToCover(lot,ExitP);
  101.             Position = 0;
  102.             Commentary("4");
  103.             Trade = 2;
  104.          }
  105.       }
  106.    }

  107.    If(bTime > 1429)
  108.    {
  109.       If(Position != 0)
  110.       {
  111.          If (Position < 0)
  112.          BuyToCover(lot,Open);
  113.       Else
  114.          Sell(lot,Open);
  115.       }
  116.       Position = 0;
  117.    }

  118.    Commentary("Position = "+Text(Position));
  119.    Commentary("Trade = "+Text(Trade));
  120.    Commentary("ExitP = "+Text(ExitP));
  121. End

  122. //------------------------------------------------------------------------
  123. // 编译版本   GS2010.12.08
  124. // 用户版本   2011/04/18 10:11
  125. // 版权所有   illidanly
  126. // 更改声明   TradeBlazer Software保留对TradeBlazer平台
  127. //         每一版本的TrabeBlazer公式修改和重写的权利
  128. //------------------------------------------------------------------------
复制代码
作者: a415260930    时间: 4 天前 09:28

先看看,有问题再请教哈
作者: shijianxulie    时间: 4 天前 17:18

有问题啊,每个BAr上都交易
作者: 读书山林    时间: 3 天前 13:19

好贴 消化下
作者: a415260930    时间: 3 天前 16:38

回复 3# 穿堂风


    穿老大 对这句话我不大理解,不知道这有什么用?是用来设置滑点的吗?“If(CurrentBar > 44*Max(Mday,Nday))//使用的是5分钟周期,其它的周期自己做相应修改”
作者: lzl563    时间: 前天 12:35

.
...........
作者: 輪回    时间: 前天 20:07

無條件頂上——
作者: bjzch    时间: 6 小时前

这个系统是 Michael Chalek 在80 年代开发的 Dual Thrust。在自动化交易排名中,目前为止,仍然排名第二左右。详细资料,大家可以搜索网络对这方面的介绍。

基本原理很简单,描述出来如下,这样不懂编程的人都可以明白:

1. 在今天的收盘,计算两个值: 最高价-收盘价, 和 收盘价-最低价。然后取这两个值较大的那个,乘以k值0.7。把结果称为 触发值。

2. 在明天的开盘,记录开盘价,然后在价格超过(开盘+触发值)时马上买入,或者价格低于(开盘-触发值)时马上卖空。

3. 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有一口空单,则买入两口。同理,如果在价格低于(开盘-触发值)时手上有一口多单,则卖出两口。

程序在复制了原程序基础上,增加了止损设置和优化环境,你可以决定是否止损,止损后是否重新开仓,是否以当前价立刻执行策略还是以收盘价执行,你还可以选择你认为对你最重要的几个指标进行打分排序,并通过表现打分,选出最优的参数组合。
通过分析参数,可以发现各个品种的不同特性。并构建较为稳健的策略组合池。
程序还给你非常直观的视觉感受,让你直观的看到你的策略执行情况,是否满足上涨行情做多,下跌行情做空为主体执行格局。如下图。程序还直观的表示了你的策略回报与一般的正态分布之间的风险占有对比,如下图,很明显我们的策略回报一阶占优于正态分布,也就是说,尖峰,薄尾。
程序还给你提供了非常详尽的统计报告,如平均盈利,最长不盈利时间,这些指标均可以作为你选择程序好坏的指标,用于你的打分系统,选择最符合你心理的系统优化参数。
本文来自: 人大经济论坛 详细出处参考:http://www.pinggu.org/bbs/viewth ... &fromuid=651507
作者: tbfan    时间: 5 小时前

不错啊 顶一下




欢迎光临 系统交易论坛 - 开拓者期货自动交易平台 (http://www.tradeblazer.net/forum/) Powered by Discuz! 7.2