WHILE操作符的奇怪行为 - 页 2

 

我想,这没有什么区别。我也可以写IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE。

关键是为什么IF检测到退出条件,然后WHILE对bool变量做出反应,而如果我把同样的条件放在WHILE中,它就不会结束?

 
lord_hiro:

我想,这没有什么区别。我也可以写IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE。

关键是为什么IF检测到退出条件,然后WHILE对bool变量做出反应,而如果我把同样的条件放在WHILE中,它就不会结束?


在我看来,这样做是可行的

while (StringHighStatus == "False" &&  SwingHighShift <= SwingBarCount)

while (!EndCycle)
   {
   
  ...
      if( StringHighStatus == "True" ) EndCycle = TRUE;
      if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
   }
 
是的,有时颠倒逻辑会得到我们想达到的目的。
 

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运算符的问题?

 
答案是肯定的....,但这可能与建造无关,而与编码有很大关系....LOL。
 
So my question is: is there anyone experiencing troubles with the WHILE operator after build 600? 
你有没有试过一个非常基本的逻辑操作,只是为了确认它是否像应该的那样工作,而不是询问?
 
lord_hiro:

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 (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++;
        }

     }
 
deysmacro:
你有没有试过一个非常基本的逻辑操作,只是为了确认它是否像它应该的那样工作,而不是询问?


我的帖子是以一个WHILE的例子开始的,在我看来,它返回的异常行为与我们现在讨论的这块EA非常相似,所以我先试后问。

我对这个非常简单的调试的解释被证明是错误的,所以讨论转移到了EA本身。

 

谢谢你GumRai的耐心。

也许我错了,而且头脑僵硬,但我不能理解这个逻辑......

如果第一个IF像你建议的那样,在SwinghHighShift=10时将字符串变成 "真",那么在这个循环中,计数不会增加;在那之后,控制 回到WHILE:循环应该在这一点上结束,因为WHILE包含一个逻辑OR,它的一个条件被满足。

反之,如果变量一直是假的,那么计数器应该达到它的最大值,你又有了退出条件。

我认为你的考虑对于一个AND操作符来说是正确的。

按照你的解释,我可以跳过WHILE中的OR;我可以只在字符串上设置第一个IF条件:如果变成 "true",那么break将结束WHILE,否则计数器将继续下去,直到它的最大值。

代码将转为。

   while(SwingHighShift<=SwingBarCount)
     {

      if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift) && iFractals(NULL,0,MODE_UPPER,SwingHighShift)>Close[0])
        {
         
         StringHighStatus="True";
         SwingHigh=SwingHighShift;
         ObjectDelete("SwingHigh");
         ObjectCreate("SwingHigh",OBJ_VLINE,0,Time[SwingHigh],0);
         ObjectSet("SwingHigh",OBJPROP_COLOR,Red);
        
         break;
        }
      else
        {
         SwingHighShift++;
        }

     }


但这仍然是一个变通的办法,而且,不幸的是,它并没有解释(对我来说)为什么WHILE不能解决OR的问题。

 
lord_hiro:


如果第一个IF像你建议的那样,在SwinghHighShift=10时将字符串转为 "真",那么在这个循环中,计数不会增加;在那之后,控件回到WHILE:这个循环应该在这个点结束,因为WHILE包含一个逻辑OR,它的一个条件被满足。

是的,while的一个条件得到了满足,但是在这种情况下,代码并没有退出,而是继续前进到for,处于无尽的循环中。