全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
已解决
Nthcon在多图层运行问题
2022-09-28 00:26

我订阅日线和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);
            }
        }
    }

 

kyover

正在整理代码

2022-09-29 15:31
kyover

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只会触发一次,第二次进入函数的时候是不会回退的,不按触发图层处理的话,自己图层触发的执行会和其他图层触发的执行结果都会保存,相当于执行两次

2022-09-29 15:39
justin321

谢谢您的答复,初步验证单品多周期可行,后续将验证稍复杂点的。谢谢!

2022-09-30 15:08
您未登录,请先 登录注册 后发表评论
顶部