help,tbquant中通过基础数据获取结算价给我整不会了……

RT,根据官方文档各种试,还是不行,代码倒是能编译过,就是拿不到值。

相关部分代码如下

Vars

//此处添加变量

Dic<Array<Numeric>> tbSettlePrice("TB_SettlePrice"); //数据中心》基础数据》结算价


Events

//此处实现事件函数

//初始化事件函数,策略运行期间,首先运行且只有一次

OnInit()

{

//第一种尝试,stRet会返回false,失败

Array<Numeric> stValues;

Bool stRet = GetDicValue(tbSettlePrice, SystemDateTime, stValues);

Print("settlePrice getDictValue:" + IIFString(stRet, "True", "False") + ",values=" + TextArray(stValues));

///////////////

Numeric stValuesTwo;

//官方文档中另一种方法,第二种尝试,stRetTwo会返回false,失败

Bool stRetTwo = GetDicValue("TB_SettlePrice", "rb2504.SHFE", SystemDateTime, stValuesTwo);

Print("GetDicValue two:" + IIFString(stRetTwo, "True", "False") + ",values:" + Text(stValuesTwo));

}



麻烦各位大神解答下,试了好几个小时了。

基础数据中的holiday是怎么获取
使用基础数据TB_SettlePrice获取结算价,为什么获取不到当天的?
通过python写入基础数据
如何获取交易基础数据
基础数据
不持久化的基础数据能保留多久?
基础数据 获取一类合约列表
基础数据如何实时同步
基础数据的查询
请问可以通过tbpy获取bt中定义的指标么

谢谢老师的解答,我不知道只有888才有结算价——这正是问题的核心。


那就带来另一个问题了,我在版块上运行,比如运行到rb2504.SHFE了,TB中有没有专门的函数直接返回RB888的正确代码呢?如果要自己用字符串函数先拆再拼,所有合约的字母与年月格式好像并不统一,会稍微麻烦一点,而且有可能出错。

第三种方法出问题的原因,我猜测和第一种基本相同

图层使用rb888数据,正确读结算价

第二种写法,因为有了第一种写法的前车之鉴,我就把你的rb2405改成了rb888

但是还是查询失败


于是我思考了一下看看是不是函数使用或者容器的引用有问题

先看了函数使用,感觉没什么问题

然后再看看容器类型定义,这里在数据中心里特意关注了一下settleprice基础数据的容器类型,发现居然是数组

这个确实我也没想到,每根bar上的结算价就是单个元素,为什么会弄成数组呢?

当然研发人员做成这个类型肯定是有他的考虑,我们使用的时候按照他这里的类型去定义容器就行了。

回到代码里一看,果然发现你这个容器定义是不正确的。

我也挺纳闷的,第一个方法了你定义的明明是正确的,怎么第二个方法又定义错了呢?函数有多态的使用方法,但是基础数据的数据结构不管用什么态去读取都不会变啊?为什么要改容器类型呢?

后面把我这里改成了数组,查询又正常了。

简单来说,不是什么大问题,就是很多小细节基础,没有完全掌握,这里错一点那里错一点,最后导致奇奇怪怪的结果。分析起来没什么难度,就是比较浪费时间罢了

嗯,这个第二种写法,是我一直拿不到结算价,就各种开始魔改尝试了。

瞎瘠薄乱试的,甚至以为是数据中心给错类型了,所以才试试改容器类型,看看能不能拿到。



现在知道了,其实根本原因是rb2504.SHFE这种真实合约就是拿不到结算价——这个问题挺麻烦的,因为我就是要在版块上运行。

两种方法单独说明吧

首先,你的代码放错位置了。

结算价这种数据,本身是跟随k线的序列数值,每个k线上都有自己的结算价。

所以你放在oninit里,然后用systemdatetime获取,这个是没问题的,我不知道你为什么说失败了。

但是根据你第二个方法填的symbol,我发现你要查询的是rb2405合约的结算价。谨慎起见,我去数据中心同步了一下结算价这个基础数据,发现,结算价只支持连续合约。

所以你失败大概率原因,是你加载在一个非连续合约上了。

查不到2405合约,只有rb888

糟糕了,如果只能在888上拿到结算价,无法在rb2504.SHFE这种真实合约上获取结算价,那岂不是没办法在TB提供的版块“商品主力合约”中拿到结算价?????

你是根据哪个文档不行的?

另外发代码用代码模式,文本模式很难阅读

DicData stResult;

//这种方式(以及GetDicData的另一种方式)也试过,stRet还是返回false

Bool stRet = GetDicData(tbSettlePrice, SystemDateTime, stResult);

Array<Numeric> stValues;

stResult.getValue(stValues);

Print("GetDicValue:" + IIFString(stRet, "True", "False") + ",dataDateTime = " + Text(stResult.dataDateTime) + ",pubDateTime = " + Text(stResult.pubDateTime) + ",data=" + TextArray(stValues));

上面是我最后一版的公式代码。

实际上我两种方式的GetDicData与两种方式的GetDicValue都试遍了。

最后甚至怀疑是不是不用一维数组接收、于是用单个的数值变量接受,依然还是拿不到值。


help

求助求助