Ungewöhnliches Verhalten des WHILE-Operators

 

Hallo an alle!

Ich habe eine EA (nie getestet es auf vor 600 Builds, aber der Code ist 2 Jahre alt), die während einer WHILE auf Build 625 stecken bleibt.

Die Tatsache ist, dass, wenn die WHILE beginnt es scheint nicht in der Lage zu sein, die Ausdrücke zu überprüfen: das Ergebnis ist, dass es nie herauskommt. Es wird in der Startfunktion platziert.

Ich habe einen sehr einfachen EA ausprobiert, um zu verstehen, was vor sich geht:


int counter=0, MaxCount = 10000; 

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

Nun, der erste Zählerwert beginnt normalerweise mit einem Zufallswert über 9500 und nicht mit 0.

Woran liegt das? Haben Sie einen Vorschlag?

 

vielleicht erhält der Zähler irgendwo anders innerhalb des EA einen anderen Wert versuchen:

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

Hallo an alle!

Ich habe eine EA (nie getestet es auf vor 600 Builds, aber der Code ist 2 Jahre alt), die während einer WHILE auf Build 625 stecken bleibt.

Die Tatsache ist, dass, wenn die WHILE beginnt es scheint nicht in der Lage zu sein, die Ausdrücke zu überprüfen: das Ergebnis ist, dass es nie herauskommt . Es wird in der Startfunktion platziert.

Ich habe einen sehr einfachen EA ausprobiert, um zu verstehen, was vor sich geht:

Nun, der erste Zählerwert beginnt normalerweise mit einem Zufallswert über 9500 und nicht mit 0.

Woran liegt das? Haben Sie einen Vorschlag?

Sie haben den Zähler global deklariert, d.h. er ist statisch.

Ihr Code in OnStart(), counter++ schiebt den Zählerwert ganz nach oben auf 10.000

Da der Zähler statisch ist, steht er beim nächsten Tick auf 10.000, um mit ihm zu beginnen.

 
SDC:

Sie haben den Zähler global deklariert, d.h. er ist statisch.

Ihr Code in OnStart(), counter++ schiebt den Zählerwert ganz nach oben auf 10.000

Da er also statisch ist, steht der Zähler beim nächsten Tick auf 10.000 zu Beginn.


er schrieb:

lord_hiro:

Nun, der erste Zählerwert beginnt normalerweise mit einem Zufallswert über 9500 und nicht mit 0.

Woran liegt das? Irgendein Vorschlag?


Also, das ist meine Antwort


qjol:

vielleicht bekommt der Zähler irgendwo anders innerhalb des EA einen anderen Wert versuchen:

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

Hallo an alle!

Ich habe eine EA (nie getestet es auf vor 600 Builds, aber der Code ist 2 Jahre alt), die während einer WHILE auf Build 625 stecken bleibt.

Die Tatsache ist, dass, wenn die WHILE beginnt es scheint nicht in der Lage zu sein, die Ausdrücke zu überprüfen: das Ergebnis ist, dass es nie herauskommt . Es wird in der Startfunktion platziert.

Ich habe einen sehr einfachen EA ausprobiert, um zu verstehen, was vor sich geht:


Nun, der erste Zählerwert beginnt normalerweise mit einem Zufallswert über 9500 und nicht mit 0.

Woran liegt das? Haben Sie einen Vorschlag?



Wahrscheinlich suchen Sie auf der Registerkarte Experten, die mit schnellen Schleifen wie dieser nicht Schritt halten kann.

Öffnen Sie die aktuelle Log-Datei.

 

Ich kann Ihnen eines sagen: Die while-Schleife wird kein zweites Mal ausgeführt, es sei denn, Sie rufen die Zählervariable an einer anderen Stelle im Code erneut auf und ändern ihren Wert auf weniger als 10.001. Sie sollten mit der globalen Deklaration von Variablen vorsichtig sein.

 
lord_hiro: Nun, der erste Zählerwert beginnt normalerweise mit einem Zufallswert über 9500 und nicht mit 0. Woran liegt das? Haben Sie einen Vorschlag?
Vor Build 600 wurden nicht initialisierte Variablen mit Null initialisiert. Jetzt enthalten sie Zufallswerte, es sei denn, Sie initialisieren sie.
 
Er hat sie initialisiert, also muss es etwas anderes sein, das den Wert dieser Zählervariablen ändert...
 
Wie GumRai schon sagte, kann das Protokoll nicht mit dieser Geschwindigkeit umgehen, es überspringt den Großteil der tatsächlichen Daten und zeigt nur einige Fragmente an.
 

GumRai, Sie haben Recht: Das Protokoll meldet alle Ausgaben, beginnend mit 1.

Der Unterschied zwischen dem Einfügen der Variablendeklaration in den globalen Bereich und dem Einfügen in OnStart() besteht darin, dass die Schleife im ersten Fall einmal ausgeführt wird, während sie im zweiten Fall unendlich oft wiederholt wird.

Aber... Es ist offensichtlich, dass ich das falsche Debugging-Beispiel gewählt habe, denn der Zählzyklus wird gut ausgeführt.

Alles begann mit dem folgenden EA.

Hier ist der 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++;
      }

   }

}}

Ich habe den anderen nicht relevanten Code der Übersichtlichkeit halber entfernt und er wird bis zum WHILE ausgeführt, weil ich vorher einige Breakpoints gesetzt habe.

Es sollte mit der WHILE-Bedingung beginnen, die wahr ist, und das IF ELSE durchlaufen, bis StringHighStatus wahr wird oder StringHighShift SwingBarCount erreicht.

Was ich stattdessen sehe, ist, dass es nie endet, weil es nach dem WHILE eine Reihe von COMMENT- und PRINT-Befehlen gibt, die keine Ausgabe liefern.

Während StringHighStatus falsch bleiben kann, muss der Zähler SwingBarCount erreichen.

Ich musste das so ändern, damit es funktioniert:

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

Ich verstehe nicht, warum es EndCycle verarbeitet und nicht die andere Bedingung.

Vielen Dank an alle für Ihre Antworten!

 
if( StringHighStatus == "True" ) EndCycle = TRUE;
else if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
Versuchen Sie es mit einem anderen Inhalt.