Ungewöhnliches Verhalten des WHILE-Operators - Seite 3

 
Muss es WHILE sein, während wir FOR verwenden können?
 

wann ist dies beim Starten und

wann ist dies beim Anhalten der Fall?

while (StringHighStatus == "False" && SwingHighShift <= SwingBarCount)
 
Dies wird niemals wahr sein (Der == Operand. - MQL4 Forum)
if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift)
daher wird dies nie ausgeführt
StringHighStatus="True";
was zu einer Endlosschleife führt.
while(StringHighStatus=="False" || ...
  1. Hätten Sie Ihre Variablen und Einträge vor und innerhalb von if-Anweisungen ausgedruckt, hätten Sie das herausgefunden.
  2. Verwenden Sie keine Strings oder Ints, wenn Sie boolean meinen.
    string StringHighStatus = "False";
    while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount){
       if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == ...{
          StringHighStatus = "True";
    
    bool String HighStatus = False;
    while (!String HighStatus || SwingHighShift <= SwingBarCount){
       if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == ...{
          String HighStatus = True;
    

 
WHRoeder:
Dies wird niemals wahr sein (Der == Operand. - MQL4 Forum)
daher wird dies nie ausgeführt
was zu einer Endlosschleife führt.

Ich dachte das Gleiche, bis ich es getestet habe. Überraschenderweise funktioniert der if(double == double) Teil davon, ich frage mich, ob der Vergleich von Doubles in den neuen Builds anders gehandhabt wird.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int i=0; i<100; i++)
   {if(iFractals(NULL, 0, MODE_UPPER, i) == iHigh(NULL, 0, i) && iFractals(NULL, 0, MODE_UPPER, i) > Close[0])
    Print("Fractals conditions met on bar ",i);
  }} 

EURUSD,M15: Fractals-Bedingungen erfüllt bei Takt 98
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 95
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 91
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 81
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 77
EURUSD,M15: Fraktale Bedingungen erfüllt bei Balken 68
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 61
EURUSD,M15: Fraktale Bedingungen erfüllt bei Balken 48
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 39
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 24
EURUSD,M15: Fractals-Bedingungen erfüllt bei Balken 19
EURUSD,M15: Fraktale Bedingungen erfüllt bei Balken 12
EURUSD,M15: Fraktale Bedingungen erfüllt bei Balken 4

 
lord_hiro:

Danke GumRai für deine Geduld.

Vielleicht liege ich falsch und habe einen Dickschädel, aber ich kann die Logik nicht verstehen...

Wenn das erste IF, wie du vorschlägst, die Zeichenkette auf "true" setzt, z.B. bei SwinghHighShift=10, dann steigt der Zähler in diesem Zyklus nicht an; danach kehrt die Steuerung zum WHILE zurück: der Zyklus sollte an diesem Punkt enden, weil das WHILE ein logisches OR enthält und eine seiner Bedingungen erfüllt ist.

Umgekehrt, wenn die Variable falsch bleibt, sollte der Zähler seinen Maximalwert erreichen und Sie haben wieder die Exit-Bedingung.

Ich denke, dass Ihre Überlegung auch mit einem AND-Operator zutreffen würde.

Ihrer Interpretation folgend könnte ich das ODER innerhalb des WHILE weglassen; ich könnte einfach die erste WENN-Bedingung auf die Zeichenkette anwenden: wenn sie "wahr" wird, dann wird der Break das WHILE beenden, andernfalls würde der Zähler weiterlaufen bis zu seinem Maximum.

Der Code wird dann zu:


Aber das ist immer noch ein Workaround und erklärt (für mich) leider nicht, warum das WHILE nicht das OR übernimmt.

Es ist nichts falsch mit WHILE oder logischem OR, Sie haben zwei Bedingungen in Ihrem WHILE, BEIDE müssen erfüllt sein, bevor das WHILE beendet werden kann.

Deshalb bleibt es stecken

  • Der Code tritt in die WHILE-Schleife ein. Beide Bedingungen sind zu Beginn wahr.
  • Der Code durchläuft die WHILE-Schleife und erhöht SwingHighShift++, bis ein Balken mit Fraktalen gefunden wird, die die IF-Bedingungen erfüllen.
  • Früher oder später gibt der Code IF-Operatoren ein, wenn die Fraktale die Bedingungen erfüllen.
  • StringHighStatus wird auf false geändert, so dass die erste WHILE-Bedingung aufgehoben wird.
  • SwingHighShift++; wird NICHT inkrementiert, weil es im ELSE-Teil des IF-Operators steht (die IF-Bedingung wurde erfüllt, also wird ELSE ignoriert).
  • Die zweite WHILE-Bedingung ist immer noch erfüllt, so dass der Code erneut zyklisch ausgeführt wird, und zwar immer noch auf demselben Takt wie beim letzten Mal.
  • dasselbe Fraktal erfüllt die WENN-Bedingungen erneut, genau wie beim letzten Mal.
  • Der Code hängt nun für immer in der Schleife auf diesem Balken mit dem Fraktal fest, das die WENN-Bedingungen erfüllt, weil SwingHighShift++ im ELSE-Teil nicht inkrementiert wird, wenn die WENN-Bedingungen wahr sind.

Es gibt nur eine geringe Chance, dass die while-Schleife jemals beendet werden könnte, und zwar dann, wenn die IF-Bedingung für die gesamten 100 Bars (SwingBarCount) nicht erfüllt wird, so dass die zweite WHILE-Bedingung vor der ersten durchbrochen wird. Danach erfüllen die Fraktale die WENN-Bedingung, und der Code zum Durchbrechen der 1. WHILE-Bedingung (Ändern von StringHighStatus) wird ausgeführt.

Sie müssen entweder SwingHighShift++; aus dem ELSE herausnehmen und es selbst in die while-Schleife nach dem IF-Operator einfügen, so dass es unabhängig davon, was mit den IF-Bedingungen passiert, immer noch inkrementiert wird, so dass die Schleife zum nächsten Takt weitergehen kann, oder Sie verwenden break nach dem Codeblock zum Zeichnen des Objekts, um die while-Schleife zu verlassen, sobald das Objekt gezeichnet ist.

Sie müssen Ihrem Objekt auch eine Möglichkeit geben, verschiedene Namen für sich selbst zu erstellen, da es sonst nur einmal gezeichnet wird. (es sei denn, Sie wollen, dass es nur einmal gezeichnet wird).

 
Wenn ich mir Ihre Beiträge in diesem Thread noch einmal durchlese, sehe ich, woher Ihre Verwirrung kommt. Du denkst die Logik von WHILE und OR in umgekehrter Reihenfolge. Beim OR geht es nicht darum, das WHILE zu stoppen. Es geht darum, es weiterlaufen zu lassen, wenn eine der beiden Bedingungen erfüllt ist... Es ist so: Sie haben zwei eingeschaltete Lichter. Ihre Anweisung lautet: Solange Licht 1 ODER Licht 2 leuchtet, machen Sie etwas. Natürlich müssen beide Lichter aus sein, bevor Sie aufhören, nicht nur eines von ihnen.
 
SDC:

Ich dachte dasselbe, bis ich es getestet habe. Überraschenderweise funktioniert der if(double == double) Teil davon, ich frage mich, ob der Vergleich von Doubles in den neuen Builds anders gehandhabt wird.

EURUSD,M15: Fraktale Bedingungen erfüllt bei Bar 98
EURUSD,M15: Fraktale Bedingungen erfüllt bei Bar 95
EURUSD,M15: Fraktale Bedingungen erfüllt bei Bar 91
EURUSD,M15: Fraktale Bedingungen erfüllt bei Bar 81
EURUSD,M15: Fraktale Bedingungen erfüllt bei Bar 77
EURUSD,M15: Fraktale Bedingungen erfüllt bei Bar 68
EURUSD,M15: Fraktale Bedingungen erfüllt auf bar 61
EURUSD,M15: Fraktale Bedingungen erfüllt auf bar 48
EURUSD,M15: Fraktale Bedingungen erfüllt auf bar 39
EURUSD,M15: Fraktale Bedingungen erfüllt auf bar 24
EURUSD,M15: Fraktale Bedingungen erfüllt auf bar 19
EURUSD,M15: Fraktale Bedingungen erfüllt auf bar 12
EURUSD,M15: Fraktale Bedingungen erfüllt auf bar 4


Der Grund, warum es funktioniert, ist, dass der Code effektiv denselben Wert vergleicht

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift) )

