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

 
alsu:
Wir können das Ganze noch weiter beschleunigen, z.B. wenn wir wissen, dass Bedingung A im Durchschnitt häufiger erfüllt ist als C und C häufiger als B, dann sollten wir sie in diese Reihenfolge bringen: if(!a){if(!c)if{(!b) M=false;}}

Man kann die Dinge noch weiter beschleunigen, indem man die Wahrscheinlichkeit, dass eine Bedingung eintritt, mit ihrer Rechenkomplexität kombiniert: Nimmt man beispielsweise als Kriterium das Produkt aus der Eintrittswahrscheinlichkeit und dem Kehrwert der Rechenzeit, so sind die ersten zu prüfenden Bedingungen diejenigen, die am wahrscheinlichsten sind und die geringste Rechenkomplexität aufweisen, d. h. diejenigen, die den höchsten Wert unseres gegebenen Kriteriums haben.
 
TarasBY:

Sie können auf diese Weise auch Berechnungen optimieren:

Oder Sie könnten es so versuchen:

    bool M = false;

    if (A) M = true; else if (B) M = true; else if (C) M = true; else if (D) M = true; else if (E) M = true;
    if (M == true) Action;

Ich danke Ihnen!

 
alsu:

Man kann die Dinge noch weiter beschleunigen, indem man die Wahrscheinlichkeit einer Bedingung mit ihrer Rechenkomplexität kombiniert: Wenn man beispielsweise als Kriterium das Produkt aus Ausführungswahrscheinlichkeit und einem zur Rechenzeit inversen Wert nimmt, prüft man zunächst die Bedingungen, die am wahrscheinlichsten sind und die geringste Rechenkomplexität aufweisen, d. h. die, die den höchsten Wert unseres gegebenen Kriteriums haben.

Ich habe sie schon vor langer Zeit in diese Reihenfolge gebracht. Aber auch wenn mehr als eine Bedingung erfüllt ist, wird die erste Bedingung erfüllt, die in Frage kommt.

Und das macht nichts, denn dann sind die Endbedingungen für alle Varianten gleich.

 
alsu:

