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