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

 
Kos Mos:

Ich versuche also herauszufinden, woran es liegt, dass ich versage. Mir ist klar, dass mir niemand etwas umsonst sagen wird - Kapitalismus, verdammt noch mal)). Ich habe nichts dagegen, ich muss nur verstehen, warum die Trades bei jeder Kerze in Kaufrichtung geöffnet werden.

Ich habe nicht auf Sie geantwortet.

Wenn Sie wollen, dass Ihre Skier funktionieren, müssen Sie zumindest die Werte der Variablen ausdrucken, die wichtig sind, wenn das Signal empfangen wird, und im Protokoll nachsehen, was mit ihnen geschieht.

 

Es gibt eine Schleife for(int i=0;i<ArrayRange(arr2,0);i++), so möchte ich wissen, wie oft diese Berechnung ArrayRange(arr2,0) durchgeführt wird: einmal und die Maschine merkt sich den Wert, oder jedes Mal, wenn die Schleife ausgeführt wird, wird der Wert von ArrayRange(arr2,0) Funktion zurückgegeben? Beispiel:

1. Möglichkeit.

i=0,i<(zurückgegebener Wert), inkrementieren, dann

i<(Rückgabewert wieder), inkrementieren, dann

i<(gibt wieder einen Wert zurück), auf diese Weise inkrementieren,

2. Variante.

oder, wir geben einen Wert aus dieser Berechnung ArrayRange(arr2,0) einmal zurück, lassen ihn 5 zurückgeben und die Maschine merkt sich diese 5 und erhält folgendes Ergebnis

i=0,i<(Rückgabewert)i<5, inkrementieren, dann

i<5, inkrementieren, dann

i<5, Inkrement - funktioniert das so?

Ich frage warum: Wenn alles mit der ersten Variante passiert, dann ist es sinnvoll, diesen Wert vor der Schleife zu extrahieren und in einer Variablen zu speichern, damit das Programm nicht bei jedem Schleifendurchlauf die Funktion ArrayRange(arr2,0) berechnet.

 
Seric29:

Es gibt eine Schleife for(int i=0;i<ArrayRange(arr2,0);i++), so möchte ich wissen, wie oft diese Berechnung ArrayRange(arr2,0) durchgeführt wird: einmal und die Maschine merkt sich den Wert, oder jedes Mal, wenn die Schleife ausgeführt wird, wird der Wert von ArrayRange(arr2,0) Funktion zurückgegeben? Beispiel:

1. Möglichkeit.

i=0,i<(zurückgegebener Wert), inkrementieren, dann

i<(Rückgabewert wieder), inkrementieren, dann

i<(gibt wieder einen Wert zurück), auf diese Weise inkrementieren,

2. Variante.

oder, wir geben einen Wert aus dieser Berechnung ArrayRange(arr2,0) einmal zurück, lassen ihn 5 zurückgeben und die Maschine merkt sich diese 5 und erhält folgendes Ergebnis

i=0,i<(Rückgabewert)i<5, inkrementieren, dann

i<5, inkrementieren, dann

i<5, Inkrement - funktioniert das so?

Warum ich frage: Wenn alles auf der ersten Variante passiert, dann macht es Sinn, vor der Schleife zuerst diesen Wert zu extrahieren und in einer Variablen zu speichern, so dass das Programm nicht bei jedem Durchlauf der Schleife die Funktion ArrayRange(arr2,0) ausführt.

im allgemeinen Fall - 1. Fall.

PS/ 2. ist nur für "optimierende" Compiler möglich, die verstehen können, dass wenn es keine ArrayResize innerhalb einer Schleife gibt, dann ArrayRange:=const; Ich bin nicht sicher, dass mql Compiler bereits so tief in Code gräbt, obwohl für seine "native" Funktionen dies theoretisch möglich ist.

PPS/ Das ArrayRange()-Beispiel ist nicht ganz korrekt, da es wahrscheinlich keinen direkten Funktionsaufruf geben wird, sondern der Compiler es auf den Vergleich von i mit einer internen Array-Variablen reduzieren muss, da er alles über Arrays weiß.

 
Maxim Kuznetsov:

im allgemeinen Fall - 1. Variante.

