Comportement étrange de l'opérateur WHILE

 

Bonjour à tous !

J'ai un EA (jamais testé sur les builds pré 600 mais le code a 2 ans) qui se bloque pendant un WHILE sur le build 625.

Le fait est que lorsque le WHILE démarre il semble être incapable de vérifier les expressions : le résultat est qu'il ne sort jamais . Il est placé dans la fonction de démarrage.

J'ai essayé un EA très simple afin de comprendre ce qui se passe :


int counter=0, MaxCount = 10000; 

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

Eh bien, la première valeur du compteur part généralement d'une valeur aléatoire supérieure à 9500 et non de 0.

Pourquoi ? Une suggestion ?

 

Peut-être que le compteur reçoit une autre valeur quelque part dans l'EA :

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

Bonjour à tous !

J'ai un EA (jamais testé sur les builds pré 600 mais le code a 2 ans) qui se bloque pendant un WHILE sur le build 625.

Le fait est que lorsque le WHILE démarre il semble être incapable de vérifier les expressions : le résultat est qu'il ne sort jamais . Il est placé dans la fonction de démarrage.

J'ai essayé un EA très simple afin de comprendre ce qui se passe :

Eh bien, la première valeur du compteur part généralement d'une valeur aléatoire supérieure à 9500 et non de 0.

Pourquoi ? Une suggestion ?

Vous avez déclaré le compteur de manière globale, ce qui signifie qu'il est statique.

Votre code dans OnStart(), counter++ pousse la valeur du compteur jusqu'à 10,000

Donc, parce qu'il est statique, au prochain tick, votre compteur est à 10.000 au départ.

 
SDC:

Vous avez déclaré le compteur de manière globale, ce qui signifie qu'il est statique.

Votre code dans OnStart(), counter++ pousse la valeur du compteur jusqu'à 10,000

Donc, parce qu'il est statique, au prochain tick, votre compteur est à 10.000 au départ.


Il a écrit :

lord_hiro:

Eh bien, la première valeur du compteur commence généralement à partir d'une valeur aléatoire au-dessus de 9500 et non à partir de 0.

Comment cela se fait-il ? Une suggestion ?


Voici donc ma réponse


qjol:

Peut-être que le compteur prend une autre valeur quelque part dans l'EA :

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

Bonjour à tous !

J'ai un EA (jamais testé sur les builds pré 600 mais le code a 2 ans) qui se bloque pendant un WHILE sur le build 625.

Le fait est que lorsque le WHILE démarre il semble être incapable de vérifier les expressions : le résultat est qu'il ne sort jamais . Il est placé dans la fonction de démarrage.

J'ai essayé un EA très simple afin de comprendre ce qui se passe :


Eh bien, la première valeur du compteur part généralement d'une valeur aléatoire supérieure à 9500 et non de 0.

Pourquoi ? Une suggestion ?



Il est fort probable que vous regardiez dans l'onglet Experts, qui ne peut pas suivre les boucles rapides comme celle-ci.

Ouvrez le fichier journal actuel.

 

Je peux vous dire une chose, la boucle while ne s'exécutera jamais une seconde fois, à moins que quelque part ailleurs dans le code, vous n'appeliez à nouveau cette variable compteur et ne changiez sa valeur en moins de 10 001. Vous devriez faire attention à la déclaration des variables de manière globale.

 
lord_hiro: La première valeur du compteur part généralement d'une valeur aléatoire supérieure à 9500 et non de 0. Pourquoi ? Une suggestion ?
Avant la build 600, les variables non initialisées étaient initialisées à zéro. Maintenant elles contiennent des valeurs aléatoires, à moins que vous ne les initialisiez..
 
Il les a initialisé, ça doit être quelque chose d'autre qui change la valeur de cette variable de compteur...
 
Comme l'a dit GumRai, le journal ne peut pas gérer cette vitesse, il saute la plupart des données réelles et ne vous montre que quelques fragments.
 

GumRai, vous avez raison : le journal rapporte toutes les sorties à partir de 1.

La différence entre le fait de mettre la déclaration de variable dans l'espace global plutôt qu'à l'intérieur de OnStart() est que dans le premier cas la boucle s'exécute une fois alors que dans le second elle se répète indéfiniment.

Mais... Il est évident que j'ai choisi le mauvais exemple de débogage car le cycle de comptage s'exécute bien.

Tout a commencé avec l'EA suivante.

Voici le code :

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

   }

}}

J'ai enlevé les autres codes non pertinents pour plus de clarté et il s'exécute jusqu'au WHILE parce que j'ai mis des points d'arrêt avant.

Il devrait commencer avec la condition WHILE étant vrai et cyclant le IF ELSE jusqu'à ce que StringHighStatus devienne vrai ou StringHighShift atteigne SwingBarCount.

Ce que je vois au lieu de cela, c'est qu'il ne se termine jamais parce qu'après le WHILE, il y a une série de commandes COMMENT et PRINT qui ne renvoient aucune sortie.

Alors que StringHighStatus peut rester faux, le compteur doit atteindre SwingBarCount.

J'ai dû modifier ainsi pour que cela fonctionne :

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

Je ne comprends pas pourquoi il traite EndCycle et pas l'autre condition.

Merci à tous pour vos réponses !

 
if( StringHighStatus == "True" ) EndCycle = TRUE;
else if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
essayez d'inclure autre chose.