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

 
OK, ihr Männer der Wissenschaft, dann erklärt doch mal, warum die magische Schrittweite bei 2 aufhört und die einzigartige nicht. Im Quellcode öffnen wir 10 Aufträge und jeder von ihnen sollte eine eindeutige Magie durch einmaliges Inkrement zugewiesen werden und ihre Einzigartigkeit sollte durch Vergleich (!=) in verschachtelten Schleifen überprüft werden: bei einem Inkrement Magie gibt es einen Durchgang mit Vergleich aller Aufträge Magie, wenn es keine Übereinstimmung, dann einzigartig wird gleich der Anzahl dieser Mischungen und wenn es gleich oder größer als die Anzahl der Aufträge ist dann Magie ist einzigartig und es wird dem Auftrag zugewiesen werden.

Ich weiß nicht, ob das zu kompliziert ist, aber ich denke, es ist leichter zu verstehen, wenn wir uns den Code ansehen.
Dateien:
 
pribludilsa #:
Die Sache ist die, dass das Formular bequem ist, indem es eine Anzahl von Elementen angibt, kann es ein Feld füllen. Alles wird abstürzen, wenn 0 eingegeben wird, weil die ArrayResize an die Anzahl der Positionen gebunden ist. Aus diesem Grund habe ich eine zusätzliche Bedingung, wenn die Anzahl der Positionen größer als 0, dann diese Schleife. Ich bringe das auch immer wieder durcheinander, jetzt habe ich es noch einmal überprüft. Der Ratschlag ist richtig, denn andernfalls würde das Forte das Nullelement des Arrays nicht füllen, wofür das Forte ja da ist.

Ja, ich habe deswegen ständig Probleme. Ich hoffe, dass diese Klarstellung die Zahl der Stunden, die für die Behebung von Fehlern aufgewendet werden, um ein Vielfaches reduzieren wird.

 
Nerd Trader #:
Ok, ihr Männer der Wissenschaft, dann erklärt doch mal, warum die magische Erhöhung bei 2 aufhört und die einzigartige nicht. Im Quellcode öffnen wir 10 Aufträge und jeder von ihnen sollte eine eindeutige Magie durch einmaliges Inkrement zugewiesen werden, ihre Einzigartigkeit wird durch Vergleich (!=) in verschachtelten Schleifen überprüft: auf einem Inkrement Magie gibt es einen Durchgang mit Vergleich aller Aufträge Magie, wenn keine Übereinstimmung, dann einzigartig ist gleich der Anzahl der nicht übereinstimmenden und wenn es gleich der Anzahl der Aufträge dann Magie ist einzigartig und es wird zu einem Auftrag zugewiesen werden.

Ich weiß nicht, ob es zu kompliziert ist, aber ich denke, es ist leichter zu verstehen, wenn wir uns den Code ansehen.

Wenn du die Schleife brauchst, um 10 Aufträge mit verschiedenen Magiern zu erstellen, dann solltest du das tun.

    for(int i = 0; i < 10; i ++)
    { 
    int order_send = OrderSend(Symbol(), OP_BUY, 0.01, Bid, 10,
    0, 0, "", i, 0, CLR_NONE);
    if(order_send == -1) ResetLastError();
    }

In diesem Fall habe ich nicht nur die Aufgabe, die Schleife zu kontrollieren, sondern auch die Rolle des Magiers für den Auftrag.


Aber in Ihrem Beispiel gibt es eine Reihe von Fehlern, die zu einer Art Rätsel führen. Nur wenige Menschen werden gründlich nachforschen, was der Grund dafür ist...

Nun, zumindest ist die Bestellschleife falsch... Und die magische Variable ist lokal und wird immer wieder zurückgesetzt... (kumuliert nicht)

 
Nikolay Ivanov #:

Wenn du die Schleife brauchst, um 10 Aufträge mit verschiedenen Magiern zu erstellen, dann solltest du das tun.

In diesem Fall habe ich nicht nur die Aufgabe, die Schleife zu kontrollieren, sondern auch die Rolle des Magiers für den Auftrag.


Aber in Ihrem Beispiel gibt es eine Reihe von Fehlern, die zu einer Art Rätsel führen. Nur wenige Menschen werden gründlich nachforschen, was der Grund dafür ist...

Nun, zumindest ist die Auftragsschleife nicht korrekt... Und die magische Variable ist lokal und wird immer wieder zurückgesetzt... (kumuliert nicht)

Dieser Code ist für den Test und der EA wird keine Aufträge in einer solchen Schleife erstellen; es gibt einige Logik, die nicht in den Test einbezogen werden sollte. Warum ist der Auftragszyklus falsch? Magie sollte gelöscht werden, es gibt keinen Grund, sie anzusammeln. Und hier gibt es nichts zu verstehen, es sind nur zwei verschachtelte Schleifen mit ein paar Codezeilen darin.

 
Nerd Trader #:

