Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Achten Sie auf den Filter nach Symbolen und nach Assistenten in der Positionsschleife. Wenn es keinen Filter gibt, sondern Sie alle offenen Positionen für alle Symbole durchsuchen, ist das schlecht.
Auf den ersten Blick scheint also alles in Ordnung zu sein.
Achten Sie auf den Filter nach Symbolen und nach Assistenten in der Positionsschleife. Wenn es keinen Filter gibt, sondern Sie alle offenen Positionen für alle Symbole durchsuchen, ist das schlecht.
Auf den ersten Blick scheint also alles in Ordnung zu sein.
Vielen Dank, Andrew! Ich verstehe alles über Magic, weil mehrere Positionen für ein Symbol geöffnet werden können, aber ich habe eine andere Frage. Geht der Expert Advisor die offenen Positionen für alle Symbole auf einmal durch, wenn er nicht explizit auf das aktuelle Symbol hingewiesen wird? Und das, obwohl er für ein bestimmtes Währungspaar, z. B. EURUSD, eingestellt ist? Ehrlich gesagt, verstehe ich diesen Punkt nicht ganz.
Mit freundlichen Grüßen, Vladimir.
Vielen Dank, Andrey! Ich verstehe alles über Magic, weil mehrere Positionen auf ein Symbol eröffnet werden können, aber ich habe noch eine andere Frage. Wird der EA die offenen Positionen für alle Symbole auf einmal durchgehen, wenn er nicht explizit auf das aktuelle Symbol verwiesen wird? Und das, obwohl er für ein bestimmtes Währungspaar, z. B. EURUSD, eingestellt ist? Ehrlich gesagt, verstehe ich diesen Punkt nicht ganz.
Mit freundlichen Grüßen, Vladimir.
Also habe ich auf der Grundlage der gelesenen Literatur einen kurzen Algorithmus zur Erstellung eines Expert Advisors mit der Trailing-Stop-Funktion geschrieben:
Bitte überprüfen Sie den Algorithmus und geben Sie mir einige Hinweise darauf, welche Punkte übersehen worden sind.
Mit freundlichen Grüßen, Vladimir.
Die Theorie ist nicht schlecht, jetzt wollen wir uns auf die Praxis konzentrieren. Wird es funktionieren?
Gut in der Theorie, jetzt die Praxis. Können Sie das tun?
Ich werde es versuchen. Aber Sie verstehen, dass dies einen ganz anderen Wissensstand erfordert, und den habe ich noch nicht.
Mit freundlichen Grüßen, Vladimir.
Ja, Alexey, ich habe diesen Code bereits gesehen. Sie hat die Form einer Include-Datei. Um ehrlich zu sein, habe ich darin nichts über das Symbol gefunden, obwohl ich es mehrmals angesehen habe. Vielleicht habe ich etwas missverstanden oder ich suche einfach nur schlecht.
Mit freundlichen Grüßen, Vladimir.
Lassen Sie uns zunächst mit den Funktionen fortfahren.
Wie ich bereits schrieb, gibt es überall Funktionen, man muss sie nur lieben und wissen, wie man sie schreibt. Funktionen, sind unsere kleinen Kämpfer für die Lösung globaler Probleme. Wenn wir Generäle in einer Armee wären, welche Art von Kämpfern würden wir kontrollieren wollen? Hier ist eine grobe Liste:
Aber wir sind abgelenkt, gehen wir wieder zu den Funktionen über.
Wenn eine Funktion zu viele Probleme löst, ist sie - in Anlehnung an die Analogie - ein sehr cleverer Kämpfer, der, wenn etwas schief geht, das ganze Unternehmen ruinieren könnte. Wenn Sie sich fragen, was eine solche Funktion bewirkt, könnte die Antwort lang sein. Wenn das Ergebnis dieser Funktion plötzlich nicht mehr korrekt ist, wird es sehr schwierig sein, die Fehlerursache herauszufinden (da es viele Aufgaben, viel Code und viele Aufrufe von Unterprozeduren gibt und es schwer zu verstehen ist, wo genau der Fehler liegt).
Wenn eine Funktion montags, mittwochs und sonntags und an den übrigen Tagen je nach unserer "Stimmung" korrekte Ergebnisse berechnet, können wir uns dann auf diese Funktion verlassen? Stellen Sie sich vor, dass die OrderSend-Funktion Positionen nur donnerstags öffnet und dass ein magischer Parameter 13 definiert ist. Und das ist keineswegs Unsinn oder Fantasie. Dieses Verhalten lässt sich mit einem Fingerschnippen einrichten - es genügt, die Funktion von einigen Parametern in der äußeren Umgebung abhängig zu machen.
Angenommen, die Funktion:
gibt immer die Summe zweier Werte zurück, unabhängig von der äußeren Umgebung. Das heißt, selbst wenn wir diese Funktion in ein anderes Skript oder einen Expert Advisor kopieren, wird sie dort einwandfrei funktionieren. Diese Funktion kann einmal geschrieben werden und durch einfaches Kopieren in vielen unserer Programme verwendet werden. Wir werden uns immer auf sein Ergebnis verlassen können, weil wir wissen, dass sein Funktionieren von nichts abhängt. Solche Funktionen, deren Ergebnis nicht von ihrer Umgebung abhängt, werden als nebenwirkungsfreie oder reine Funktionen bezeichnet. Wenn wir uns bemühen, reine Funktionen zu schreiben, bekommen wir bald eine Menge davon. Das heißt, Sie können sie in einer Datei zusammenfassen und in Ihre neuen Projekte einbinden. Dies wird als Code-Wiederverwendung bezeichnet. Wir machen die Arbeit nicht zweimal. Stattdessen verwenden wir bereits geschriebene Funktionen, die wir kennen und deren Zuverlässigkeit mehr als einmal getestet worden ist.
Betrachten wir nun das Gegenbeispiel:
Das Ergebnis scheint dasselbe zu sein, denn c ist immer Null. Oder ist das nicht immer so? Was ist, wenn jemand irgendwo c ändert? Was dann? Was ist, wenn jemand irgendwo die externe Variable c auch verwendet, aber für seine eigenen Zwecke, und er hat eine Variable c von einem anderen Typ, sagen wir string? Die Kombination dieser beiden Funktionen ist nicht mehr möglich (der Compiler erlaubt es nicht, zwei Variablen mit demselben Namen zu deklarieren). Ihre gemeinsamen Abhängigkeiten sind ebenfalls schwer zu lösen. Ich weiß gar nicht, was ich damit anfangen soll. Ich kenne zum Beispiel immer noch keinen zuverlässigen und einfachen Weg, um solche Funktionen zusammenarbeiten zu lassen.
Selbst wenn es keine andere Funktion gibt und nur eine Funktion eine externe Variable liest, ist es nicht so einfach, sie an eine andere Stelle zu kopieren. Wir müssen sowohl diese Funktion als auch ihre Abhängigkeit kopieren. Was aber, wenn wir diese Funktionen in eine gemeinsame Datei kopieren? Wir haben dort 50 oder 100 dieser Funktionen. Und jede von ihnen kopiert mit sich selbst einen Haufen ihrer eigenen abhängigen Variablen. Es entsteht ein Wirrwarr von zusammenhängenden Variablen mit unklaren Funktionen. Aber wozu ist das alles gut? Welche Probleme werden damit gelöst? Warum unnötige Abhängigkeiten schaffen, wenn man in den allermeisten Fällen darauf verzichten kann?
Die Funktionen haben eine weitere überraschende Eigenschaft. Die Funktionen sind selbstbeschreibend. Mit anderen Worten: Sie müssen kein Schema entwerfen, sondern nur gute Namen wählen und den allgemeinen Algorithmus in Funktionen unterteilen. Hier ist ein Beispiel:
Ich weiß nicht, was dieser Code bewirkt, denn die Funktionen sind nicht einmal geschrieben. Aber wenn ich es lese, würde es wahrscheinlich bedeuten, dass die erste <erste> anhängige Order mit der Richtung ORDER_TYPE_BUY erfolgreich ausgewählt wird, dann wird sie storniert (die erste Funktion wählt aus, die zweite storniert). Da der Code bei jedem Tick ausgeführt wird, wird jeder einzelne Auftrag früher oder später storniert, unabhängig davon, wie viele ausstehende Aufträge vorliegen. Das bedeutet auch, dass jeder Versuch, einen schwebenden Kaufauftrag zu platzieren, unterdrückt wird - der Auftrag wird sofort gelöscht. Gleichzeitig werden die Verkaufsaufträge ohne Probleme erteilt.
Es gibt nur zwei Codezeilen und zwei Funktionen. Und der Algorithmus ist nicht trivial, und was noch wichtiger ist, er ist zuverlässig.
Wenn wir über MCL sprechen, sollten wir ein wenig mehr über reine Funktionen sagen. Da es sich um eine Anwendungssprache handelt, ist es schwierig, etwas zu schreiben, ohne sich auf die vom Terminal bereitgestellten Daten zu verlassen. Schließlich ist dies die Hauptaufgabe: die richtige Interaktion mit dem Handelsumfeld. Formal ist jede Handelsumgebung veränderbar: Preise, Anzahl der Aufträge, Änderungen des Saldos usw. usw. Es ist daher nicht klar, welche Funktion in einem derart veränderlichen Handelsumfeld zum Tragen kommt. Denn das externe Handelsumfeld kann auch als eine globale Variable betrachtet werden, die sich ständig verändert. Aber wenn wir OrdersTotal() schreiben, erwarten wir nicht, dass diese Funktion immer den gleichen Wert zurückgibt. Stattdessen erwarten wir, dass sie die Anzahl der ausstehenden Aufträge zurückgibt, die natürlich variieren wird. Daher werden wir in MQL die Funktionen als sauber und wiederverwendbar betrachten, auch wenn sie Funktionen einer externen API aufrufen, wie z.B. OrdersTotal(). Es wird unsere angemessene Nachsicht sein.
Lassen Sie uns mit den Funktionen fortfahren...
Vielen Dank, Vasily, für das unbezahlbare Wissen, das du nicht nur mit mir teilst, sondern auch mit den Programmieranfängern, die dieses Thema lesen oder lesen werden!
Mit dem gleichen großen Respekt, Vladimir.
Ich lerne weiter die Programmiersprache MQL5. Während es keine ernsthaften Bemerkungen über den Code schreiben Algorithmus der Trailing_Stop Expert Advisor (ich erinnere mich über das Symbol und Magic, ich werde es auf den Algorithmus später hinzufügen!), habe ich Input-Parameter für die EA und schrieb den Code der Schleife, die die Suche nach offenen Positionen beginnt.
Als ich den EA ausführte, sah ich ein Problem - in der Registerkarte "Experten" des Handelsterminals erscheinen bei jedem Tick 2 identische Meldungen "A loop has started", obwohl das Handelsterminal nur einen Chart des Währungspaares EURUSD hat und nur eine Position darauf geöffnet ist. Und diese Nachrichten haben genau den gleichen Zeitpunkt der Ausgabe.
Ich habe bis Mitternacht gekämpft, konnte aber nicht gewinnen. Ich kann nicht verstehen, was das Problem ist.
Der Code des Expert Advisors ist auf Englisch geschrieben, während die Kommentare auf Russisch sind, um den Prozess zu erleichtern. In diesem EA habe ich versucht, wie versprochen, alles so zu beschreiben, dass es für einen Schüler der ersten Klasse einer Programmierschule verständlich ist.
Mit freundlichen Grüßen, Vladimir.
i entspricht der Anzahl der offenen Positionen, so viele Zyklen werden gedruckt
müssen Sie das "="-Zeichen in Warum müssen Sie den Zyklus durchlaufen, wenn die Anzahl der offenen Positionen 0 ist? Der zweite Druck kommt von diesem Null-Aufruf.