[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 774
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Ich verstehe nicht, was ich habe eine Zeile in den Markt, um die Öffnung, ich kopiere es und fügen Sie eine neue, um die Reihenfolge, sondern die gleichen 4107 Fehler nicht funktioniert, wenn Sie kümmern sich um zu sehen, was ich vermisst
Ich verstehe es nicht, ich habe diese Zeile in der Marktauftragseröffnung, ich kopiere es in einen schwebenden Auftrag und füge einen neuen hinzu, aber derselbe 4107-Fehler wird immer noch in das Protokoll geschrieben, aber schwebende Aufträge werden gesetzt, wenn Sie sich dafür interessieren, was ich übersehen habe.
Sie haben eine verdammt umständliche Codeorganisation. Und die Variablennamen haben Abkürzungen, die das Lesen erschweren.
Der Code sollte in Blöcken organisiert sein. Weisen Sie den Variablen Namen zu, so dass auf den ersten Blick klar ist, worum es im Code geht. Konstante Namen (gewöhnen Sie sich an, sie in Großbuchstaben zu schreiben). Die Initialisierung von Konstanten mit Werten muss in einem Initialisierungsblock untergebracht werden. So haben Sie zum Beispiel eine absolut ungerechtfertigte Verwendung der Zeichenfolge
string sy = Symbol();
beim Start des EA. Nun, sagen Sie mir, warum Sie bei jedem Tick die Funktion Symbol() aufrufen müssen, wenn der Symbolname während des gesamten Handels gleich bleibt? Es reicht aus, einmal mit dem Wert der Variablen sy im Initialisierungsblock zu initialisieren, und das ist alles. Außerdem wird dieser Codeblock
Das ist grundlegend falsch! Um den Stop-Loss der letzten Order zu ermitteln, muss diese (die Order) zunächst mit OrderSelect() ausgewählt werden - siehe das Beispiel im Orderzähler unten. Das bedeutet, dass Sie, wenn Sie Stopp-Levels für die letzten Aufträge benötigen, dies in einer Schleife tun müssen. Nächste. Die Gestaltung der
ist nicht gerechtfertigt. Die Funktion OrdersTotal() gibt die Gesamtzahl der bereits im Terminal geöffneten Aufträge zurück. Dieser Wert umfasst sowohl Aufträge, die von anderen Handelsinstrumenten eröffnet wurden, als auch Aufträge, die nicht vom Expert Advisor, sondern von Ihnen persönlich manuell für dasselbe Instrument eröffnet wurden und die der Expert Advisor erteilt hat.
Wenn Sie nicht von Hand handeln wollen und nur mit dem Symbol handeln, auf das der EA geworfen wurde, dann funktioniert dieses Design. Sobald Sie aber mit den Händen handeln wollen und der EA nicht mit Ihren manuellen Trades interferiert oder Sie die Trades auch mit anderen Symbolen ausführen wollen, lässt Sie das Design wirklich im Stich. Sie sollten also besser für jede Auftragsart einen eigenen Auftragszähler schreiben. Hier ist ein Beispiel für einen solchen Zähler.
Schreiben Sie den Code neu und berücksichtigen Sie dabei die oben genannten Empfehlungen!!!
Entschuldigung, ich wusste nicht, dass Zeichenketten wie
ein Unterprogramm aufrufen.
Aber es ist immer noch besser, sie auf eine andere Art zu organisieren.
>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {
Sie brauchen dem Unterprogramm keinen symbolischen Namen eines Handelssymbols zu übergeben. Ihr Unterprogramm befindet sich im Expert Advisor und nicht in der mitgelieferten Bibliothek. Da die Variable sy auf der globalen Ebene des Expert Advisors deklariert ist, befindet sich diese Variable im Geltungsbereich solcher Unterprogramme. Außerdem übergeben Sie den zweiten Parameter an das Unterprogramm, aber wenn Sie das Unterprogramm selbst aufrufen, initialisieren Sie diesen Parameter mit einem Wert ( int op=-1) - das ist nicht nötig. Das Gleiche gilt für den nächsten Parameter.
Die Linie
>> if (op<0 || OrderType()==op) {
ist wieder unleserlich. Schauen Sie, wie es in meiner Theke organisiert ist!
Und dann ist da noch dies. Der Codeblock
wird bei jedem Ticken aufgerufen. Sie ist jedoch nicht bei jeder Zecke erforderlich. In einigen Fällen müssen Sie nur den Stopp-/Gewinnauftrag kennen. Dies sind die Fälle, in denen Sie Ihr Unterprogramm aufrufen müssen.
Hallo, können Sie bitte einen Alarm an den Indikator anhängen (grünes Kreuz über rotes Kreuz von oben nach unten - verkaufen, zurück - kaufen)?
Nun, jemand stellt wieder gestohlene Codes ins Forum. :))))))))
Ich bezweifle, dass sich jemand kostenlos durch dieses Sammelsurium von nummerierten Variablen wühlen möchte :)
Guten Tag, könnten Sie bitte dem Truthahn eine Warnung hinzufügen (die grüne kreuzt die rote von oben nach unten - verkaufen, zurück - kaufen)?
Wenn Sie das noch einmal tun, bin ich gezwungen, Sie aus dem Spiel zu verbannen.
Dies ist ein Verstoß gegen die Forenregeln.
Entschuldigung, ich wusste nicht, dass Zeichenketten wie
ein Unterprogramm aufrufen.
Aber es ist immer noch besser, sie auf eine andere Art zu organisieren.
>> double StopLossLastPos(string sy="", int op=-1, int mn=-1) {
Sie brauchen dem Unterprogramm keinen symbolischen Namen eines Handelssymbols zu übergeben. Ihr Unterprogramm befindet sich im Expert Advisor und nicht in der mitgelieferten Bibliothek. Da die Variable sy auf der globalen Ebene des Expert Advisors deklariert ist, befindet sich diese Variable im Geltungsbereich solcher Unterprogramme. Als Nächstes übergeben Sie einen zweiten Parameter an das Unterprogramm, aber wenn Sie das Unterprogramm selbst aufrufen, initialisieren Sie diesen Parameter mit einem Wert ( int op=-1) - das ist nicht nötig. Das Gleiche gilt für den nächsten Parameter.
Die Linie
>> if (op<0 || OrderType()==op) {
ist wieder unleserlich. Schauen Sie, wie es in meiner Theke organisiert ist!
Ich denke, der Funktionsaufruf kann einfach geschrieben werden
PrAskLim = StopLossLastPos(OP_SELL); in der Funktion selbst
double StopLossLastPos(int op=-1,) wie folgt?
Ich habe bereits gesagt, dass ich die Funktionen von dieser Website übernommen habe, ihre Arbeit wurde getestet, weil ich mich nicht traue, ihre Variablen durch lesbarere zu ersetzen, weil mir vielleicht die Erfahrung fehlt, was man ändern kann und was nicht; das birgt die Gefahr, dass ich etwas Falsches in einer funktionierenden Funktion ändere und man wieder in einem Haufen Code steckt,
aber ich habe das, was ich selbst hinzugefügt habe, so weit wie möglich korrigiert,
Ich habe es bereits selbst hinzugefügt, aber es hat meine Probleme mit Log 4107 nicht gelöst, und ich muss mich fragen, wie ich den Preis und die Stopps ändern kann, denn ich habe darin nichts grundlegend geändert.
Die zweite Frage ist, wie man einen Spread zu diesem Preis hinzufügen kann PrAskLim = StopLossLastPos(OP_SELL) ; (Spread =MarketInfo(sy, MODE_SPREAD); )
Hier ist die modifizierte Version des EA
Soll der Code veröffentlicht werden?
Sie müssen keine gestohlenen Sachen posten.
Sie brauchen nicht zu stehlen.
Und die Regeln dieser Ressource verbieten es nicht...
https://www.mql5.com/ru/code/8089
;)