开拓者期货期权程序化系统交易论坛

标题: 一个系统交易的实例:夹板 [打印本页]

作者: skywalker    时间: 2008-5-24 13:52:23     标题: 一个系统交易的实例:夹板

夹板在实盘中是一个很常见的运用,用于吃住震荡行情。它有个上轨和一个下轨,行情突破上轨就做空;突破下轨就做多,在上下轨之间来回吃。如图:

[attach]683[/attach]
代码如下:

  1. /* *******************************************************************************************
  2. 1、行情从UpperLine和LowerLine之间开始进入
  3. 2、大于等于UpperLine开空仓,小于等于LowerLine开多仓
  4. 3、从开仓点继续偏离StopInterval止损(意味着最多亏StopInterval)
  5. 4、止损一次之后不再开仓
  6. 5、下午14:55收盘前平仓
  7. 6、运用在TICK图上
  8. ******************************************************************************************** */
  9. Params
  10.        Numeric   upperLine(100);
  11.        Numeric   lowerLine(100);
  12.        Numeric   StopInterval(150);

  13.        Numeric    firstLots(4);    // 手数(仅为正数)
  14.        Numeric    today(26);     // 日期(5月22日,则填入22)

  15. Vars
  16.        Numeric   tem;

  17.        Numeric   needPosition;   // 当前需要建立的头寸(正数为多头,负数为空头,零为全部平光)
  18.        Numeric   needPrice;    // 建立头寸时下单的价格
  19.        NumericSeries  wantStopLong;   // 多头止损的位置
  20.        NumericSeries  wantStopShort;   // 空头止损的位置

  21. Begin
  22.        if(currentBar == 0)
  23.        {
  24.             // 初始化序列变量
  25.             wantStopLong = -1;
  26.             wantStopShort = -1;
  27.        }Else
  28.        {
  29.             wantStopLong = wantStopLong[1];  
  30.             wantStopShort = wantStopShort[1];  
  31.        }
  32.        if(day != today)
  33.        {
  34.             // 过滤非指定日期的BAR
  35.             return ;
  36.        }

  37.        // 计算多、空头止损的位置
  38.        wantStopLong = lowerLine - stopInterval;  
  39.        wantStopShort = upperLine + stopInterval;


  40.        // 把计算好的值输出来看看(这是调试的重要技巧!!!!!)
  41.        Commentary("wantStopLong:"+Text(wantStopLong));
  42.        Commentary("wantStopShort:"+Text(wantStopShort));
  43.        tem = 0;
  44.        if(NumLosTrades == 0) // 当日从来没有止损过,开始准备计算。开平仓的方法都包装在OpenCoverFor2Lines函数中
  45.        {
  46.             // OpenCoverFor2Lines函数包装了开平仓算法,其用意如下:
  47.             // 1、返回值为零表示不做任何头寸操作,非零表示要操作
  48.             // 2、返回值为非零时,needPosition写入了当前要建立的头寸大小和方向,needPrice写入了以什么价格去建立该头寸
  49.             tem = OpenCoverFor2Lines(MarketPosition(),firstLots,upperLine,lowerLine,wantStopShort,wantStopLong,needPosition,needPrice);
  50.        }

  51.        Commentary("needPosition:"+Text(needPosition));
  52.        Commentary("needPrice:"+Text(needPrice));

  53.        if(tem == 0)
  54.        {
  55.             // 不操作任何东西,返回!
  56.             return ;
  57.        }
  58.        if(MarketPosition == 0)
  59.        {
  60.             if(needPosition > 0)
  61.             {
  62.                  // 当前无仓,开始建立多头
  63.                  buy(abs(needPosition),needPrice);
  64.             }Else
  65.             {
  66.                  // 当前无仓,开始建立空头
  67.                  SellShort(abs(needPosition),needPrice);
  68.             }
  69.             return ;
  70.        }
  71.        if(MarketPosition > 0)
  72.        {
  73.             if(needPosition < 0)
  74.             {
  75.                  // 当前多头,要求反转为空头
  76.                  SellShort(abs(needPosition),needPrice);
  77.             }Else
  78.             {
  79.                  // 当前多头,要求平仓
  80.                  Sell(0,needPrice);
  81.             }
  82.         return ;
  83.        }
  84.        if(MarketPosition < 0)
  85.        {
  86.             if(needPosition > 0)
  87.             {
  88.                  // 当前空头,要求反转为多头
  89.                  buy(abs(needPosition),needPrice);
  90.             }Else
  91.             {
  92.                  // 当前空头,要求平仓
  93.                  BuyToCover(0,needPrice);
  94.             }
  95.        }
  96.        return 0;
  97. End

