Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 829

 

Es gibt eine Frage zu diesem Format: Es gibt diesen Code

int P=3;

if(P==5){dann ist es notwendig, in die Bibliothek zu gehen und etwas zu berechnen}

In diesem Fall ist P=3, d.h. die Bedingung ist falsch. Die Frage ist, ob der Compiler in die Bibliothek gelangt und den Code untätig ausführt oder ob er den Code in der aktuellen Datei liest. Ich werde Ihnen erklären, warum ich diese Frage gestellt habe. Angenommen, wir schreiben die folgende Formatbedingung

int Y=4;

if(Y==4){etwas tun} sonst{etwas anderes tun}. In dieser Situation ergibt sich folgendes Bild: Y==4, als erstes können wir sagen, dass der Prioritätsoperator ausgeführt wurde, aber der else-Block wird auch geprüft und berechnet (nur berechnet und immer), aber nicht ausgeführt, weil die Priorität ein Ausdruck if(Y==4) ist. Mit anderen Worten: Unabhängig vom wahren Ergebnis führt die Maschine alle Berechnungen durch, d. h. sie wendet Energie für Berechnungen auf, unabhängig davon, ob der sekundäre Operator ausgeführt wird oder nicht. Wenn ich große Programme und Bibliotheken verwende und der Compiler jedes Mal den Bibliothekscode ausgräbt, wird das Programm schließlich langsamer. Wie effektiv ist die Verwendung von Bibliotheken in diesem Fall, sollte ich den mql4-Code selbst so knapp wie möglich halten, um die Roboterleistung hoch zu halten? Wer hat eine Meinung zu diesem Thema?

 
Pavel Soin:

Hallo.

Nehmen wir an, ich habe 2 Indikatoren, der erste hat 4 Puffer, der zweite hat 2. Ich lege sie in ein Diagramm und öffne das Datenfenster (CTRL+D). Die Liste enthält 6 Puffer von 0 bis 5. Wie kann ich den Wert von Puffer 5 aus dieser Liste in MQL lesen? Es ist nicht sinnvoll, iCustom mit dem gewünschten Indikator zu verwenden. Es ist bequemer, diese Liste zu verwenden. Ich weiß, dass sie das tun, aber wie?

Kann mir jemand helfen?

 
Seric29:

Es gibt eine Frage zu diesem Format: Es gibt diesen Code

int P=3;

if(P==5){dann ist es notwendig, in die Bibliothek zu gehen und etwas zu berechnen}

In dieser Situation ist P=3, d.h. die Bedingung ist falsch. Die Frage ist, ob der Compiler in die Bibliothek gelangt und den Code untätig ausführt oder ob er den Code in der aktuellen Datei liest. Ich werde Ihnen erklären, warum ich diese Frage gestellt habe. Angenommen, wir schreiben die folgende Formatbedingung

int Y=4;

if(Y==4){etwas tun} sonst{etwas anderes tun}. In dieser Situation ergibt sich folgendes Bild: Y==4, als erstes können wir sagen, dass der Prioritätsoperator ausgeführt wurde, aber der else-Block wird auch geprüft und berechnet (nur berechnet und immer), aber nicht ausgeführt, weil die Priorität ein Ausdruck if(Y==4) ist. Mit anderen Worten: Unabhängig vom wahren Ergebnis führt die Maschine alle Berechnungen durch, d. h. sie wendet Energie für Berechnungen auf, unabhängig davon, ob der sekundäre Operator ausgeführt wird oder nicht. Wenn ich große Programme und Bibliotheken verwende und der Compiler jedes Mal den Bibliothekscode ausgräbt, wird das Programm schließlich langsamer. Wie effektiv ist die Verwendung von Bibliotheken in diesem Fall, sollte ich den mql4-Code selbst so knapp wie möglich halten, um die Roboterleistung hoch zu halten? Wer hat eine Meinung zu diesem Thema?

Der integrierte Debugger von MetaEditor beantwortet diese Fragen sehr gut. Sie sollten ein Skript mit ähnlichen Bedingungen schreiben und es Schritt für Schritt im Debugger ausführen. Sie werden sehen, dass das Programm nicht an die Stelle kommt, an der es nichts zu tun hat. Außerdem ist eine solche Bedingung

int P = 3, Y = 4;
if(P == 5 && Y == 4)

Nachdem geprüft wurde, dass P != 3 ist, wird nichts weiter geprüft.

 
Guten Tag. Können Sie mir sagen, was ich tun muss, damit alle grafischen Elemente am Wochenende in der Tabelle erscheinen?
 
Lomonosov1991:
Guten Tag. Können Sie mir sagen, was ich tun muss, damit alle grafischen Elemente am Wochenende in der Tabelle erscheinen?
Löschen Sie sie nicht
 
Alexey Viktorov:

Der integrierte Debugger in MetaEditor beantwortet diese Fragen sehr gut. Schreiben Sie ein Skript mit ähnlichen Bedingungen und führen Sie es Schritt für Schritt im Debugger aus. Sie werden sehen, dass das Programm nicht an die Stelle kommt, an der es nichts zu tun hat. Außerdem ist diese Bedingung