Der Fraktal-Puffer hat entweder einen leeren Wert oder er nimmt seinen Wert vom Höchststand des betreffenden Balkens.

Der Code ist effektiv

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE && iHigh(NULL,0,SwingHighShift==iHigh(NULL,0,SwingHighShift) 

Ich sehe keinen Grund, warum er nicht ersetzt werden kann durch

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE)
 
GumRai:

Ich sehe keinen Grund, warum sie nicht ersetzt werden kann durch

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE)
Ja, ich denke, das ist eine bessere Lösung.
 
SDC:
Wenn ich mir Ihre Beiträge in diesem Thread noch einmal durchlese, sehe ich, woher Ihre Verwirrung kommt. Du denkst die Logik von WHILE und OR in umgekehrter Reihenfolge. Beim OR geht es nicht darum, das WHILE zu stoppen. Es geht darum, es weiterlaufen zu lassen, wenn eine der beiden Bedingungen erfüllt ist... Es ist so: Sie haben zwei eingeschaltete Lichter. Ihre Anweisung lautet: Solange Licht 1 ODER Licht 2 leuchtet, machen Sie etwas. Natürlich müssen beide Lichter aus sein, bevor Sie aufhören, nicht nur eines von ihnen.


Das war's!

Schande über mich... :-)

Außerdem ist es nicht das erste Mal, dass ich WHILE verwende, aber ich habe angefangen, in umgekehrter Richtung zu denken und bin nie aus MEINER EIGENEN Schleife herausgekommen :-/

Und so wird der Vorschlag von deVries, || durch && zu ersetzen, richtig.

Eine Menge anderer Dinge, um die man sich kümmern muss, haben sich aus diesem Thema ergeben, z.B. wie das IF( == ) funktioniert.

Ich danke Ihnen allen für Ihre Geduld und die Zeit, die Sie aufgewendet haben, um mich zu verstehen.

 

Ich hätte es so machen sollen, mit einem Break, um die while-Schleife zu unterbrechen, ist das richtig?

  int counter=0, MaxCount = 10000;
  while( true )
     {
      Print("Counter ", counter);
      counter++;
      if( counter == MaxCount ) break;
      }