复制代码

作者: skywalker    时间: 2008-5-24 14:02:59     标题: OpenCoverFor2Lines函数代码

  1. // 返回值: 1:有所动作,0:没有动作
  2. // 返回值为非零时,把当前要建立的头寸大小和方向写入needPosition,把以什么价格去建立该头寸写入needPrice
  3. // 返回值: 1:有所动作,0:没有动作
  4. // 返回值为非零时,把当前要建立的头寸大小和方向写入needPosition,把以什么价格去建立该头寸写入needPrice

  5. Params
  6.         Numeric         currentPosition(0);                // 当前头寸,可正可负
  7.         Numeric        firstLots(0);

  8.         Numeric         wantShort(120);                // 开空仓位置
  9.         Numeric         wantLong(8);                         // 开多仓位置
  10.        
  11.         Numeric        wantStopShort(0);                // 空头止损的位置
  12.         Numeric        wantStopLong(0);                // 多头止损的位置

  13.        
  14.         // 注意:以下两个都是引用变量!!!!
  15.         NumericRef        needPosition;    // 经过计算后的当前头寸,正数:建立多仓,负数:建立空仓,零:平光所有头寸
  16.         NumericRef needPrice;              // 建立needPosition时的价格
  17.        
  18. Vars
  19.         Numeric                         tem;
  20.        
  21. Begin

  22.         // 14:55:00平掉当日所有头寸
  23.         if(time >= 0.1455 && currentPosition != 0)
  24.         {
  25.                 needPosition = 0;
  26.                 needPrice = close ;
  27.                 return 1;
  28.         }
  29.         if(currentPosition == 0)
  30.         {
  31.                 // 无仓,准备侍机开仓
  32.                 if(close <= wantLong)
  33.                 {
  34.                         // 多头
  35.                         needPosition = firstLots;
  36.                         needPrice = wantLong;
  37.                         return 1;
  38.                 }
  39.                 if(close >= wantShort)
  40.                 {
  41.                         // 空头
  42.                         needPosition = -1 * firstLots;
  43.                         needPrice = wantShort;
  44.                         return 1;
  45.                
  46.                 }
  47.                 return 0;
  48.         }
  49.        
  50.         if(currentPosition > 0)
  51.         {
  52.                 // 持多仓,准备止损或反转
  53.                 if(close >= wantShort)
  54.                 {
  55.                         // 反转
  56.                         needPosition = -1 * firstLots;
  57.                         needPrice = wantShort;
  58.                         return 1;
  59.                 }
  60.                
  61.                 if(close <= wantStopLong)
  62.                 {
  63.                         // 止损
  64.                         needPosition = 0;
  65.                         needPrice = wantStopLong;
  66.                         return 1;
  67.                        
  68.                 }
  69.                 return 0;
  70.         }
  71.         if(currentPosition < 0)
  72.         {
  73.                 // 持空仓,准备止损或反转
  74.                 if(close <= wantLong)
  75.                 {
  76.                         // 反转
  77.                         needPosition = firstLots;
  78.                         needPrice = wantLong;
  79.                         return 1;
  80.                 }
  81.                
  82.                 if(close >= wantStopShort)
  83.                 {
  84.                         // 止损
  85.                         needPosition = 0;
  86.                         needPrice = wantStopShort;
  87.                         return 1;
  88.                        
  89.                 }
  90.                 return 0;
  91.         }
  92.           return 0;
  93. End
复制代码
[ 本帖最后由 skywalker 于 2008-5-24 14:05 编辑 ]
作者: skywalker    时间: 2008-5-24 14:09:23     标题: 夹板的公式导入文件

夹板的公式导入文件:
[attach]684[/attach]
作者: skywalker    时间: 2008-5-24 14:18:59

初学者一定要认真体会OpenCoverFor2Lines函数,为什么需要把开平仓算法包装到函数里。夹板是个半自动的系统,因为上下轨都需要作为参数输入。当你要转换成全自动系统的时候,那么上下轨就需要根据行情动态计算出来。把计算出来的值作为参数输入OpenCoverFor2Lines函数即可,如此程序就可以方便地拓展而不需要大改动。甚至你还可以再做一个函数用于动态计算上下轨。

[ 本帖最后由 skywalker 于 2008-5-24 15:15 编辑 ]
作者: skywalker    时间: 2008-5-24 14:22:44

  1. if(currentBar == 0)
  2. {
  3.     // 初始化序列变量
  4.     wantStopLong = -1;
  5.     wantStopShort = -1;
  6. }Else
  7. {
  8.     wantStopLong = wantStopLong[1];  
  9.     wantStopShort = wantStopShort[1];  
  10. }
复制代码



上一段代码是使用序列变量时的常见用法,非常重要的用法。

[ 本帖最后由 skywalker 于 2008-5-24 14:25 编辑 ]
作者: maodong    时间: 2008-5-24 15:01:22

这种结构值得借鉴,好。
作者: stevenx8    时间: 2008-5-24 19:06:33

得认真学习了
作者: cqzzbszz    时间: 2008-5-24 22:46:19

谢谢!一定好好学习
作者: 糊涂    时间: 2008-5-24 23:41:58

我觉得这个系统实战意义不大,原因我已经在未来函数中介绍了
作者: guotie    时间: 2008-5-25 09:38:24

学习一下。。。thx
作者: kidlee    时间: 2008-5-25 23:49:47

学习一下,难懂哦。。。
作者: solari    时间: 2008-6-20 17:52:21

好好学习
作者: b8866    时间: 2008-6-23 10:46:53     标题: 如何用这个夹板?

上下轨道是自己在图形上任意画的吗?任意画上下轨后触及上轨道做空,下跪道做多是这样吗?
作者: pwqzc    时间: 2008-6-26 08:30:38

看来我要仔细看看了啊
skywall真不错啊
作者: b8866    时间: 2008-6-28 20:59:20

如何用这个夹板?

上下轨道是自己在图形上任意画的吗?任意画上下轨后触及上轨道做空,下跪道做多是这样吗?为何没人回答呀,如何具体用呀?
作者: nopain    时间: 2008-6-29 09:33:21

自己写函数来指定上下线,或者直接用参数输入。
作者: nickchen    时间: 2008-6-30 13:47:43

值得好好学习哦 谢谢
作者: myangsoft    时间: 2008-9-5 14:09:08

学习学习!谢谢
作者: lilei19733    时间: 2008-9-7 11:45:19     标题: 请版主好事做到底

版主的夹板实例非常好,值得好好学习。
但是,这个实例的关键好象还是在于确定夹板高低线的值。
不知道楼主有没有好的计算方法,可以确定比较好的高低线值。

十分感谢!
作者: lilei19733    时间: 2008-11-20 18:31:15     标题: skywalker版主:关于夹板系统的请教

skywalker 版主,您的夹板系统非常好。但是,对于我这个初学者来说,还有一个问题请教,有什么好的办法来确定高低线,有什么资料可以学习?
非常感谢!!!
作者: lyd2009    时间: 2009-9-4 11:19:22

为什么载不了文件
作者: 开拓交易者    时间: 2009-9-5 14:52:14

靠,看不懂,经过仔细分析,我认为还是看不懂
作者: winson_lee    时间: 2009-9-15 16:07:58

关键是你怎么能判断他是盘整行情
作者: bugreg    时间: 2009-9-15 21:18:05

学习学习,值得借鉴, 正好要写个简单的交易系统, 谢谢啦
作者: citscwb    时间: 2009-9-20 17:03:31

DING !!!!!!!!!!!!!!!!!
作者: chengjun1201    时间: 2009-11-30 10:01:17

thank your work
作者: 一根筋88    时间: 2009-11-30 20:22:26

多好的东西也顶不住乱开仓,根本不听控制
作者: srlzh    时间: 2010-1-9 17:08:46     标题: 谢谢

谢谢!一定好好学习的了
作者: 开心老牛    时间: 2010-2-6 22:14:40

版主的夹板实例非常好,值得好好学习。
作者: httparmy    时间: 2010-3-11 05:44:25

谢谢,一定好好学习。。
作者: 01011012    时间: 2010-5-11 17:44:28

感觉夹板系统的关键还是对于夹板区间的幅度界定,这个才是整个交易系统的关键吧
作者: helan    时间: 2010-5-16 12:58:13

学习学习!谢谢...
作者: xiaocai550    时间: 2010-5-18 16:10:23

思路非常好,结构也很好!
我给它加个动态夹板这个系统岂不是完美了!

[ 本帖最后由 xiaocai550 于 2010-5-18 16:12 编辑 ]
作者: seasons9066    时间: 2010-6-10 16:43:33

好贴~~
作者: shsgl    时间: 2010-7-29 16:13:58

个系统交易的实例:夹板
作者: speed_fj    时间: 2010-7-29 20:20:04

研究看看
作者: fengfeng    时间: 2010-8-4 14:28:03

高低线怎么确定啊,是不是自己设定区间?
作者: linwei198711    时间: 2010-9-9 21:01:53

[img][/img]
作者: slash    时间: 2010-10-12 19:56:27

学习学习!谢谢...
作者: skyfis    时间: 2010-10-12 21:38:52

这个系统的上下线需要手动设置.
作者: hufumi    时间: 2010-10-24 13:23:45

谢了谢谢!一定好好学习
作者: www1652    时间: 2010-12-17 22:34:13

呵呵,原来还要扣钱和威望
作者: dmm1983825    时间: 2010-12-20 15:38:08

真是太好了,正在学习中
作者: dmm1983825    时间: 2010-12-20 15:39:00

feichangxiexie
作者: hxq316000    时间: 2010-12-24 11:17:42

学习中,只是太吃力了
作者: drasper    时间: 2010-12-27 10:24:21

学习中,认真消化!
作者: ycw800    时间: 2011-4-17 21:18:32

回复 30# srlzh


    真好   总金额拿回来,的、‘】
wrgbt
作者: kingeagle    时间: 2011-4-18 01:42:04

学习了。。
作者: zhuwjjun    时间: 2011-4-18 09:39:03

正在寻找相关的例子
作者: cecile8888    时间: 2011-4-18 12:07:40

多谢楼主!学习了!
作者: hongyangyang2    时间: 2011-4-19 17:46:06

非常感谢
作者: 飞跃    时间: 2011-4-19 19:22:08

谢谢LZ,认真学习研究一下
作者: myangsoft    时间: 2011-4-21 22:38:14

学习学习 不过老大如果把上下夹板参数计算的方法讲讲就好了
作者: myangsoft    时间: 2011-5-5 10:50:41

好东西 谢谢分享
作者: yaojb72    时间: 2011-5-16 15:42:59

实例可以加快学习速度!好东东
作者: lj911    时间: 2011-5-17 21:23:25

好贴,谢谢楼主无私的分享。好好学习下!
作者: livepu    时间: 2011-9-26 08:05:05

回复 2# skywalker


    在V4下,提示