Ja, ich habe deswegen ständig Probleme. Ich hoffe, dass diese Klarstellung die Zahl der Stunden, die für die Behebung von Fehlern aufgewendet werden, um ein Vielfaches reduzieren wird.

Ich habe auch eine Weile gebraucht, um es herauszufinden. Die Ironie besteht darin, dass ich zur gleichen Zeit, als andere Nutzer hier über das Gleiche berichteten, anfing, es herauszufinden. Ich hatte nur das richtige Copy-Paste, habe es dann aussortiert und falsch geschrieben, weil ich nur den Input der Schleife überprüft und den Output vergessen habe. Prüfen Sie den Code mit dem Drucker, indem Sie die Prüfwerte erzwingen.
 
Nerd Trader #:

Dieser Code ist zum Testen, der EA wird keine Aufträge in einer solchen Schleife erstellen, es gibt eine Logik für diese, die wir nicht zum Testen hinzufügen sollten. Warum ist die Auftragsschleife falsch? Magie sollte zurückgesetzt werden, es gibt keinen Grund, sie zu akkumulieren.

Es gibt kein -1.

for(int i = OrdersTotal()-1; i >= 0 ; i --)

Wenn Magie so konzipiert ist, dann stellt sich heraus, dass es einen Fehler in der Logik (im Gesamtdesign) gibt und wir ein Rätsel lösen müssen, um ihn zu finden...

 
Nikolay Ivanov #:

nein -1

Wenn Magie so konzipiert ist, dann gibt es einen Fehler in der Logik (im Gesamtdesign), und man muss das Rätsel lösen, um ihn zu finden...

Es sei denn, es ist dies. Aber -1 ist auch hier keine Lösung. Warum liegt ein Fehler vor? Die Magie wird gegeben, wenn die Magie gleich oder größer ist als die Anzahl der Aufträge. Die Magie sollte auf Null gesetzt werden, andernfalls, wenn wir mehrere Aufträge mit Magie 5 und 6 abschließen, werden die neuen Aufträge höher sein als die Magie des letzten Auftrags, d.h. 11-12 und so weiter. Und auf diese Weise, wenn ein Auftrag auf Null gesetzt wird, wird er verglichen und von Null aus iteriert, was zu neuen Aufträgen mit Majics von geschlossenen Aufträgen führt, d.h. 5 und 6...

 
pribludilsa #:
Ich habe auch lange gebraucht, um das herauszufinden. Die Ironie besteht darin, dass ich zur gleichen Zeit, als andere Nutzer hier das Gleiche geschrieben haben, darauf gekommen bin. Ich hatte nur das richtige Copy-Paste, habe es dann aussortiert und falsch geschrieben, weil ich nur den Input der Schleife überprüft und den Output vergessen habe. Prüfen Sie den Code mit einem Drucker, indem Sie die Prüfwerte erzwingen.
Es ist so ärgerlich, dass mql4 keinen anständigen Debugger hat. Selbst bei echten Daten in der obigen Quelle geht der Debugger nicht in die Schleife. Ich muss mich mit Ausdrucken begnügen, aber das ist nicht schlimm.
 

Im Grunde ist es ganz einfach: Ihr Unikat fasst alle nicht übereinstimmenden Aufträge zwischen verschiedenen Magiern zusammen...

Zum Beispiel gibt es 3 Aufträge

Die erste Iteration von magic=1 unique=0, am Ende der Iteration wird unique=2 sein.

Die zweite Iteration magik=2unique=2, am Ende der Iterationwird unique=3 sein

Da 3>=Anzahl aller Aufträge, wird die while-Schleife unterbrochen... Und magic=3 wurde nie überprüft... Also wieder Magie =2 und so weiter mit allen...

 
pribludilsa #:
Oh, richtig, danke. Aber es stellt sich heraus, dass es eine Krücke ist. Genau wie bei der ganzen MQL-Sache .

Streben Sie nachmehr- ALLE Programmiersprachen.

Es ist ganz einfach: In Programmiersprachen beginnt die Zählung bei Null. Die erste Zelle eines Arrays hat einen Index von 0. Daher müssen Sie eine umgekehrte Schleife machen, BEVOR Sie die Null einschließen. D.h. >=0

OrdersTotal() gibt z. B. den Wert 10 aus. Und Sie beginnen eine Schleife bei 10, während der letzte Index des Arrays 9 ist (Sie erinnern sich, wir beginnen bei Null?). Und was passiert, wenn Sie auf eine nicht existierende Array-Zelle zugreifen? Das ist richtig - das Programm stürzt bei einem kritischen Fehler ab, weil Sie in einen nicht zugewiesenen Speicherbereich eingedrungen sind, der die Grenzen des Arrays überschreitet.

Das sind auf jeden Fall solide Krücken. Lies, lerne und alles wird zu dir kommen.

Grund der Beschwerde: