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

标题: 请问版主关于buy的问题 [打印本页]

作者: mars622160    时间: 2011-11-21 10:39:08     标题: 请问版主关于buy的问题

请问版主:

说明文档中关于buy函数是的解释是“先平掉所有空头仓位,然后再开规定的多头手数”



我的语句为:如果满足条件(条件用close[1]来写),则执行buy(1,close[1],false),假设在某一个bar上,满足条件,并且此时我持有一手空头仓位,我想问的是:

执行过程是以下中的哪一个:(1)先平掉一手空头仓位,然后马上开一手多头?(平空仓和开多仓中间有时间延迟)(2)还是在平掉一手空头的瞬时就开了一手多仓?
作者: lh948    时间: 2011-11-21 11:12:07

回复 1# mars622160


其实开仓和平仓他是同时发出委托单的。是你所指的(2)的情况,反手要准备两手的资金。
作者: mars622160    时间: 2011-11-21 12:16:02

回复 2# lh948

非常感谢您的指教,但是如果用反手开仓函数buy总是要准备两手资金的话,这样会造成资金的浪费,我想达到差不多开仓效果,然后又只有一手资金,请问有没有办法解决呢?(或者说有没有办法让平仓和开仓有时间延迟,或者还有什么其他的好办法)非常感谢!
作者: lh948    时间: 2011-11-21 16:30:07

回复 3# mars622160
延迟发单请参考以下代码。
  1. Params
  2.         Numeric FastLength(5);
  3.         Numeric SlowLength(20);
  4.         Numeric DelayTicks(5);
  5. Vars
  6.         NumericSeries AvgValue1;
  7.         NumericSeries AvgValue2;
  8.         Numeric LastBarTime;
  9.         Numeric TickCounter;
  10. Begin
  11.         AvgValue1 = AverageFC(Close,FastLength);
  12.         AvgValue2 = AverageFC(Close,SlowLength);
  13.        
  14.         LastBarTime = GetGlobalVar(0);
  15.         TickCounter = GetGlobalVar(1);
  16.         If(BarStatus==2 && LastBarTime != Time)
  17.         {
  18.                 LastBarTime = Time;
  19.                 TickCounter = 0;
  20.         }
  21.        
  22.         If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1])
  23.         {
  24.                 If(MarketPosition==0 || BarStatus!=2)
  25.                 {
  26.                         Buy(1,Open);
  27.                 }Else
  28.                 {
  29.                         BuyToCover(1,Open);
  30.                         If(TickCounter==0)
  31.                         {
  32.                                 TickCounter = 1;
  33.                         }else If(TickCounter < DelayTicks)
  34.                         {
  35.                                 TickCounter = TickCounter + 1;                       
  36.                         }else
  37.                         {
  38.                                 Buy(1,Open);
  39.                         }
  40.                 }
  41.         }
  42.        
  43.         If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1])
  44.         {
  45.                 If(MarketPosition==0 || BarStatus!=2)
  46.                 {
  47.                         SellShort(1,Open);
  48.                 }Else
  49.                 {
  50.                         Sell(1,Open);
  51.                         If(TickCounter==0)
  52.                         {
  53.                                 TickCounter = 1;
  54.                         }else If(TickCounter < DelayTicks)
  55.                         {
  56.                                 TickCounter = TickCounter + 1;                       
  57.                         }else
  58.                         {
  59.                                 SellShort(1,Open);
  60.                         }
  61.                 }
  62.         }
  63.        
  64.         SetGlobalVar(0,LastBarTime);       
  65.         SetGlobalVar(1,TickCounter);
  66. End
复制代码

作者: mars622160    时间: 2011-11-21 16:41:47

本帖最后由 mars622160 于 2011-11-21 16:43 编辑

回复 4# lh948

谢谢楼主,但我还想问用下面的方法写不知道可不可以:

if(con[1]=true)
{
Buytocover(1,close[1],false);
Buy(1,close[1],false);
}

