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

标题: 关于多图层合约的收盘价变动问题 [打印本页]

作者: deyintouzi    时间: 2019-11-18 13:20:12     标题: 关于多图层合约的收盘价变动问题

        问题如上,下图举例:
        [attach]38672[/attach]
        版主下午好,为什么我的公式调用了2个图层后,onBarOpen会运行两次,同时第二个图层输出得到的收盘价会不同呢?



作者: 小米    时间: 2019-11-18 13:52:23

软件导航页---TB量化学院--TBL语言--01公式运行机制--02多数据源的onbar机制
可以将上述内容着重看一下,其中有讲到两个图层在不同周期时的运算机制。
作者: deyintouzi    时间: 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运算两次后,原油的收盘价竟然是不一样的
作者: 小米    时间: 2019-11-18 15:54:10

deyintouzi 发表于 2019-11-18 14:25
版主,我用的是同一周期的啊,都是用1分钟周期的图层....
我在1分钟的螺纹连续上用SubscribeBar调用了1分 ...

以你的公式以及输出的日志,你是通过什么判断得到出会运行两次这样的结论。
这个运行两次是指什么时间范围内?
作者: czs763268157    时间: 2019-11-18 15:59:18

小米 发表于 2019-11-18 15:54
以你的公式以及输出的日志,你是通过什么判断得到出会运行两次这样的结论。
这个运行两次是指什么时间范 ...

因为每个图层运算一次,共两个图层,onBarOpen不就是输出两次了吗?
所以我的公式每分钟输出四条日志,第一楼的图片结果也的确是这样呀
作者: deyintouzi    时间: 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]));
                }
        }
作者: kyover    时间: 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时间等等参数也输出一下做一下验证
作者: deyintouzi    时间: 2019-11-19 16:13:24

kyover 发表于 2019-11-19 15:40
注意onbaropen(arrayref indexs)的这个indexs指的是驱动事件域运行的图层编号 所以当你有两个数据源 而这两 ...

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

本帖最后由 deyintouzi 于 2019-11-20 09:30 编辑
小米 发表于 2019-11-18 15:54
以你的公式以及输出的日志,你是通过什么判断得到出会运行两次这样的结论。
这个运行两次是指什么时间范 ...

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




作者: kyover    时间: 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数据来的更快一点

作者: deyintouzi    时间: 2019-11-21 09:26:50

kyover 发表于 2019-11-20 17:02
你还是没弄明白onbaropen的驱动机制 我给你讲个实际例子吧
现在有a、b两个图层 每个图层都有两根bar
a.cl ...

赞,那么再请教大哥一个问题:如何指定使用最后一个图层的数据呢?我的目的就是想要用到两个图层的都出现新bar后的数据,而不是半新半旧的数据
作者: 小米    时间: 2019-11-21 14:57:48

deyintouzi 发表于 2019-11-21 09:26
赞,那么再请教大哥一个问题:如何指定使用最后一个图层的数据呢?我的目的就是想要用到两个图层的都出现 ...

没法预知哪个图层的数据先来哪个图层的后到,以及何时会到啊。
如果是不太活跃的合约,可能整个bar的时间范围内都不会有数据来呢。
作者: deyintouzi    时间: 2019-11-21 15:36:39

小米 发表于 2019-11-21 14:57
没法预知哪个图层的数据先来哪个图层的后到,以及何时会到啊。
如果是不太活跃的合约,可能整个bar的时间 ...


那么请问版主能增加一个这样的函数吗?不需要判断先来后到,只需判断最后到的图层就好了
否则,跨品种进行数据比较都会出现信号闪烁的问题,而且公式运行结果就达不到预期了
作者: 小米    时间: 2019-11-21 17:05:57

deyintouzi 发表于 2019-11-21 15:36
那么请问版主能增加一个这样的函数吗?不需要判断先来后到,只需判断最后到的图层就好了
否则,跨品种进 ...

我会提交你的建议。
但是感觉可能性不大。。必竟运行机制是固定的。
作者: deyintouzi    时间: 2019-11-21 17:19:52

小米 发表于 2019-11-21 17:05
我会提交你的建议。
但是感觉可能性不大。。必竟运行机制是固定的。

谢谢版主,希望版主能尽量帮忙推荐一下这个建议,不然一些套利策略或对冲策略因为这个图层的问题来一个信号闪烁,最后开仓和平仓数量对不上就很大问题了....




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