Ist es möglich, viele "Oder"-Zeichen (||) in Bedingungen zu vermeiden, die dieselbe Aktion verursachen? - Seite 7

 

Was für eine fruchtbare Nacht ich heute hatte! Ich habe so viele interessante Dinge erfahren, während ich geschlafen habe, und dafür bin ich unendlich dankbar! Und deine Morgen waren auch klüger als deine Abende!

Ein kurzer Blick durch alle vorgeschlagenen Sachen wirft wie immer Fragen auf, aber im Moment möchte ich nur herausfinden, ob es möglich ist, den letzten Ausdruck mit nur einer Action() zu machen, da er ziemlich umfangreich ist:

if (!A) if (!B) if (!C) if (!D)
else Action();


Ich habe den Eindruck, dass es schneller gehen könnte. Stimmt, es schließt nicht aus, dass alle Bedingungen geprüft werden, wenn nur die letzte ausgeführt wird, oder ich irre mich, was für mich besser wäre.

Was meinen Sie dazu?

 
FAQ:
Wem "fucking MQL4" nicht gefällt, der kann sich auch gleich aus dem Staub machen. Denn es ist unklar, was er hier tut, trotz aller Vorzüge und der Altertümlichkeit des Berichts.
Bitte erklären Sie es den Uneingeweihten!
 
Meat:
Im Allgemeinen wäre dies die schnellste Option:

Die Zeileresult=false sollte jedoch besser mit der ersten Zeile kombiniert werden, da sie die Geschwindigkeit nicht beeinträchtigt.Wenn A, B, C und D einfache Bedingungen enthalten (mit minimaler Arithmetik, ohne Aufrufe aller mathematischen Funktionen und sonstigem Zeug), dann wird man im Allgemeinen keinen großen Leistungsgewinn durch eine solche Optimierung erzielen (es sei denn, diese Konstruktion wird zig Millionen Mal ausgeführt). Aber die Überladung von Code kann erheblich sein.

Ich habe in einem der Threads darüber geschrieben, dass alles rational gehandhabt werden muss. Aus irgendeinem Grund scheint es mir, dass Ihr Code voller wichtigerer Stellen ist, deren Optimierung wirklich einen enormen Performancegewinn bringen würde. Sie sollten mit dem grundlegenden Algorithmus beginnen. Die meisten Neulinge haben einen dummen Check aller Bedingungen bezüglich TS oder offener Aufträge bei jedem Tick. In den meisten Fällen reicht es jedoch aus, nur die Randbedingungen zu prüfen, z. B. wenn der Hoch- oder Tiefpunkt einen bestimmten Wert erreicht oder wenn ein neuer Balken erscheint. Erst danach können Sie weitere Prüfungen durchführen.

Nun, außer bei ressourcenintensiven Berechnungen sollten Sie darüber nachdenken, diese Berechnungen in eine DLL zu verlagern. Andernfalls, zu sitzen und warten für 13 Minuten in fucking MQL4 (während Sie das gleiche Ergebnis für 2-3 Minuten erhalten können) scheint unglücklich zu sein :)


obwohl ich mit dem ersten Teil absolut einverstanden bin.
 
icas:

Auf diese Weise geht es noch schneller.

Dazu fällt mir ein Märchen ein:

"Es gab zwei Fragen in einer Vorstandssitzung eines Unternehmens:

1. Die Entscheidung zum Bau des Synchrophasotrons.

2. Die Entscheidung, einen Fahrradparkplatz für Mitarbeiter zu bauen.

Beim ersten Thema dauerte die Diskussion 1 Minute,

Am 2. Tag dauerte die Debatte mehr als 2 Stunden.

Ja, klar... Über den Fahrradpark...
 
borilunad:

Was für eine fruchtbare Nacht ich heute hatte! Ich habe so viele interessante Dinge erfahren, während ich geschlafen habe, und dafür bin ich unendlich dankbar! Und deine Morgen waren auch klüger als deine Abende!

Ein kurzer Blick durch alle vorgeschlagenen Sachen wirft wie immer Fragen auf, aber im Moment möchte ich nur herausfinden, ob es möglich ist, den letzten Ausdruck mit nur einer Action() zu machen, da er ziemlich umfangreich ist:

Ich habe den Eindruck, dass es schneller gehen könnte. Stimmt, es schließt nicht aus, dass alle Bedingungen geprüft werden, wenn nur die letzte ausgeführt wird, oder ich irre mich, was für mich besser wäre.

Was meinen Sie dazu?

Nein, so funktioniert das nicht. Erstens muss nach if() etwas stehen, zumindest nur ein Semikolon (d.h. ein leerer Operator). Zweitens: Zu welchem der "Wenns" soll Ihr anderer Betreiber gehören? Wenn sie sich nur auf die letzte Bedingung bezieht (wie Sie es geschrieben haben), dann wird Action nur ausgeführt, wenn die Bedingung D wahr ist, vorausgesetzt, dass A, B und C falsch sind. Es ist immer ratsam, geschweifte Klammern zu setzen, um die Logik klar zu erkennen.

 
FAQ:

Ich danke Ihnen! Ich vermeide die Verwendung von DLL und anderem Pro-MCLogo-Zeug im Moment.

Ich nutze diese Gelegenheit, um Alexey (Meat) zu antworten, dass alle Positionseröffnungen auf einem neuen Balken erfolgen, allerdings auf M1, aber alles andere funktioniert auf jedem Tick. Außerdem verwende ich eine Menge notwendiger Funktionen (wenn ich jedes Mal beim Start alles überprüfen würde, wäre der Code wirklich schwer). Es gibt sogar eine MathPow(), die ich versuchen werde, durch den von Mathematician vorgeschlagenen Exponenten zu ersetzen. Im Übrigen werden alle notwendigen Überschreitungen für Änderungen und Schließungen vorgenommen. Wie kann man ohne sie auskommen?

 
Achten Sie auf die Überwachung und Neuberechnung von Aufträgen. Das ist das, was Berater in der Regel am meisten tun.
 
alsu:

Nein, so funktioniert das nicht. Erstens muss nach if() etwas stehen, zumindest nur ein Semikolon (d.h. ein leerer Operator). Zweitens: Zu welchem der "Wenns" soll Ihr anderer Operator gehören? Wenn sie sich nur auf die letzte Bedingung bezieht (wie Sie es geschrieben haben), dann wird Action nur ausgeführt, wenn die Bedingung D wahr ist, vorausgesetzt, dass A, B und C falsch sind. Es ist immer wünschenswert, geschweifte Klammern zu setzen, um die Logik klar zu erkennen.

Ich danke Ihnen! Aber ich brauche nur eine Action();, aber ich weiß nicht wie! Können Sie mir einen Tipp geben?

 
FAQ:
Achten Sie auf die Kontrolle und die Neuberechnung der Aufträge, denn das ist es, was die Berater in der Regel am meisten tun.
Aber sie sind unvermeidlich, sonst gibt es Fehler!
 

In meinen Programmen verwende ich diese Konstruktion, wenn es viele ifs gibt, und setze Bedingungen ein, die in den meisten Fällen von vornherein falsch sind:

if (A>B)
{  if (C>=10)
   {  if (D<=5)
      {  if(E=1)
         Action:
      }
   }
}
Und wenn es notwendig ist, eine Menge ifs zu überprüfen, dann sieht es so aus
if (A>B || N<M)
{  if (C>=10 || P<100)
   {  if (D<=5 || R>1)
      {  if(E=1 || S!=0)
         Action:
      }
   }
}
Grund der Beschwerde: