设为首页收藏本站

 找回密码
 注册
查看: 77666|回复: 87
打印 上一主题 下一主题

一个系统交易的实例:夹板 [复制链接]

Rank: 8Rank: 8

精华
2
UID
2
积分
3308
帖子
342
主题
6
阅读权限
200
注册时间
2007-7-20
最后登录
2013-5-25
跳转到指定楼层
1#
发表于 2008-5-24 13:52:23 |只看该作者 |倒序浏览
夹板在实盘中是一个很常见的运用,用于吃住震荡行情。它有个上轨和一个下轨,行情突破上轨就做空;突破下轨就做多,在上下轨之间来回吃。如图:


代码如下:

  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

复制代码
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

Rank: 8Rank: 8

精华
2
UID
2
积分
3308
帖子
342
主题
6
阅读权限
200
注册时间
2007-7-20
最后登录
2013-5-25
2#
发表于 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 编辑 ]

使用道具 举报

Rank: 8Rank: 8

精华
2
UID
2
积分
3308
帖子
342
主题
6
阅读权限
200
注册时间
2007-7-20
最后登录
2013-5-25
3#
发表于 2008-5-24 14:09:23 |只看该作者

夹板的公式导入文件

夹板的公式导入文件:
附件: 你需要登录才可以下载或查看附件。没有帐号?注册

使用道具 举报

Rank: 8Rank: 8

精华
2
UID
2
积分
3308
帖子
342
主题
6
阅读权限
200
注册时间
2007-7-20
最后登录
2013-5-25
4#
发表于 2008-5-24 14:18:59 |只看该作者
初学者一定要认真体会OpenCoverFor2Lines函数,为什么需要把开平仓算法包装到函数里。夹板是个半自动的系统,因为上下轨都需要作为参数输入。当你要转换成全自动系统的时候,那么上下轨就需要根据行情动态计算出来。把计算出来的值作为参数输入OpenCoverFor2Lines函数即可,如此程序就可以方便地拓展而不需要大改动。甚至你还可以再做一个函数用于动态计算上下轨。

[ 本帖最后由 skywalker 于 2008-5-24 15:15 编辑 ]

使用道具 举报

Rank: 8Rank: 8

精华
2
UID
2
积分
3308
帖子
342
主题
6
阅读权限
200
注册时间
2007-7-20
最后登录
2013-5-25
5#
发表于 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 编辑 ]

使用道具 举报

Rank: 7Rank: 7Rank: 7

精华
0
UID
938
积分
3765
帖子
295
主题
42
阅读权限
80
注册时间
2007-12-18
最后登录
2017-9-3
6#
发表于 2008-5-24 15:01:22 |只看该作者
这种结构值得借鉴,好。

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
1057
积分
824
帖子
158
主题
8
阅读权限
60
注册时间
2008-1-11
最后登录
2021-10-24
7#
发表于 2008-5-24 19:06:33 |只看该作者
得认真学习了
系统交易学徒

使用道具 举报

Rank: 3Rank: 3

精华
1
UID
1634
积分
159
帖子
28
主题
2
阅读权限
40
注册时间
2008-5-20
最后登录
2019-3-30
8#
发表于 2008-5-24 22:46:19 |只看该作者
谢谢!一定好好学习

使用道具 举报

Rank: 4

精华
0
UID
1527
积分
487
帖子
159
主题
3
阅读权限
50
注册时间
2008-4-21
最后登录
2019-3-31
9#
发表于 2008-5-24 23:41:58 |只看该作者
我觉得这个系统实战意义不大,原因我已经在未来函数中介绍了

使用道具 举报

Rank: 4

精华
0
UID
11
积分
380
帖子
67
主题
15
阅读权限
50
注册时间
2007-7-21
最后登录
2019-4-1
10#
发表于 2008-5-25 09:38:24 |只看该作者
学习一下。。。thx

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-4-25 04:54

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部