while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount)
你的代码,如果和你发布的完全一样,在任何版本中都不会像你期望的那样,所以你一定改变了什么
while(StringHighStatus=="False" || SwingHighShift<=SwingBarCount)
{
if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift) && iFractals(NULL,0,MODE_UPPER,SwingHighShift)>Close[0])
{
//IF THIS CONDITION IS TRUE AT, FOR EXAMPLE SwingHighShift=10
StringHighStatus="True";
SwingHigh=SwingHighShift;
ObjectDelete("SwingHigh");
ObjectCreate("SwingHigh",OBJ_VLINE,0,Time[SwingHigh],0);
ObjectSet("SwingHigh",OBJPROP_COLOR,Red);
//THEN StringHighStatus="True" BUT SwingHighShift IS NOT INCREASED IN THIS BLOCK OF CODE//SO WHEN CONTROL IS HANDED BACK TO THE WHILE OPERATOR, SwingHighShift WILL REMAIN UNCHANGED AT 10//SO THIS BLOCK OF CODE WILL BE REPEATED OVER AND OVER CHECKING BAR SHIFT 10, BECAUSE THERE IS NO WAY OUT!//HOW TO RESOLVE? SIMPLY USE break;
}
else
{
SwingHighShift++;
}
}
我想,这没有什么区别。我也可以写IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE。
关键是为什么IF检测到退出条件,然后WHILE对bool变量做出反应,而如果我把同样的条件放在WHILE中,它就不会结束?
我想,这没有什么区别。我也可以写IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE。
关键是为什么IF检测到退出条件,然后WHILE对bool变量做出反应,而如果我把同样的条件放在WHILE中,它就不会结束?
在我看来,这样做是可行的
如
deVries,也许我错了,但我认为一连串的IF会像逻辑OR那样把布尔值变成TRUE。
如果第一个条件符合,那么EndCycle就变成了TRUE,如果第二个条件不符合,那么它仍然是TRUE。
反之亦然,如果第一个条件没有满足,但第二个条件满足,那么它就变成了TRUE。
在这个时候,WHILE会识别出退出条件。
因此,两个IF序列的行为就像一个逻辑OR,同样,IF...ELSE IF序列也是如此。
而且必须是一个OR,不能是一个AND,否则WHILE就会卡住(字符串上的条件可以无限期的为假)。
为什么WHILE管理着一个布尔变量,其值在循环中被设置,而它却不能确定他的条件定义中相同的逻辑OR操作的结果?
这个EA在过去被很多人使用,在Build 600之前,也在500之前,这是最后一个版本。没有人抱怨过。
所以我的问题是:有没有人在Build 600之后遇到WHILE运算符的问题?
deVries,也许我错了,但我认为一连串的IF会像逻辑OR那样把布尔值变成TRUE。
如果第一个条件符合,那么EndCycle就变成了TRUE,如果第二个条件不符合,那么它仍然是TRUE。
反之亦然,如果第一个条件没有满足,但第二个条件满足,那么它就变成了TRUE。
在这个时候,WHILE会识别出退出条件。
所以,两个IF序列的行为就像一个逻辑OR,同样,IF...ELSE IF序列也是如此。
而且必须是一个OR,不能是一个AND,否则WHILE就会卡住(字符串上的条件可以无限期的为假)。
为什么WHILE管理着一个布尔变量,其值在循环中被设置,而它却不能确定他的条件定义中相同的逻辑OR操作的结果?
这个EA在过去被很多人使用,在Build 600之前,也在500之前,这是最后一个版本。没有人抱怨过。
所以我的问题是:有没有人在Build 600之后遇到WHILE运算符的问题?
我想你指的是这个
你的代码,如果和你发布的完全一样,在任何版本中都不会像你期望的那样,所以你一定改变了什么
你有没有试过一个非常基本的逻辑操作,只是为了确认它是否像它应该的那样工作,而不是询问?
我的帖子是以一个WHILE的例子开始的,在我看来,它返回的异常行为与我们现在讨论的这块EA非常相似,所以我先试后问。
我对这个非常简单的调试的解释被证明是错误的,所以讨论转移到了EA本身。
谢谢你GumRai的耐心。
也许我错了,而且头脑僵硬,但我不能理解这个逻辑......
如果第一个IF像你建议的那样,在SwinghHighShift=10时将字符串变成 "真",那么在这个循环中,计数不会增加;在那之后,控制 回到WHILE:循环应该在这一点上结束,因为WHILE包含一个逻辑OR,它的一个条件被满足。
反之,如果变量一直是假的,那么计数器应该达到它的最大值,你又有了退出条件。
我认为你的考虑对于一个AND操作符来说是正确的。
按照你的解释,我可以跳过WHILE中的OR;我可以只在字符串上设置第一个IF条件:如果变成 "true",那么break将结束WHILE,否则计数器将继续下去,直到它的最大值。
代码将转为。
但这仍然是一个变通的办法,而且,不幸的是,它并没有解释(对我来说)为什么WHILE不能解决OR的问题。
如果第一个IF像你建议的那样,在SwinghHighShift=10时将字符串转为 "真",那么在这个循环中,计数不会增加;在那之后,控件回到WHILE:这个循环应该在这个点结束,因为WHILE包含一个逻辑OR,它的一个条件被满足。