开拓者期货期权程序化系统交易论坛
标题:
请问版主关于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
延迟发单请参考以下代码。
Params
Numeric FastLength(5);
Numeric SlowLength(20);
Numeric DelayTicks(5);
Vars
NumericSeries AvgValue1;
NumericSeries AvgValue2;
Numeric LastBarTime;
Numeric TickCounter;
Begin
AvgValue1 = AverageFC(Close,FastLength);
AvgValue2 = AverageFC(Close,SlowLength);
LastBarTime = GetGlobalVar(0);
TickCounter = GetGlobalVar(1);
If(BarStatus==2 && LastBarTime != Time)
{
LastBarTime = Time;
TickCounter = 0;
}
If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1])
{
If(MarketPosition==0 || BarStatus!=2)
{
Buy(1,Open);
}Else
{
BuyToCover(1,Open);
If(TickCounter==0)
{
TickCounter = 1;
}else If(TickCounter < DelayTicks)
{
TickCounter = TickCounter + 1;
}else
{
Buy(1,Open);
}
}
}
If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1])
{
If(MarketPosition==0 || BarStatus!=2)
{
SellShort(1,Open);
}Else
{
Sell(1,Open);
If(TickCounter==0)
{
TickCounter = 1;
}else If(TickCounter < DelayTicks)
{
TickCounter = TickCounter + 1;
}else
{
SellShort(1,Open);
}
}
}
SetGlobalVar(0,LastBarTime);
SetGlobalVar(1,TickCounter);
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
在历史上会反手的,代码中
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.回测是不会走到这个分支里的,回测历史的时候,是走到
If(MarketPosition==0 || BarStatus!=2)
{
Buy(1,Open);
}
复制代码
作者:
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