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));
}
麻烦各位大神解答下,试了好几个小时了。
谢谢老师的解答,我不知道只有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
求助求助