Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 495

 

Auf den ersten Fall gelöst ist - in Klammern für zwei Vergleiche setzen und es nicht fluchen - gab es einen logischen Fehler - dh die Ergebnisse des Vergleichs könnte wegen der "oder" ersetzt werden?

Bei der zweiten Formulierung bleibt eine Frage offen - was ist da falsch - hat jemand eine Idee?

 
-Aleks-:

Der erste Fall ist gelöst - zwei Vergleiche in Klammern gesetzt und es flucht nicht - lag ein logischer Fehler vor - d.h. Vergleichsergebnisse konnten wegen "oder" ersetzt werden?

Es gibt noch eine offene Frage bezüglich des zweiten Ausdrucks - was ist dort falsch - irgendwelche Ideen?

Beachten Sie, dass die Prüfung einer Bedingung im neuen mql4 nicht vollständig durchgeführt wird. D.h. unter der Bedingung

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Wenn Low[x] nicht größer ist als PriceBuy, wird keine weitere Prüfung durchgeführt. Dies geht aus der Fehlerbeschreibung hervor. Wenn das erste Paar in eckige Klammern eingeschlossen ist, wird das zweite Paar von Bedingungen geprüft, wenn es fehlschlägt.

Zweite Frage.

for(calc_day;calc_day>0; calc_day--)

Was ist calc_day gleich? Darf es weniger als Null sein? Der Compiler weiß nicht, was in der Logik steht... Deshalb warnt sie vor einer möglichen unwirksamen Schleife.

 
Alexey Viktorov:

Beachten Sie, dass die Bedingungsprüfung im neuen mql4 nicht vollständig durchgeführt wird. D.h. unter der Bedingung

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Ist Low[x] nicht größer als PriceBuy, wird keine weitere Prüfung durchgeführt. Dies geht aus der Fehlerbeschreibung hervor. Wenn das erste Paar in eckige Klammern eingeschlossen ist, wird das zweite Paar von Bedingungen geprüft, wenn es fehlschlägt.

Vielen Dank für die Antwort!

Überrascht - da die Logik visuell immer korrekt funktioniert hat, hmmm...


Alexey Viktorov:

Zweite Frage.

for(calc_day;calc_day>0; calc_day--)

Was ist calc_day gleich? Darf es weniger als Null sein? Der Compiler weiß nicht, was in der Logik steht... Deshalb warnt sie vor einer möglichen unwirksamen Schleife.

Die Zahl calc_day ist immer größer als 0, bei anderen Werten wird der Code nicht aufgerufen.
 
-Aleks-:

Vielen Dank für die Antwort!

Überrascht - da die Logik visuell immer korrekt funktioniert hat, hmmm...

Vor den 6**-Builds war das auch so, ich habe die gesamte Kette der Bedingungen überprüft und alles hat funktioniert, aber jetzt hat sich alles geändert. Und bei alten Builds ist die Bedingung in diesem Fall zweideutig. Wie ist sie aufgebaut?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

Oder doch?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Ein menschliches Gehirn kann das herausfinden, aber was soll ein Compiler tun? Es hat kein Gehirn.

-Aleks-:

Die Zahl calc_day ist immer größer als 0. Andere Werte führen nicht zum Aufruf von Code.

Sagen Sie das dem Compiler...

 
Alexey Viktorov:

Bis zum Build 6** war es so, dass die gesamte Kette der Bedingungen überprüft wurde und alles funktionierte, aber jetzt hat sich alles geändert. Und bei alten Gebäuden ist die Bedingung auch in diesem Fall zweideutig. Wie ist sie aufgebaut?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

oder ist das alles?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Ein menschliches Gehirn kann das herausfinden, aber was soll ein Compiler tun? Er hat kein Gehirn...


Sagen Sie das dem Compiler...

Überzeugend - ich werde aufmerksamer sein.

Wie sage ich es dem Compiler? Schreiben Sie es, aber wird es auch verstanden?

if (calc_day<0)  calc_day=calc_day*(-1);

 
Alexey Viktorov:

So war es auch vor den 6**-Builds, die gesamte Kette der Bedingungen wurde überprüft und alles funktionierte, aber jetzt hat sich alles geändert. Ja und in alten Builds in diesem Fall Bedingung Zweideutigkeit. Wie ist sie aufgebaut?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

oder doch nicht?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Ein menschliches Gehirn kann das herausfinden, aber was soll ein Compiler tun? Er hat kein Gehirn...


Sagen Sie das dem Compiler...

Prüfen Sie den Vorrang der Operatoren auf mögliche Fehler; verwenden Sie Klammern, um den Vorrang zu verdeutlichen - dies ist kein Fehler. Es ist eine Warnung. Sie kommt in alten Codes vor.

Sie fügten sie eher für den Benutzer als für den Compiler hinzu. Der Compiler orientiert sich an den Prioritäten der Operationen. Dort ist alles klar. Die Priorität von && ist höher als die von ||. Deshalb sollten die Klammern folgendermaßen angeordnet werden

if( (Tief[X]>PreisKauf && Hoch[X]>PreisKauf) || (Tief[X]<PreisKauf && Hoch[X]<PreisKauf) )

Update: In diesem Fall ist die Priorität sowohl für MT4 als auch für MT5 die gleiche.

 
-Aleks-:

Überzeugend - ich werde aufmerksamer sein.

Wie sage ich es dem Compiler? Schreiben Sie es, aber wird es auch verstanden?

if (calc_day<0)  calc_day=calc_day*(-1);

for( calc_day = 365; calc_day > 0; calc_day --)
Also versuchen Sie es.
 
Alexey Kozitsyn:

Prüfen Sie den Vorrang der Operatoren auf mögliche Fehler; verwenden Sie Klammern, um den Vorrang zu verdeutlichen - dies ist kein Fehler. Es ist eine Warnung. Sie kommt in alten Codes vor.

Wir haben sie eher für den Benutzer als für den Compiler hinzugefügt. Der Compiler orientiert sich an den Prioritäten der Operationen. Dort ist alles klar. Die Priorität von && ist höher als die von ||. Deshalb sollten die Klammern folgendermaßen angeordnet werden

if( (Tief[X]>PreisKauf && Hoch[X]>PreisKauf) || (Tief[X]<PreisKauf && Hoch[X]<PreisKauf) )

Update: In diesem Fall ist die Priorität sowohl für MT4 als auch für MT5 die gleiche.

Nun, im Grunde genommen ist die Warnung kein Fehler. Aber wie funktioniert die erste Variante if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy )? Oder ist es ein Reinfall, ein paar Klammern anzubringen?

 
-Aleks-:

Überzeugend - ich werde aufmerksamer sein.

Wie sage ich es dem Compiler? Schreiben Sie es, aber wird es auch verstanden?

if (calc_day<0)  calc_day=calc_day*(-1);

for(int i=calc_day; i>0; i--) {}
 
Alexey Viktorov:

Nun, im Grunde genommen ist die Warnung kein Fehler. Aber wie funktioniert das anfängliche if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy )? Oder wird es scheitern, ein paar Klammern zu setzen?

Es wird so funktionieren, wie ich oben geschrieben habe.

Der Compiler warnt den Benutzer, nicht zu faul zu sein und Klammern zu setzen, um mögliche nicht offensichtliche Fehler zu vermeiden.

Grund der Beschwerde: