Comportamento estranho do operador WHILE

 

Olá a todos!

Eu tenho uma EA (nunca a testei em pré 600 construções, mas o código tem 2 anos de idade) que fica presa durante um WHILE na construção 625.

O fato é que quando o WHILE começa parece ser incapaz de verificar as expressões: o resultado é que ele nunca sai. Ele é colocado na função de início.

Eu tentei uma EA muito simples para entender o que se passa:


int counter=0, MaxCount = 10000; 

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

Bem, o primeiro valor do contador geralmente começa a partir de um valor aleatório acima de 9500 e não a partir de 0.

Por que ele é? Alguma sugestão?

 

talvez o contador receba outro valor em algum outro lugar dentro da EA tente :

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

Olá a todos!

Eu tenho uma EA (nunca a testei em pré 600 construções, mas o código tem 2 anos de idade) que fica presa durante um WHILE na construção 625.

O fato é que quando o WHILE começa parece ser incapaz de verificar as expressões: o resultado é que ele nunca sai. Ele é colocado na função de início.

Eu tentei uma EA muito simples para entender o que se passa:

Bem, o primeiro valor do contador geralmente começa a partir de um valor aleatório acima de 9500 e não a partir de 0.

Por que ele é? Alguma sugestão?

Você declarou o contador de forma global, o que significa que é estático.

Seu código em OnStart(), contador++ empurra o valor do contador até 10.000

Então, como é estático, no próximo tique seu contador está em 10.000 para começar.

 
SDC:

Você declarou que o contador é global, o que significa que é estático.

Seu código em OnStart(), contador++ empurra o valor do contador até 10.000

Então, como é estático, no próximo tique seu contador está em 10.000 para começar.


ele escreveu:

lord_hiro:

Bem, o primeiro valor do contador geralmente começa de um valor aleatório acima de 9500 e não a partir de 0.

Por que é assim? Alguma sugestão?


portanto, esta é minha resposta


qjol:

talvez o contador receba outro valor em algum outro lugar dentro da EA tente :

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

Olá a todos!

Eu tenho uma EA (nunca a testei em pré 600 construções, mas o código tem 2 anos de idade) que fica presa durante um WHILE na construção 625.

O fato é que quando o WHILE começa parece ser incapaz de verificar as expressões: o resultado é que ele nunca sai. Ele é colocado na função de início.

Eu tentei uma EA muito simples para entender o que se passa:


Bem, o primeiro valor do contador geralmente começa a partir de um valor aleatório acima de 9500 e não a partir de 0.

Por que ele é? Alguma sugestão?



O mais provável é que você esteja procurando na guia de Especialistas, que não consegue acompanhar loops rápidos como este.

Abra o arquivo de registro real.

 

Posso lhe dizer uma coisa, que enquanto o loop nunca executaria uma segunda vez a menos que em algum outro lugar no código você chamasse aquela variável contador novamente e alterasse seu valor de volta para menos de 10.001. Você deve ter cuidado ao declarar as variáveis de forma global.

 
lord_hiro: Bem, o primeiro valor do contador geralmente parte de um valor aleatório acima de 9500 e não de 0. Por que é? Alguma sugestão?
Antes da construção de 600 variáveis não inicializadas, foram inicializadas a zero. Agora elas contêm valores aleatórios, a menos que você as inicialize.
 
Ele os inicializou, deve ser algo mais mudando o valor daquela variável contrária.
 
Como GumRai disse, o tronco não consegue lidar com essa velocidade, ele pula a maioria dos dados reais e mostra apenas alguns fragmentos.
 

GumRai, você está certo: o registro relata todas as saídas a partir de 1.

A diferença entre colocar a declaração variável no espaço global ao invés de dentro do OnStart() é que no primeiro caso o laço executa uma vez enquanto no segundo se repete indefinidamente.

Mas... É evidente que eu escolho o exemplo errado de depuração porque o ciclo de contagem é bem executado.

Tudo começou com a seguinte EA.

Aqui está o código:

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

   }

}}

Eu removi o outro código não relevante para maior clareza e ele é executado até o QUANDO, porque eu coloquei alguns pontos de interrupção antes.

Ele deve começar com a condição WHILE sendo verdadeira e ciclando o IF ELSE até que o StringHighStatus se torne verdadeiro ou o StringHighShift alcance o SwingBarCount.

O que eu vejo ao invés disso é que nunca termina porque depois do WHILE há uma série de comandos de COMENTÁRIO e IMPRESSÃO que não retornam nenhuma saída.

Enquanto o StringHighStatus pode permanecer falso, o contador tem que chegar ao SwingBarCount.

Eu tive que modificar assim para que ele funcionasse:

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

Não percebo porque ele processa o EndCycle e não a outra condição.

Agradecemos a todos por suas respostas!

 
if( StringHighStatus == "True" ) EndCycle = TRUE;
else if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
tente incluir outros.