设为首页收藏本站

 找回密码
 注册
查看: 2157|回复: 3

平仓反手信号问题 [复制链接]

Rank: 1

精华
0
UID
249830
积分
18
帖子
9
主题
3
阅读权限
10
注册时间
2017-4-9
最后登录
2020-12-5
发表于 2017-4-16 19:14:14 |显示全部楼层
很简单的金叉进场做多策略,根据指南平仓后延迟反手代码写的,代码如下:

其中DelayTicks=5,lots=1

// 金叉发生时进场做多
        If(ConCrossOver[1])
        {
                If(MarketPosition == 0 || BarStatus != 2)
                // 无持仓,直接买多仓;持空仓且Bar 不是实时行情,平空仓,买多仓
                {
                Buy(Lots,0);
                }Else // 持空仓,Bar 实时行情,平空仓,通过TickCounter计数,延迟反手
                {
                        BuyToCover(0,0);
                        If(TickCounter == 0)
                        {
                        TickCounter = 1;
                        }Else If(TickCounter < DelayTicks)
                        {
                                TickCounter = TickCounter + 1;
                        }Else
                        {
                                Buy(Lots,0);
                        }
                }
        }

做的是5分钟策略,根据图表,22:25的bar产生了信号,日志如下:
2017/04/14 22:25:01.294自动交易信息:帐户[102050151]商品[a1709]类型[买平]数量[1]价格[3876.00000000]注释[MINMA]

2017/04/14 22:30:00.624自动交易信息:帐户[102050151]商品[a1709]类型[买开]数量[1]价格[3896.00000000]注释[MINMA]

有一个情况是我是刚开始使用,因此信号发出之前头寸为0,图表头寸是1个空仓,因此买平的单子没有交易成功。

现在的问题是:平仓单发了,但是反手单没有在5个tick后发,而是下一个bar一开始发了,请问是哪里出问题了?请版主帮忙看下,谢谢


Rank: 1

精华
0
UID
249830
积分
18
帖子
9
主题
3
阅读权限
10
注册时间
2017-4-9
最后登录
2020-12-5
发表于 2017-4-16 19:44:34 |显示全部楼层
查了下论坛,好像22:30那个发单是因为新的bar的第一个tick来的时候,要按照上一个bar的最后一个tick的barstatus=1来再执行一遍?

使用道具 举报

Rank: 1

精华
0
UID
249830
积分
18
帖子
9
主题
3
阅读权限
10
注册时间
2017-4-9
最后登录
2020-12-5
发表于 2017-4-16 22:49:43 |显示全部楼层
没有反手的问题找到原因了,是因为忘了写

SetGlobalVar(0,LastBarTime);
SetGlobalVar(1,TickCounter);

这两个给全局变量赋值的语句。。。

使用道具 举报

Rank: 1

精华
0
UID
249830
积分
18
帖子
9
主题
3
阅读权限
10
注册时间
2017-4-9
最后登录
2020-12-5
发表于 2017-4-16 23:06:13 |显示全部楼层
我想问题应该是解决了。

首先平仓信号是没有问题的,虽然我实际没仓位导致发的单子并没有送到柜台,但是程序没问题。
然后按道理是应该反手开仓,但是由于我忘了写setglobalvar函数,实际上计数器没有起作用,tickcount的数值没有变。
然后到下一个bar也就是22:30这个bar的第一个tick产生时,tb会把上一个bar的barstatus由2变成1后再执行一次上一个bar,因此这个时候实际上执行了
If(MarketPosition == 0 || BarStatus != 2)这个分支,而且关键是“补充执行”是要发单的,在22:30:00发了一个buy单,并且成交。

通过这个案例,我再次理解了几个问题:
1、全局变量的使用:getglobalvar和setglobalvar要配合一起使用,不停的取出值再赋值回去,从而不停改变全局变量的值。
2、当新bar产生时,新bar的第一个tick到达时,系统会执行两次程序,第一次是把旧bar的最后一个tick的barstatus由2变成1后,再执行一次旧bar,并且如果有信号,是会发出信号的;第二次是执行新bar。
3、buy、sell等函数,再同一个bar上是只会发出一个发单信号。我如果写对了,那么只会在5个tick后发出建仓单,但是由于我的建仓单实际上并没有发出,因此到了新bar产生的时候,补充执行旧bar的最后一个tick时,建仓信号才第一次成立,导致发单。

使用道具 举报

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

bottom

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

GMT+8, 2024-3-29 17:31

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部