WHILE操作符的奇怪行为

 

大家好!

我有一个EA(从未在600之前的版本上测试过,但代码已经2年了),在625版本的WHILE中被卡住。

事实是,当WHILE开始时,它似乎无法检查表达式:结果是,它永远不会出来。它被放置在启动函数 中。

我尝试了一个非常简单的EA,以便了解发生了什么。


int counter=0, MaxCount = 10000; 

void start()
  {
  while( counter <= MaxCount )
   {Print("Counter ", counter);
   counter++;
   }
   return;
  }

好吧,第一个计数器的值通常从9500以上的随机值开始,而不是从0开始。

为什么会这样?有什么建议吗?

 

也许计数器在EA内部的其他地方得到了另一个值,试试。

void start()
  {
  int counter=0, MaxCount = 10000;
  while( counter <= MaxCount )
   {Print("Counter ", counter);
   counter++;
   }
   return;
  }
 
lord_hiro:

大家好!

我有一个EA(从未在600之前的版本上测试过,但代码已经有2年了),在625版本的WHILE中被卡住了。

事实是,当WHILE开始时,它似乎无法检查表达式:结果是,它永远不会出来。它被放置在启动函数中。

我尝试了一个非常简单的EA,以便了解发生了什么。

好吧,第一个计数器的值通常从9500以上的随机值开始,而不是从0开始。

为什么会这样?有什么建议吗?

你声明了计数器是全局的,这意味着它是静态的。

你在OnStart()中的代码,counter++把计数器的值一直推到10,000。

因此,由于它是静态的,在下一次跳动时,你的计数器是在10000点开始的。

 
SDC:

你声明了计数器是全局的,这意味着它是静态的。

你在OnStart()中的代码,counter++将计数器的值一直推到10,000。

所以,由于它是静态的,在下一次嘀嗒声中,你的计数器开始时是10,000。


他写道。

lord_hiro:

好吧,第一个计数器的值通常是从9500以上的一个随机值开始的,而不是从0开始。

为什么会这样呢?有什么建议吗?


所以,这是我的答案


qjol:

也许计数器在EA内部的其他地方得到了另一个值,试试。

void start()
  {
  int counter=0, MaxCount = 10000;
  while( counter <= MaxCount )
   {Print("Counter ", counter);
   counter++;
   }
   return;
  }
 
lord_hiro:

大家好!

我有一个EA(从未在600之前的版本上测试过,但代码已经有2年了),在625版本的WHILE中被卡住了。

事实是,当WHILE开始时,它似乎无法检查表达式:结果是,它永远不会出来。它被放置在启动函数中。

我尝试了一个非常简单的EA,以便了解发生了什么。


好吧,第一个计数器的值通常从9500以上的随机值开始,而不是从0开始。

为什么会这样?有什么建议吗?



最有可能的是,你正在查看专家选项卡,它无法跟上像这样的快速循环。

打开实际的日志文件。

 

我可以告诉你一件事,那个while循环永远不会执行第二次,除非你在代码的其他地方再次调用那个计数器变量,并将其值改回小于10,001。你应该对全局性的变量声明加以注意。

 
lord_hiro: 那么,第一个计数器的值通常从9500以上的随机值开始,而不是从0开始。有什么建议吗?
在build 600之前,未初始化的变量被初始化为0。现在它们包含随机值,除非 初始化它们。
 
他确实初始化了它们,一定是其他东西改变了那个计数器变量的值......。
 
正如GumRai所说,日志无法处理这种速度,它跳过大部分实际数据,只向你显示一些片段。
 

GumRai,你是对的:日志报告了从1开始的所有输出。

把变量声明放在全局空间而不是放在OnStart()里面的区别是,在第一种情况下,循环只执行一次,而在第二种情况下,循环会无限期地重复。

但是...。很明显,我选择了错误的调试例子,因为计数循环执行得很好。

这一切都从以下的EA开始。

这里是代码。

 extern int SwingBarCount = 100;
int start()



{

int SwingHighShift = 0;
string StringHighStatus = "False";
int SwingHigh = 0;


while (StringHighStatus == "False" || 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);
      }
      else
      {
      SwingHighShift++;
      }

   }

}}

为了清楚起见,我已经删除了 其他不相关的代码,它一直执行到WHILE,因为我在之前设置了一些断点。

它应该从WHILE条件为真开始,然后循环IF ELSE直到StringHighStatus为真或StringHighShift达到SwingBarCount。

但我看到的是,它永远不会结束,因为在WHILE之后有一系列的COMMENT和PRINT命令,没有输出。

虽然StringHighStatus可以保持为假,但计数器必须达到SwingBarCount。

我不得不这样修改,以使其工作。

while (!EndCycle)
   {
   
   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);
      }
      else
      {
      SwingHighShift++;
      }
      if( StringHighStatus == "True" ) EndCycle = TRUE;
      if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
   }

我不明白为什么它会处理EndCycle而不是其他条件。

谢谢大家的回答。

 
if( StringHighStatus == "True" ) EndCycle = TRUE;
else if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
尝试包括其他