应用场景:
使用一个不持久化的基础数据变量在不同的策略公式间传递数据,其中一个公式持续更新基础数据变量,其它的只是读取。
实测时发现如果不断的给一个基础数据变量赋值,每次都会加入一条新数据,代码如下:
Vars
Dic<Array<Numeric>> myDic("My_Dic", False, "system");
Global Array<Numeric> arr;
Events
OnBar(ArrayRef<Integer> indexs)
{
ArrayPushBack(arr, CurrentBar);
myDic = arr;
Print("#" + Text(CurrentBar) + " ->" + TextArray(myDic));
counter = counter + 1;
Print("CurrentDicCount: " + Text(CurrentDicCount(myDic)));
Print(Text(mytime) + "------------------");
}
随着代码运行可以看到CurrentDicCount在持续增加,如何才能确保始终只有最新的一条数据保存在基础数据变量里?
(试过用SetDicValue来指定一个固定的TimeStamp,能工作但是略繁琐)
我先说一下我读完代码的认识,你看有没有问题。
首先先准备一个arr数组,然后每次驱动onbar就把一个元素pushback到arr里,得到的结果就是每次驱动onbar,arr数组就会增加一个元素/
然后你用currentdiccount输出了一下每次驱动的时候,之前总共有几条dic数据。
按照你上面的逻辑,每执行一根历史bar,就会写入一条数组数据,数组长度等于当前curentbar。
这个是代码的执行结果。
我不清楚你为什么需要只保存最新一条数据,如果你只需要调用最新数据,那么调取当前bar或者上一根bar的数据即可,完全没必要把历史数据删除掉。
如果一定要删除,可以在读取完基础数据后,用deletedic删除基础数据,然后再在当前bar上写入。
老师的理解没有问题,确实是这样的。
实际的策略代码里保存的是一个二维数组,随着行情的发展动态分析行情,然后每次添加一部分到数组,分析时行情时只需要最新最完整的数据,不需要跟历史Bar关联,只是在最新的bar和tick更新时使用,所以历史版本不需要。我是觉得运行的久了数据会有点多,虽然可能也占用不了多少内存,但是没必要保存的东西总想还是不要保存比较好。
老师您提到删除数据那个思路我之前没想到,我会再看一下。我测试过的一个可用的方式是用SetDicValue函数,指定一个过去的时间,这样能做到始终只有一条,而且在历史bar上测试也能取到,代码片段如下
Numeric mytime = 19250127.110211; //设置的时间要早一些,这样历史bar也能取到值
SetDicValue("My_Dic", "system", mytime, arr, False);