运行计算BUG

//方法一和方法二的,g_iCrossDownNum_1 与 g_iCrossDownNum_2不相等。按道理应该是相等的。 代码如下: Params Vars Global Integer g_iCrossUpNum_1(0); Global Integer g_iCrossDownNum_1(0); Global Integer g_iCrossUpNum_2(0); Global Integer g_iCrossDownNum_2(0); Defs Events OnInit() { SubscribeBar("al888.SHFE","1d",20150222); } //下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组 OnBarClose(ArrayRef<Integer> indexs) { Numeric pdi; Numeric mdi; Numeric adxr; Numeric adx; Numeric diff; Numeric iRet = 0; adx = getDMI(pdi,mdi,adxr); diff = pdi - mdi; //方法一:------------------------------- if(CrossOver(diff,0)){ // g_iCrossUpNum_1 = g_iCrossUpNum_1 + 1; } if(CrossUnder(diff,0)){ g_iCrossDownNum_1 = g_iCrossDownNum_1 + 1; PlotString("Down1",text(g_iCrossDownNum_1),High,yellow); } //方法二:-------------------------------为了提高运算效率,但运算结果不对。 if(CrossOver(diff,0)){ // g_iCrossUpNum_2 = g_iCrossUpNum_2 + 1; }else if(CrossUnder(diff,0)){ g_iCrossDownNum_2 = g_iCrossDownNum_2 + 1; PlotString("Down2",text(g_iCrossDownNum_2),low,green); } //方法一和方法二的,g_iCrossDownNum_1 与 g_iCrossDownNum_2不相等。按道理应该是相等的。 //我发现的问题出在:当前1个bar刚上穿,第2个bar下穿,则不会计算。所以,问题出在这里?我说清楚了没?现在键盘交给你。 if(g_iCrossDownNum_1 != g_iCrossDownNum_2) PlotBool("no",true); }

是不是这样的:让只要用到系列变量的函数在每根BAR都要被调用一次,让序列变量在该BAR上有值。这样后续bar用到前序bar时上的序列变量值,才能运算出正确的结果?我的理解正确否?

http://www.tbquant.net/community/113.html?cid=all

您好!最近发现还是有不少TB用户,对序列函数问题没搞清楚,我准备最近写篇文章把这个问题再说明一下。这里先给您解决下问题。如果我没看错的话,方法一的结果是对的,方法二是错的。原因就是因为CrossUnder(diff,0)是个序列函数,如果放在Else if里面就会有一半的机会不会运行,所以导致错误发生。