NumericRef        needPosition;  申明错误

不知道如何处理呢?
作者: skyfis    时间: 2011-9-29 07:48:34

只能当作一个程序设计的范例来学习,没有包含算法,没有交易策略
作者: fangyuanning    时间: 2011-10-18 16:12:49

不错的例子,学习下。
作者: 光明之子    时间: 2011-10-22 09:06:57

没人测试过?
作者: kongwei1107    时间: 2011-11-11 10:20:40

回复 10# cqzzbszz


  请问:

日内短线的公式需要加载在图上,用多少周期的K线呢?
作者: xian_0_9    时间: 2011-11-11 10:39:33

嗯,好思路啊。能用于实盘吗
作者: 蔡宛宏    时间: 2011-12-16 17:21:41

谢谢楼主的无私分享,支持开源
作者: 分子式    时间: 2012-3-4 13:56:24

谢谢楼主的无私分享,支持开源
蔡宛宏 发表于 2011-12-16 17:21

非常感谢里!!!!
作者: 水流深    时间: 2012-6-9 21:00:30

好好学习
作者: stewen.net    时间: 2012-7-14 10:53:23

日内夹板交易系统,不错!!!
作者: yml6363    时间: 2012-7-21 09:36:22

一定好好学习
作者: 倔强    时间: 2012-7-21 09:52:14

学习中。。。

作者: badkingjy    时间: 2012-7-24 09:46:02

好东西!
作者: try    时间: 2012-8-15 21:03:21

学习谢谢
作者: zzf4615155    时间: 2012-8-21 13:23:04

好东西    值得学习
作者: huisee    时间: 2012-10-6 23:31:49


作者: 巴伊老爷-CYY    时间: 2012-11-22 03:47:28

hao si lu
作者: yhp2012    时间: 2012-12-21 17:55:02

学习了,写得很精妙,不过编译通过不了,唉,可能是早期版本的,这个比较郁闷。是不是应该解决下?
不然我等新手学习起来很吃力。
return现在的用法跟以前不一样了吧
用户函数的引用参数,返回值用法跟以前也不一样了吧
作者: 月夜微凉    时间: 2012-12-21 23:02:53

谢谢!一定好好学习
作者: loafertb    时间: 2013-2-16 15:09:14

意义不大,没实战性
作者: 天崖    时间: 2013-2-16 16:19:57

请版主好事做到底
版主的夹板实例非常好,值得好好学习。
但是,这个实例的关键好象还是在于确定夹板高低线的值。
不知道楼主有没有好的计算方法,可以确定比较好的高低线值。

十分感谢

作者: 小吉007    时间: 2013-2-18 12:43:05

这个公式用新版本已经不能编译了,楼主能不能修改一下~~~~~~~~
作者: 石头    时间: 2013-2-19 21:21:29

[attach]14011[/attach]


return 0;这个通不过,什么原因?
作者: skywalkerlin    时间: 2015-12-22 14:06:39

我看 OpenCover2lines函数里, 和程序主体里, 都有关于多头空头反转的功能?
为什么这么重复安排呢
作者: cts2015deng    时间: 2016-4-4 14:28:54

TB客服,能帮忙把这个整成在新版本里面可以用的吗,谢谢
作者: youhundi1    时间: 2016-7-26 15:05:42

编译通不过,“策略函数只能是基本类型”
作者: likeying    时间: 2016-11-6 07:41:15

看看,学习下
作者: alley_007    时间: 2016-11-17 18:16:06

个人认为,这可以作为一个通用的交易策略的框架,策略本身,作者没有透露
作者: yudeyinjixxd    时间: 2017-1-2 15:59:43

你好,版主,我是个TB初学者,我现在需要你发的这个帖子的程序代码,但是我不会整合,可否把您发的三个程序整合起来,变成一个完整的直接使用的新建公式发我一下,万分感谢!417846491@qq.com
作者: maobingbing    时间: 2021-7-24 21:55:04

很好




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2