Sie können die Dinge noch weiter beschleunigen, indem Sie die Wahrscheinlichkeit einer Bedingung mit ihrer Rechenkomplexität kombinieren: Wenn Sie beispielsweise als Kriterium das Produkt aus Ausführungswahrscheinlichkeit und dem Kehrwert der Rechenzeit nehmen, prüfen Sie zunächst die Bedingungen, die am wahrscheinlichsten sind und die geringste Rechenkomplexität haben, d. h. die, die den höchsten Wert des von uns festgelegten Kriteriums haben.
Alexey, ich antworte noch einmal auf Ihren Vorschlag, die Bedingungen je nach ihrem Einfluss auf die Geschwindigkeit der Ausführung von Aktionen zu tauschen. Und hier ist, was ich gefunden habe! Die komplexesten Berechnungen sind nicht so langsam wie Funktionen, die verschiedene notwendige Marktdaten und offene Positionen für jeden Tick überprüfen. Auf Anraten eines Forumsteilnehmers habe ich diese Funktionen bereits stark vereinfacht und alles Unnötige weggelassen, wodurch sich ihre Geschwindigkeit fast verdoppelt hat. Was die Entscheidung betrifft, an "jedem" Tick zu arbeiten, so war ich schon früher davon überzeugt, dass nur dieser Modus mich näher an die tatsächlich möglichen Ergebnisse bringt. Nachdem diese Funktionen nach allen Berechnungen, Indikatorüberprüfungen und Überprüfungen des aktuellen Kurses implementiert wurden, hat sich die Geschwindigkeit verdoppelt, so dass der Tester nun 7 Minuten im halben Jahr bzw. 14 Minuten im Jahr läuft. Ich kann nicht auf Funktionen verzichten, die die notwendigen Prüfungen durchführen, wenn die vorherigen Bedingungen es zulassen. Ich werde nun versuchen, den Code zu optimieren, indem ich && in ) if (. Ich würde mich freuen zu erfahren, welche anderen Möglichkeiten der Code-Optimierung es gibt. Ich danke Ihnen und allen anderen für Ihre Hilfe!
 
borilunad:

Keiner der Betreiber passt. Gibt es eine andere Möglichkeit ohne if(A || B || C || D || E) Action;?

Ich bitte die Moderatoren, die Frage nicht in den allgemeinen Fragenthread zu verschieben, da die Frage, über die ich nachdenke, wichtig ist und ich keine vernünftigere Lösung finden kann! Ich danke Ihnen!


if(A || B || C || D || E) Aktion; ich würde dies tunif((A + B + C + D + E) > 0) Aktion; wennAktion mindestens 3 Signale benötigt, schreibe 2 statt 0

die Geschwindigkeit, ich habe sie nicht gemessen.

 
pako:


if(A || B || C || D || E) Aktion; ich würde dies tunif((A + B + C + D + E) > 0) Aktion; wennAktion mindestens 3 Signale benötigt, schreibe 2 anstelle von 0

Geschwindigkeit, ich habe nicht gemessen


Die Geschwindigkeit wäre gewaltig. Die Lösung ist sehr originell
 
Wenn A,B,C,D Funktionen sind, sollten Sie in der Reihenfolge der Komplexität aufwärts zählen, wobei Sie mit der einfachsten Funktion beginnen und diese ständig auf ihre Richtigkeit überprüfen. Dies wird schneller funktionieren.
 
Vinin:

Die Beschleunigung wird gewaltig sein. Die Lösung ist sehr originell.
Gerade angekommen! Vielen Dank, Pako! Vielen Dank, Victor! Ich werde jetzt zu Mittag essen und es ausprobieren!
 
FION:
Wenn A,B,C,D Funktionen sind, muss man nach Komplexität zählen, wobei man mit der einfachsten Funktion beginnt, und sie ständig auf Wahrheit überprüfen. Auf diese Weise geht es schneller.

Vielen Dank für Ihre Teilnahme! A, B, C ... nicht Funktionen, sondern Bedingungen, die Funktionen enthalten und die keine Funktionen enthalten, und die sich zudem gegenseitig ausschließen! Und eine einzige Bedingung reicht aus, um zu anderen Bedingungen zu springen, die bereits Maßnahmen auslösen. Wenn es nur Funktionen gäbe, dann gäbe es kein Problem:

double A = function1(); double B = function2(); double C = function3(); double D = function4(); double E = function5(); und dann wie Pako vorgeschlagen:

if((A + B + C + D + E) > 0)

{andere Bedingung mit gespiegelter Richtung zum Schließen von Byes oder Sells} Aktion;ABER:

Und ich brauche A = Bedingung1, B = Bedingung2, C = Bedingung3, D = Bedingung4, E = Bedingung5. Ist es möglich oder nicht! Oder ist es unmöglich und das war's!

Zum Beispiel:

bool a = true;

//или
double a;

а = (isCloseLastPosByTake() == True && Profit > ProClo / clo - GetProfitCloseLastPosByTake() * clo);

Ich weiß nicht, was ich versuchen soll!

 
borilunad:

Und ich brauche A = Bedingung1, B = Bedingung2, C = Bedingung3, D = Bedingung4, E = Bedingung5. Ist das möglich oder nicht?! Oder ist es unmöglich und das war's!

bool a = true;

//или
double a;

а = (isCloseLastPosByTake() == True && Profit > ProClo / clo - GetProfitCloseLastPosByTake() * clo); <---   10,444 = 8,087 > 3,908 эт на каком языке? 

bool a = false;

if (isCloseLastPosByTake() == True && Profit > ProClo / (clo - GetProfitCloseLastPosByTake() * clo)) a = true;