这样不知道会不会“平仓时间和开仓时间有一定的延迟“,然后用1手资金也可以在平空仓的同时反手开多仓?(或者说上面的Buytocover和Buy也基本是同时执行的,平仓时间和开仓时间不会有延迟
作者: lh948    时间: 2011-11-22 09:02:11

回复 5# mars622160


上面的语句也是会同时执行的。
作者: mars622160    时间: 2011-11-23 09:16:17

回复 6# lh948

请问楼主,您给我的代码在实盘中可以实现延迟开仓,但是在回测的时候就无法实现了对吧,因为回测时每根bar上只有,open,high,low,close,没有tick数据进来,您上面代码中的tickcounter的值也不会增加,所以回测显示的结果是不会反手开仓(但是实盘中会反手开仓),不知道这样理解是否对,谢谢!
作者: lh948    时间: 2011-11-23 09:26:32

回复 7# mars622160


在历史上会反手的,代码中
  1. If(MarketPosition==0 || BarStatus!=2)
复制代码
将情况分为历史和最后一根bar
作者: mars622160    时间: 2011-11-24 12:43:22

本帖最后由 mars622160 于 2011-11-24 12:57 编辑

回复 8# lh948

不好意思,再请问楼主:

(1)以下代码在整段程序中的作用是什么?不是太理解,我的理解就是在每根bar的第一个tick上把LastBarTime赋值为当前bar的时间,而让tick计数器的值变为0,但是条件中有“BarStatus==2“,这就表明是在超级图表中的最后一个bar上才执行,这在实盘中没有问题,但是回测时,中间bar的BarStatus都不为2,这个语句如何能够在回测中正常运行?望楼主解惑,谢谢!


If(BarStatus==2 && LastBarTime != Time)

        {

                LastBarTime = Time;

                TickCounter = 0;

        }



(2)假设在同一根bar上,TB的运行机制是每进入一个tick就把所有代码都运行一遍,运行到代码中的“ TickCounter = TickCounter + 1;”时,等号右边的“TickCounter”是上一个tick计算好的TickCounter值吗?因为TickCounter只是普通变量(非序列型变量),如何能够获得上一个tick计算的TickCounter值?

这样理解是否对:在同一根bar上,要获得上一个tick计算得到的TickCounter值,必须引入全局变量“SetGlobalVar(1,TickCounter);”,这样就把上一个tick计算得到的TickCounter值保留在全局变量中,在当前tick刚开始时,调用“ TickCounter = GetGlobalVar(1);”就把上一个tick计算得到的TickCounter值保留到当前tick中了,不知道这样理解是否对?




(3)顺便问下:全局变量的作用是否就是让变量的值在不同tick和不同bar中都可以保留,从而让变量的值不会被重新赋予初值它与序列变量的最大区别是:序列变量只能保留前一根bar的最后一个tick计算得到的变量值,而全局变量可以保留每个tick计算得到变量值。


(4)以上代码在V3中运行应该也没有逻辑问题对吧?谢谢!


非常感谢您的回答!
作者: lh948    时间: 2011-11-25 15:00:16

回复 9# mars622160


1.回测是不会走到这个分支里的,回测历史的时候,是走到
  1. If(MarketPosition==0 || BarStatus!=2)
  2.                 {
  3.                         Buy(1,Open);
  4.                 }
复制代码

作者: lh948    时间: 2011-11-25 15:06:46

回复 9# mars622160

2.对的,TickCounter从全局变量存储来的
3.全局变量不会收到的bar数据的改变而改变,是独立于k线的,普通变量都是跟着k线走的。
4.V3里还需要进一步调试,建议使用v4
作者: mars622160    时间: 2011-11-25 17:17:12

回复 11# lh948

非常感谢您的回答,我还有两个疑问:

1.如果使用延迟发单操作,是否会造成回测和真实交易有很大的不一致的情况?(因为回测时只有open,high,low,close,没有tick数据,只有用open,high,low,close成交才能让回测和真实交易一致)

2.TB的交易助手里面有没有什么功能实现延迟发单的操作(不是全部延迟,而是使用buy后,会造成交易一手需要准备两手资金的情况,所以想把平空仓和反手开多仓间隔一定的时间,不知道TB交易助手里有没有这样的功能),感觉编写程序还是容易出错
作者: lh948    时间: 2011-11-27 10:52:01

1.没有办法做到一模一样的
2.没有
作者: mars622160    时间: 2011-11-27 15:21:12

本帖最后由 mars622160 于 2011-12-7 12:15 编辑

回复 13# lh948

不好意思,今天测试时又发现了一点问题,在您给的如下代码中:

        If(BarStatus==2 && LastBarTime != Time)

        {

                LastBarTime = Time;

                TickCounter = 0;

        }

上面语句如果是在实盘中,则假设现在在最新一根bar上,则BarStatus==2满足,随着最后一根bar上不同的tick进入,则LastBarTime != Time也是满足的(因为即使在同一个bar上,每个tick对应的time也是不同的,time在秒级别上,肯定有所不同),所以上面if后的语句在每个tick进入后都执行一次,这样的话在最后一根bar上“TickCounter = 0;”就不断被执行,这样应该是不对的吧?

望解惑,谢谢楼主啊!
作者: lh948    时间: 2011-11-28 09:42:40

回复 14# mars622160


如果您是在tick级别上使用,那么就不需要使用这个函数来延迟了,数bar就可以了。
作者: mars622160    时间: 2011-11-28 09:47:30

本帖最后由 mars622160 于 2011-11-28 09:53 编辑

回复 15# lh948

问题1.那您的代码适合在什么周期使用呢?

问题2.还有就是我上面的理解是否对呢,是否会出现上面的说的问题:在最后一根bar上“TickCounter = 0;”就不断被执行”(我使用的周期是在1分钟框架下)

非常感谢您耐心的解答!谢谢!

PS:我以前都是在open处发单,但是发现使用Buy后,交易1手需要2手的资金,所以想在open处平仓,然后过几秒再反向开仓,这样就只需要一手的资金了
作者: lh948    时间: 2011-11-28 10:07:17

1.非tick周期都可以用
2.1分钟time的秒信息都为0
作者: hyqspuy01    时间: 2012-1-17 15:45:12

啊?坐着可见
作者: hyqspuy01    时间: 2012-1-17 15:49:21

回复 17# lh948


    作者可见。管理员大人能不能取消这个。。。
作者: neo_wing    时间: 2012-2-2 12:21:19

为什么回复都是仅作者可见呢
作者: hc27080401    时间: 2012-2-4 09:52:19

mark一下
作者: yangedwin99    时间: 2012-2-15 18:55:15

为啥看不到回复?
作者: wcnmddfby    时间: 2012-3-2 19:50:08

我也在这个问题中痛苦着。
作者: wcnmddfby    时间: 2012-3-2 19:51:46

本来是自动化,结果弄到现在,还多了一件事情。不光是要盯着行情。还要盯着TB。
作者: s317503165    时间: 2012-3-28 15:39:42

回复 4# lh948


    老大,你的反手延时开仓模板有问题啊,当我延时5秒后,正好换了根K线,那就不开仓了,老大,修改下模板吧
作者: CrewsHe    时间: 2012-4-13 12:43:48

学习中
作者: lnyuanming    时间: 2012-4-14 08:59:25

真够愁人的,你们开发个延时函数能有多难,还让我们加这个弄那个的。
作者: s040440331    时间: 2012-7-16 19:53:35

好帖,学习
作者: 浪漫z    时间: 2012-10-10 09:06:23

感谢lh948管理员对这个问题的耐心回复,也感谢楼主提出好的问题。学习了。
作者: TBLearning    时间: 2014-3-13 15:35:49

楼主的深入与细致,值得晚辈学习,赞一个
作者: cf_753168    时间: 2017-2-17 22:24:51

用了,只能平仓,不能开仓





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