Nachdem geprüft wurde, dass P != 3 ist, wird nichts weiter geprüft.

Hier ein Beispiel

int pp=8;if(pp==8){pp=3;}else{pp=340000000000000000000000000000;}

pp=8 ist in diesem Fall 8, aber der Compiler flucht über die große Zahl, die ich in eine Variable packen will, aber ich werde diese Zahl nicht in eine Variable packen, weil pp=8 korrekt ist, aber aus irgendeinem Grund fängt der Compiler an zu graben, was ich geschrieben habe und prüft, ob es sein kann, also schließen wir, dass es der Compiler ist, der prüft und zählt, nun, das ist sicherlich ein grober Fehler, wir könnten weniger schwerwiegende Fehler machen, aber der Compiler wird trotzdem prüfen, ob es sein kann oder nicht. Ich habe nicht vor, so etwas hineinzuschreiben, aber der Compiler prüft, was er tun soll, aber er tut es nicht und es wird gezählt. Ich habe versucht, mit dem MQL4-Debugger zu arbeiten, ich habe die Anweisungen hierhttps://www.metatrader5.com/ru/metaeditor/help/development/debug gelesen, aber ich habe nicht einmal eine aktive Registerkarte "Check against history" gesehen, obwohl die Anweisungen darauf hindeuten, dass sie aktiv sein sollte.

 
Seric29:

Hier ein Beispiel

int pp=8;if(pp==8){pp=3;}else{pp=340000000000000000000000000000;}

pp=8 ist in diesem Fall 8, aber der Compiler flucht über die große Zahl, die ich in eine Variable stecken will, aber ich werde diese Zahl nicht in eine Variable stecken, weil pp=8 korrekt ist, aber aus irgendeinem Grund fängt der Compiler an zu graben, was ich geschrieben habe und prüft, ob es sein kann, also schließen wir, dass es der Compiler ist, der prüft und zählt, nun, das ist sicherlich ein grober Fehler, wir könnten weniger schwerwiegende Fehler machen, aber der Compiler wird trotzdem prüfen, ob es sein kann oder nicht. Ich habe nicht vor, so etwas hineinzuschreiben, aber der Compiler prüft, was er tun soll, aber er tut es nicht und es wird gezählt. Ich habe versucht, mit dem MQL4-Debugger zu arbeiten, ich habe die Anweisungen von hierhttps://www.metatrader5.com/ru/metaeditor/help/development/debug gelesen, aber die Registerkarte "check against history" ist nicht einmal aktiv, obwohl die Anweisungen vorschlagen, dass es sein sollte. Ich habe versucht, mit echten Daten zu überprüfen, aber in diesem Fall werden die Variablenwerte nicht angezeigt, sie sind alle leer, ich habe mich nur gefragt, wie es so sein könnte.

Der Compiler prüft zur Kompilierzeit auf gültige Werte, nicht aber zur Laufzeit. Informieren Sie sich über Variablentypen und die zulässigen Wertebereiche für diese Variablen. Wenn der Compiler diese Bereiche nicht überprüft hat, können bei der Ausführung des Codes Werte verloren gehen und falsche Berechnungsergebnisse erzielt werden. Dieses Verhalten ist also gut für den Programmierer. Der Compiler warnt immer vor dem möglichen Verlust der Genauigkeit.

Und der MT4-Debugger funktioniert nicht mit historischen Daten. Es ist das Vorrecht des MT5-Testers. Aber es macht sowieso keinen Sinn, Skripte in der Historie zu debuggen, und Sie können beobachten, was ich im MT4-Tester vorschlage. Es genügt, am Anfang des Codes einen Haltepunkt zu setzen und dann die Reihenfolge der Ausführung und die Werte der Variablen Schritt für Schritt zu beobachten.

 
Finden Sie es in Ordnung, Teile von dekompiliertem Code zu diskutieren?
Zumindest sollten sie die Variablen umbenennen. Es ist nicht so schamlos...
 
Artyom Trishkin:
Finden Sie es in Ordnung, Teile von dekompiliertem Code zu diskutieren?

Zumindest sollten sie die Variablen umbenennen. Sonst ist es zu dreist...

Dieser EA ist online im MQL4-Format verfügbar. Trio Dancer. Ich mache es nur für mich neu.

 
Lomonosov1991:

Dieser Berater ist online verfügbar. Trio Dancer. Ich modifiziere es nur für mich.

Na und? Es gibt Orte, an denen sie gestohlene Waren kaufen und verkaufen.
Dieses Forum gehört nicht zu dieser Kategorie.
Sie wurde vor einiger Zeit gehackt (dem Autor gestohlen), und jetzt machen Sie sie für sich selbst. Bitte tun Sie dies nicht auf dieser Website. Wir haben hier eine Ethik.
Grund der Beschwerde: