使用SetDicValue和GetDicValue时数据异常

想用SetDicValue和GetDicValue来重构下代码,注意到几个问题#1 GetDicValue返回了False但是还是能取到Dic值直接运行SetDicValue函数文档页面上的代码 https://tbq3.tbquant.net/helper?product_id=991&keyword=1122&content_id=463&selectedkey=2427&type=article Vars Events OnReady() { //基础数据准备完成,若本地没有基础数据,会异步申请 DicData result; result.dataDateTime = SystemDateTime; result.setValue("DicValue"); //获取基础数据 Bool ret = SetDicData("MyDic", Symbol, result); Print("GetDicValue:" + IIFString(ret, "True", "False")); //获取基础数据 ret = GetDicData("MyDic", Symbol,SystemDateTime, result); String values; result.getValue(values); Print("GetDicValue:" + IIFString(ret, "True", "False") + ",dataDateTime = " + Text(result.dataDateTime) + ",pubDateTime = " + Text(result.pubDateTime) + ",data=" + values); } 发现输出的值里面GetDicData虽然返回了False, 但是依然成功读取了Dic里的值, 见下图#2 当使用非持久化的动态关联名的Dic时数据无法正确读取还是基于SetDicData文档上对非持久化Dic进行读写的代码,做了一点修改,把GetDicData那部分代码从OnReady挪到了OnBar里,然后就读出不值来了,修改后的代码如下:Events OnReady() { //基础数据准备完成,若本地没有基础数据,会异步申请 DicData result; result.dataDateTime = SystemDateTime; result.setValue("DicValue"); //获取基础数据 Bool ret = SetDicData("MyDic", Symbol, result); Print("SetDicValue:" + IIFString(ret, "True", "False")); } OnBar(ArrayRef<Integer> indexes) { //获取基础数据 DicData result; Bool ret = GetDicData("MyDic", Symbol,SystemDateTime, result); String values; result.getValue(values); Print("GetDicValue:" + IIFString(ret, "True", "False") + ",dataDateTime = " + Text(result.dataDateTime) + ",pubDateTime = " + Text(result.pubDateTime) + ",data=" + values); }单纯从代码运行结果来看,似乎离开了OnReady域之后, 赋值的Dic(“MyDic”, Symbol)的值就取不到了, 另外注意到文档上提到:说明:指定键名、关联名设置基础数据。 GetDicXXX 在策略研究、策略优化时,须确保在oninit订阅或在var定义dic变量; DeleteDicXXX,在策略研究、策略优化时不支持 SetDicXXX,在策略研究、策略优化时不支持尝试了下在Var里定义了固定名称的非持久化Dic变量,并在SetDicData和GetDicData使用时使用固定关联名来取代Symbol变量,则能正常获取数据,修改后的代码如下Vars Dic<String> MyDic("MyDic", False, "MySymbol"); Events OnReady() { //基础数据准备完成,若本地没有基础数据,会异步申请 DicData result; result.dataDateTime = SystemDateTime; result.setValue("DicValue"); //获取基础数据 Bool ret = SetDicData("MyDic", "MySymbol", result); Print("SetDicValue:" + IIFString(ret, "True", "False")); } OnBar(ArrayRef<Integer> indexes) { //获取基础数据 DicData result; Bool ret = GetDicData("MyDic", "MySymbol",SystemDateTime, result); String values; result.getValue(values); Print("GetDicValue:" + IIFString(ret, "True", "False") + ",dataDateTime = " + Text(result.dataDateTime) + ",pubDateTime = " + Text(result.pubDateTime) + ",data=" + values); }但是这样一来就没有办法利用SetDicData来定义动态键名和数据关联名的非持久化Dic变量了, 因为在Var中定义Dic变量时必须使用固定的键名和数据关联名。另外一种不需要在Var中明确定义Dic变量工作的方式就是把SetDicData持久化设为True, 这样即使是用Symbol变量作为动态的数据关联名也可以工作,但是因为异步的原因,第一次运行无法输出数据,第二次刷新就可以,应该是从数据库里读取了数据。我的问题是:#1 能不能用SetDicData创建动态数据基础键名和数据关联名的非持久化Dic变量?#2 如果SetDicData不行,那可以怎么做?#3 创建的非持久化Dic变量的使用范围是什么,在同一个策略单元里跨公式,还是可以跨不同的策略单元?

其实同步有很多方案简单列几种:1 基础数据非持久化(仅限于单元内部)/持久化(客户端公用 + 效率极低)2 读写数据库3 读写文件4 setBar/getBar(单元内部应该可行)5 事件(单元 && 客户端)6 订单流事件(单元 && 客户端 && 非TB单)。。。

If(iDiff <= 3 && LastEntryBarCount != InvalidInteger) { DeleteDicValue(GetWorkspaceName + "LongDec", Symbol); SetDicValue(GetWorkspaceName + "LongDec", Symbol, SystemDateTime, Data1.CurrentBar); }我感觉不需要做啥定义直接用就行了

回复:Bool isGetDic; isGetDic = GetDicValue(GetWorkspaceName + "LongDec", Symbol, SystemDateTime, temp_LongDec);

我用的不持久化正常的仅限于策略单元内部

很好的问题,但是哪位大神来回复一下啊,我给你顶一下