PS/ 2. ist nur für "optimierende" Compiler möglich, die verstehen können, dass wenn es kein ArrayResize innerhalb der Schleife gibt, dann ArrayRange:=const; ich bin nicht sicher, ob mql Compiler bereits so tief in den Code gräbt, obwohl es für seine "nativen" Funktionen theoretisch möglich ist.

PPS/ Beispiel mit ArrayRange() ist nicht ganz korrekt, weil es wahrscheinlich keinen direkten Funktionsaufruf geben wird, sondern der Compiler muss es auf den Vergleich von i mit der internen Array-Variable reduzieren, weil er alles über Arrays weiß.

Nehmen wir den Ausdruck5+5*5

die 1. Variante.

i=0,i<(5+5*5), inkrementieren, dann

i<(5+5*5), inkrementieren, dann

i<(5+5*5), auf diese Weise erhöhen,

2. Variante.

oder, in diesem Fall, ist das Ergebnis eine einzige Rückgabe von 5+5*5, lassen Sie sie 30 zurückgeben und die Maschine merkt sich diese 30-ku, so dass wir die folgenden Ergebnisse erhalten

i=0,i<(zurückgegebener Wert) i<30, inkrementieren, weiter (die Maschine merkt sich automatisch 30, weil ich 30 nicht irgendwo gespeichert habe)

i<30, inkrementieren, dann

i<30, Inkrement, funktioniert das so?

Ich nehme an, es wird die 1. Variante sein? 5+5*5 ist ein Ausdruck, der bei jeder Iteration der Schleife ausgewertet wird. Sie können diesen Ausdruck vor der Schleife berechnen und 30 in einer Variablen speichern und in die Schleife einspeisen, was für die Maschine einfacher zu handhaben ist, es sei denn, sie berechnet diese 30 automatisch und speichert sie in ihrem Speicher.


Wenn es keinen Funktionsaufruf gibt, kann der Compiler den booleschen Ausdruck i<5 nicht überprüfen, so dass wahrscheinlich die erste Option funktionieren wird.

 

Das Ergebnis einer Funktion(ArrayRange) kann innerhalb einer Schleife oder Funktion geändert werden.
Und der konstante Ausdruck(5+5*5) wird immer derselbe sein.

Daher wird die Funktion bei jedem Durchgang berechnet.
Der Wert der Konstante wird vom Compiler bei der Kompilierung in den Code eingefügt.

 
Taras Slobodyanik:

Das Ergebnis einer Funktion(ArrayRange) kann innerhalb einer Schleife oder Funktion geändert werden.
Und der konstante Ausdruck(5+5*5) wird immer derselbe sein.

Daher wird die Funktion bei jedem Durchgang berechnet.
Der Wert der Konstante wird vom Compiler bei der Kompilierung in den Code eingefügt.

5+5*5 ist auch ein Ausdruck und muss bei jedem Schleifendurchlauf berechnet werden; von der Funktion wird erwartet, dass sie dasselbe Ergebnis zurückliefert; der Punkt ist, dass der Compiler bei jedem Schleifendurchlauf sowohl die Funktion als auch den Ausdruck 5+5*5 berechnet. Also wird es die erste Option sein - d.h. die Berechnung wird bei jedem Schleifendurchlauf durchgeführt, also ist es sinnvoll, diesen Wert vor der Schleife zu zählen und in einer Variablen zu speichern und die Variable als denselben statischen Wert zu verwenden, so dass bei jedem Schleifendurchlauf keine Berechnungen stattfinden, das macht schließlich meine

int k=5+5*5;//k=30

for(int i=0;i<k;i++){}

wobei k immer 30 ist oder

int k=ArrayRange(arr2,0)//k=5

for(int i=0;i<k;i++){}

wobei k immer gleich 5 ist.

 
Seric29:

5+5*5 ist auch ein Ausdruck und sollte bei jedem Schleifendurchlauf berechnet werden, da die Funktion das gleiche Ergebnis zurückgeben soll, der Punkt ist, dass der Compiler bei jedem Schleifendurchlauf sowohl die Funktion als auch den Ausdruck 5+5*5 zählt. Es wird also die erste Option sein - d.h. die Berechnung wird bei jedem Schleifendurchlauf durchgeführt, daher ist es sinnvoll, diesen Wert vor der Schleife zu zählen und in einer Variablen zu speichern und die Variable als den gleichen statischen Wert zu verwenden, so dass keine Berechnungen bei jedem Schleifendurchlauf stattfinden, sie kann schließlich

int k=5+5*5;//k=30

for(int i=0;i<k;i++){}

wobei k immer 30 ist oder

int k=ArrayRange(arr2,0)//k=5

for(int i=0;i<k;i++){}

wobei k immer gleich 5 ist.

Sie könnten einfach die Schleife erweitern und keine zusätzlichen Variablen erstellen.

 
Seric29:

5+5*5 ist auch ein Ausdruck und muss bei jedem Durchlauf berechnet werden, da die Funktion dasselbe Ergebnis zurückgeben soll, geht es darum, dass der Compiler bei jedem Durchlauf des Zyklus immer noch sowohl die Funktion als auch den Ausdruck 5+5*5 zählt. Es gibt also die erste Option - d.h. die Berechnung erfolgt bei jedem Durchlauf des Zyklus, also ist es sinnvoll, diesen Wert vor dem Zyklus zu zählen und in einer Variablen zu speichern und die Variable als denselben statischen Wert zu verwenden, so dass es keine Berechnungen bei jedem Durchlauf des Zyklus gibt, es ist schließlich mo

Der Compiler arbeitet immer nur einmal - in dem Moment, in dem der Text in den Code kompiliert wird.
(soweit ich mich erinnere, kompiliert MT4 auch schon direkt in Code)

5+5*5 - dies ist ein Ausdruck mit Konstanten, die nicht neu berechnet werden müssen - es wird also nur einmal berechnet, zur Kompilierzeit, und der Code enthält die Zahl 30

5+5*5+i ist ein Ausdruck mit einer Variablen, und diese wird im Code bei jedem Durchlauf als 30+i berechnet

Die FunktionArrayRange gibt einen Wert zurück, aber der Compiler weiß nicht, wie hoch dieser Wert sein wird, so dass er den Funktionsaufruf im Code ersetzt, und bei jedem Durchlauf (im Code) wird die Funktion aufgerufen
 
Taras Slobodyanik:

Der Compiler arbeitet immer nur einmal - zum Zeitpunkt der Textkompilierung in Code.
(soweit ich mich erinnere, kompiliert MT4 bereits direkt in Code)

5+5*5 ist ein Ausdruck mit Konstanten, die nicht neu berechnet werden müssen - also wird dies nur einmal berechnet, zur Kompilierzeit, und im Code wird es 30 sein

5+5*5+i ist ein Ausdruck mit einer Variablen, der im Code bei jedem Durchlauf als 30+i berechnet wird.

Die FunktionArrayRange gibt einen Wert zurück, aber der Compiler weiß nicht, wie hoch dieser Wert sein wird, so dass er den Funktionsaufruf im Code ersetzt, und bei jedem Durchlauf (im Code) wird die Funktion aufgerufen

Ich verstehe. Ich danke Ihnen. Das ist natürlich keine ernste Frage, aber es gibt Feinheiten.

 
Artyom Trishkin:

Sie können die Schleife einfach erweitern und keine zusätzlichen Variablen erstellen.

in meinem Fall gibt es 2 mathematische Ausdrücke 1st-ArrayRange(arr2,0) 2nd5+5*5 mein Ziel ist es, Bedingungen zu schaffen, unter denen der Compiler mit weniger Last arbeiten wird

for(int i=0;i<ArrayRange(arr2,0);i++) in diesem Fall wird der Vergleichswert bei jedem Durchlauf zurückgegeben

int k=ArrayRange(arr2,0)//k=5 for(int i=0;i<k;i++){}in diesem Fall wird der Vergleichswert 1 Mal statt 4 Mal zurückgegeben, aber es wird eine Variable erstellt, trotzdem ist die Belastung geringer, besonders wenn es um Tausende oder Millionen geht.

Können Sie uns zeigen, wie wir eine Schleife erweitern können, so dass wir keine Variablen erstellen müssen?

Grund der Beschwerde: