关于IF或者循环程序体内不能用序列变量的疑问
2023-12-24 17:41

关于IF条件判断、IF程序体内、循环程序体内均不能用序列函数的问题,之前看了这篇贴子,如下: http://auth.tb18.net/community/landlord.html?id=113

能理解贴子里说的意思,也就说如果要用序列函数,那么一定要把序列函数先在IF程序体外面或者循环体外面先赋值给简单变量,然后在IF程序体或者循环体内用这个简单变量即可。

但有两点不明白,请教各位老师。

1、把序列函数赋值给简单变量的这一句写在IF程序体外面或者循环体外面,但这个外面本身又在更大的IF程序体里面或者循环体里面,该怎么办呢?是一直要追溯代码,放在最大的那个IF程序体外面吗?还是说只要放在即将要使用到这个序列函数的小的IF程序内外面就行了呢?

举个例子,比如以下一段代码:

if (statusMap[Symbol()+\"_\"+Frequency] == 3)

{

Commentary(\"prep close buy\");

Bool isClose = false;

       Bool lossClose=residval < meanval;

if (lossClose)

{

Commentary(\"多头中轨平仓信号\");

isClose=True;

statusMap[Symbol()+\"_\"+Frequency] = 5;

}

   ---因为residval 和 meanval都是序列变量,所以两者的比较运算结果先赋值给简单变量lossClose,然后再放在接下去的判断条件里,此时Bool lossClose=residval < meanval的确是放在这个小的if程序体外面的,但是它同时又是在if (statusMap[Symbol()+\"_\"+Frequency] == 3开始的这个更大的if程序体里面的。那上述这样写行吗?还是说一定要放在if (statusMap[Symbol()+\"_\"+Frequency] == 3)这一句前面?假如说是一定要放在if (statusMap[Symbol()+\"_\"+Frequency] == 3)前面,但我的代码是这一句前面本身又在更大的IF程序体内,这就很纠结了。

 ---不知道我表达清楚没有,期待答复,谢谢


2、为什么IF条件或者循环体内不能用序列函数,之前的贴子说了问题所在以及解决的办法,但是对于为什么不能这样用没有详细解释,希望能回答一下具体原因。越详细越好,辛苦了。


     


评论区
hyqh901097026

谢谢

2023-12-26 12:17
hyqh901097026

谢谢各位老师的答复,基本明白了。也就是说,为了保证不出错,无论IF的嵌套有多少层,还是放在最大的IF程序体外层,是吧?

那像TB的许多系统函数例如CROSSOVER,把序列变量表达式赋值给简单变量的语句并没有放在是外层的IF程序体外面,是因为已经确保了不会出错,是吗?

例如以下CROSSOVER代码中的Con1 = Price1[1] == Price2[1];并没有放在If(Price1 > Price2)前面。

Params

Series<Numeric> Price1(1); //数值型序列值一

Series<Numeric> Price2(1); //数值型序列值二

Vars

Bool Con1(False);

Bool PreCon(False);

Numeric Counter(0);

Begin

If(Price1 > Price2)

{

Counter = 1;

Con1 = Price1[1] == Price2[1];

While (Con1 And Counter < CurrentBar)

{

Counter = Counter + 1;

Con1 = Price1[Counter] == Price2[Counter];

}

PreCon = Price1[Counter] < Price2[Counter];

Return PreCon;

}Else

{

Return False;

}

End

2023-12-25 10:39
顶部