我订阅日线和3分钟周期的数据,在日线运行Nthcon发现数据有问题,比如a=NthCon(hipoint120,1),有一段时间,如在2020/11/28和2020/11/27的数据分别是184,182,间隔2个数,而不是像184,183间隔1个数/bar。而在其它时间如2019/5/24的数据却是间隔1个数-合常规。
还有我订阅把3分钟改成1分钟,好像所有的间隔2个数都消失,我只验证有限数据。
请问这是啥原因,如何解决?注我替身处理了序列数。
证据照片和复现代码如下:
Params
array<string> mysymbol(["ni888.SHFE"]);
Vars
Series<Numeric> sma120;
Numeric Nth_hi120;
Numeric Nth_lo120;
Numeric i;
Numeric d(2);
bool hipoint120;
bool lopoint120;
Events
OnInit()
{
SubscribeBar(mysymbol[i],"1d",20170101);
SubscribeBar(mysymbol[i],"3m",20190801);
}
OnBarOpen(ArrayRef<Integer> indexs)
{
for i = 0 to GetArraySize(mysymbol)-1//
{
if(data[d*i+0].CurrentBar>0)
{
data[d*i+0].sma120 = data[d*i+0].SAverage(TrueRange,90)/data[d*i+0].XAverage(c,90);
data[d*i+0].sma120 = data[d*i+0].SAverage(sma120,30);
data[d*i+0].PlotNumeric("TUema120=",sma120[1]*10000*500,c,DarkBrown);
data[d*i+0].hipoint120 = data[d*i+0].sma120[1] < data[d*i+0].sma120[2] and data[d*i+0].sma120[2] >= data[d*i+0].sma120[3];
data[d*i+0].lopoint120 = data[d*i+0].sma120[1] > data[d*i+0].sma120[2] and data[d*i+0].sma120[2] <= data[d*i+0].sma120[3];
data[d*i+0].Nth_hi120 = data[d*i+0].NthCon(hipoint120,1);//第一远高点距离当前bar的K线数
data[d*i+0].Nth_lo120 = data[d*i+0].NthCon(lopoint120,1);//第一低点距离K线数
data[d*i+0].PlotNumeric("Nth_hi120=", Nth_hi120,c,green);
data[d*i+0].PlotNumeric("Nth_lo120=", Nth_lo120,c,green);
}
}
}
谢谢您的答复,初步验证单品多周期可行,后续将验证稍复杂点的。谢谢!
Params
array<string> mysymbol(["ni888.SHFE"]);
Vars
Series<Numeric> sma120;
Numeric Nth_hi120;
Numeric Nth_lo120;
Numeric i;
Numeric d(2);
bool hipoint120;
bool lopoint120;
Events
OnInit()
{
SubscribeBar(mysymbol[i],"1d",20170101);
SubscribeBar(mysymbol[i],"3m",20190801);
}
OnBarOpen(ArrayRef<Integer> indexs)
{
for i = 0 to GetArraySize(indexs)-1//
{
if(data[indexs[i]].CurrentBar>0)
{
data[indexs[i]].sma120 = data[indexs[i]].SAverage(TrueRange,90)/data[indexs[i]].XAverage(c,90);
data[indexs[i]].sma120 = data[indexs[i]].SAverage(sma120,30);
data[indexs[i]].PlotNumeric("TUema120=",sma120[1]*10000*500,c,DarkBrown);
data[indexs[i]].hipoint120 = data[indexs[i]].sma120[1] < data[indexs[i]].sma120[2] and data[indexs[i]].sma120[2] >= data[indexs[i]].sma120[3];
data[indexs[i]].lopoint120 = data[indexs[i]].sma120[1] > data[indexs[i]].sma120[2] and data[indexs[i]].sma120[2] <= data[indexs[i]].sma120[3];
data[indexs[i]].Nth_hi120 = data[indexs[i]].NthCon(hipoint120,1);//第一远高点距离当前bar的K线数
data[indexs[i]].Nth_lo120 = data[indexs[i]].NthCon(lopoint120,1);//第一低点距离K线数
data[indexs[i]].PlotNumeric("Nth_hi120=", Nth_hi120,c,green);
data[indexs[i]].PlotNumeric("Nth_lo120=", Nth_lo120,c,green);
}
}
}
改成这样试试
主要原因是onbaropen和onbar的重置机制不一样,onBarOpen事件一定要严格按照indexs参数处理,因为onBarOpen每根Bar只会触发一次,第二次进入函数的时候是不会回退的,不按触发图层处理的话,自己图层触发的执行会和其他图层触发的执行结果都会保存,相当于执行两次
正在整理代码