设为首页收藏本站

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

关于多图层合约的收盘价变动问题 [复制链接]

Rank: 2

精华
0
UID
284763
积分
108
帖子
49
主题
19
阅读权限
30
注册时间
2019-10-15
最后登录
2021-3-3
跳转到指定楼层
1#
发表于 2019-11-18 13:20:12 |只看该作者 |倒序浏览
        问题如上,下图举例:
        
        版主下午好,为什么我的公式调用了2个图层后,onBarOpen会运行两次,同时第二个图层输出得到的收盘价会不同呢?


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

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
2#
发表于 2019-11-18 13:52:23 |只看该作者
软件导航页---TB量化学院--TBL语言--01公式运行机制--02多数据源的onbar机制
可以将上述内容着重看一下,其中有讲到两个图层在不同周期时的运算机制。

使用道具 举报

Rank: 2

精华
0
UID
284763
积分
108
帖子
49
主题
19
阅读权限
30
注册时间
2019-10-15
最后登录
2021-3-3
3#
发表于 2019-11-18 14:25:00 |只看该作者
本帖最后由 deyintouzi 于 2019-11-18 14:27 编辑
小米 发表于 2019-11-18 13:52
软件导航页---TB量化学院--TBL语言--01公式运行机制--02多数据源的onbar机制
可以将上述内容着重看一下,其 ...

版主,我用的是同一周期的啊,都是用1分钟周期的图层....
我在1分钟的螺纹连续上用SubscribeBar调用了1分钟的原油连续,代码如下:
OnInit()
        {
                layers[0]=SubscribeBar("sc888.INE","1m",20191101.0900);                //订阅10min的sc888数据
                myMinMove = minmove*pricescale;
        }
        OnBarOpen(ArrayRef<Integer> indexs)
        {        
              If(BarStatus == 2)
                {
                        FileAppend("D:\\输出文件\\d_"+SymbolName+".Log","Open->时间:"+Text(CurrentTime)+",Data0.Close="+Text(Close[1]));
                        FileAppend("D:\\输出文件\\d_"+SymbolName+".Log","Open->时间:"+Text(CurrentTime)+",data1.Close="+Text(data1.Close[1]));
                }
        }

主要问题还是为什么onBarOpen运算两次后,原油的收盘价竟然是不一样的

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
3
UID
5
积分
26584
帖子
12686
主题
49
阅读权限
200
注册时间
2007-7-20
最后登录
2021-11-3
4#
发表于 2019-11-18 15:54:10 |只看该作者
deyintouzi 发表于 2019-11-18 14:25
版主,我用的是同一周期的啊,都是用1分钟周期的图层....
我在1分钟的螺纹连续上用SubscribeBar调用了1分 ...

以你的公式以及输出的日志,你是通过什么判断得到出会运行两次这样的结论。
这个运行两次是指什么时间范围内?

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
282705
积分
223
帖子
93
主题
28
阅读权限
40
注册时间
2019-8-19
最后登录
2020-3-31
5#
发表于 2019-11-18 15:59:18 |只看该作者
小米 发表于 2019-11-18 15:54
以你的公式以及输出的日志,你是通过什么判断得到出会运行两次这样的结论。
这个运行两次是指什么时间范 ...

因为每个图层运算一次,共两个图层,onBarOpen不就是输出两次了吗?
所以我的公式每分钟输出四条日志,第一楼的图片结果也的确是这样呀

使用道具 举报

Rank: 2

精华
0
UID
284763
积分
108
帖子
49
主题
19
阅读权限
30
注册时间
2019-10-15
最后登录
2021-3-3
6#
发表于 2019-11-19 13:48:46 |只看该作者
小米 发表于 2019-11-18 15:54
以你的公式以及输出的日志,你是通过什么判断得到出会运行两次这样的结论。
这个运行两次是指什么时间范 ...

版主,怎么这么久也没有回复啊?我把上面的程序再次简单化了,问题还是一样....
如果你是认为我说的不对,那你可以尝试运行一下,运行后你就发现问题啦!
简化版如下:
Params
Vars
        Global Array<Integer> layers;                //记录订阅bar之后返回的图层号
Events
        //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
        OnInit()
        {
                layers[0]=SubscribeBar("sc888.INE","1m",20191101.0900);                //订阅10min的sc888数据
        }
        OnBarOpen(ArrayRef<Integer> indexs)
        {
            If(BarStatus == 2)
                {
                        FileAppend("D:\\输出文件\\d_"+SymbolName+".Log","Open->时间:"+Text(CurrentTime)+",Data0.Close="+Text(Close[1]));
                        FileAppend("D:\\输出文件\\d_"+SymbolName+".Log","Open->时间:"+Text(CurrentTime)+",data1.Close="+Text(data1.Close[1]));
                }
        }

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
235653
积分
19
帖子
15
主题
2
阅读权限
200
注册时间
2016-5-31
最后登录
2021-8-31
7#
发表于 2019-11-19 15:40:50 |只看该作者
注意onbaropen(arrayref<integer> indexs)的这个indexs指的是驱动事件域运行的图层编号 所以当你有两个数据源 而这两个数据源收到最新bar数据的时间可能是不一样的 有一个先后顺序
那么假使0号图层数据先到 那么indexs==0的状态下驱动onbaropen事件域运行 写入两行fileappend日志
然后1号图层数据后到 那么indexs==1的状态下驱动onbaropen事件域运行 再次写入两行fileappend日志 由于1号图层数据发生了更新,那么自然和上面两行日志价格不一样了
你可以尝试把indexs这个值以及bar时间等等参数也输出一下做一下验证

使用道具 举报

Rank: 2

精华
0
UID
284763
积分
108
帖子
49
主题
19
阅读权限
30
注册时间
2019-10-15
最后登录
2021-3-3
8#
发表于 2019-11-19 16:13:24 |只看该作者
kyover 发表于 2019-11-19 15:40
注意onbaropen(arrayref indexs)的这个indexs指的是驱动事件域运行的图层编号 所以当你有两个数据源 而这两 ...

先谢过这位大哥,不过我的代码输出的内容是上一个bar的收盘价,这是按理说应该是一个定值,所以两个图层运行时间不同,结果也应该是一样的吧。
不过我刚才重新运行程序,发现onOpenBar好像由运算两次变成1次了,这次只输出了2条数据,好奇怪...昨天还是输出4条数据的.

使用道具 举报

Rank: 2

精华
0
UID
284763
积分
108
帖子
49
主题
19
阅读权限
30
注册时间
2019-10-15
最后登录
2021-3-3
9#
发表于 2019-11-20 09:27:32 |只看该作者
本帖最后由 deyintouzi 于 2019-11-20 09:30 编辑
小米 发表于 2019-11-18 15:54
以你的公式以及输出的日志,你是通过什么判断得到出会运行两次这样的结论。
这个运行两次是指什么时间范 ...

版主早上好,我发现我的程序首次运行日志只有2行,然后每一分钟过后日志输出就变成4行了,请解惑!
代码在6楼,在策略交易用1min周期运行即可,例图如下:




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

使用道具 举报

Rank: 10Rank: 10Rank: 10

精华
0
UID
235653
积分
19
帖子
15
主题
2
阅读权限
200
注册时间
2016-5-31
最后登录
2021-8-31
10#
发表于 2019-11-20 17:02:06 |只看该作者
本帖最后由 kyover 于 2019-11-21 13:37 编辑
deyintouzi 发表于 2019-11-19 16:13
先谢过这位大哥,不过我的代码输出的内容是上一个bar的收盘价,这是按理说应该是一个定值,所以两个图层 ...


你还是没弄明白onbaropen的驱动机制 我给你讲个实际例子吧
现在有a、b两个图层 每个图层都有两根bar
a.close1 表示a图层的第1根bar的收盘价
b.close2 表示b图层的第2跟bar的收盘价
以此类推
当前2个图层分别有2根bar,这个时候由于2个合约接受新数据的时间不一定一致,假定a图层先出现了新的bar,那么此时的onbaropen是由于a图层出现新bar驱动运行,因为a图层出现了新的bar,那么在这新的第3根bar上,close[1]实际代表的是a.close2,也就是a图层的第2根bar的收盘价
所以fileappend输出的实际上是
data0.close[1] == a.close2
而b图层并没有出现新的bar,所以
data1.close[1] == b.close1

这个时候,图上是有5根bar的,a图层3根,b图层2根

接下来,b图层收到新数据,驱动onbaropen运行
那么此时,图上有6根bar了,a图层3根,b图层3根
这个时候
data0.close[1] = a.close2
data1.close[1] = b.close2

所以第1行的输出不变,而第2行的输出变化了,从b.close1变成了b.close2
你可以去验证一下对不对
如果是第1行变了,那说明图层2数据来的更快一点

使用道具 举报

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

bottom

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

GMT+8, 2024-5-1 00:29

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部