公式代码:
Params
//此处添加参数
Vars
//此处添加变量
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
SubscribeBar(Symbol, "5m", data0.BeginDateTime);
SubscribeBar(Symbol, "15m", data0.BeginDateTime);
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
Commentary("indexs array size=" + Text(GetArraySize(indexs)));
Numeric i;
Range[i = 0 : DataSourceSize - 1]
{
Commentary("size=" + Text(GetArraySize(indexs)) + ",i:" + Text(i));
}
}
公式加载在1分钟K线上,公式自己再订阅两个图层,共3个图层。
把鼠标放在图层0中Commentary的信息是正确的。
把鼠标放在图层1、2中Commentary中size的值大部分是1,有时显示2和3。这是为什么?
问题2:Range[i = 0 : DataSourceSize - 1]中i是否相当于For i = 0 To DataSourceSize - 1]的i?
问题3:怎样去理解这个Range[i = 0 : DataSourceSize - 1]?不是应该对更新的bar去循环吗:
For i = 0 To GetArraySize(indexs) - 1
{
Data[indexs[i]].
}
第一 如果是历史 一般都是固定的图层数量 如果是实时 不是固定 indexs里放的是队列里待命的驱动tick数据 举例如果indexs里是0 2 两个元素 说明队列里收到了图层1和图层3的新tick数据 需要驱动公式运行
第二 如果用for 那么后面的所有函数和变量都需要加上data[i].前缀 效果基本是一样的
range的动作是让一段代码批量获取多个图层的数据,批量执行多个图层上的函数等操作
你可以理解为让你的代码在range范围的图层上批量运行