使用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变量的使用范围是什么,在同一个策略单元里跨公式,还是可以跨不同的策略单元?



如何在OnInit()中直接使用GetDicValue()读取基础数据
如何用SetDicValue把数据写入数据中心
GetDicValue 中 SystemDateTime, 参数的意义何在?
GetDicValue()获取数据为空
GetDicValue和GetDicData什么区别
SetDicValue-基础数据指定键名、关联名、时间写入
数据中心异常
使用Global变量和非持久化Dic存储数据时的性能问题 【内存使用很大】
关于跨周期时,使用subscribebar函数引用数据时的报错
登录异常