//方法一和方法二的,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里面就会有一半的机会不会运行,所以导致错误发生。