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 habe meine DoubleRound-Funktion mit MODE_TICKVALUE (12,50) statt MODE_TICKSIZE (0,25) aufgerufen.
Ich habe das behoben, aber das hat die #130 nicht verschwinden lassen
Hier ist ein Protokoll des Fehlers mit der aktualisierten DoubleRound-Zeile:
zum Vergleich hier ein Protokoll, bei dem es funktioniert hat:
Auf jeden Fall scheint es jetzt öfter zu funktionieren, wir sind definitiv näher dran :)
Auf jeden Fall scheint es jetzt öfter zu funktionieren, wir sind definitiv näher dran :)
Ich kann nicht erkennen, warum die Änderung fehlgeschlagen ist... erhalten Sie ein neues Bid/Ask zwischen OrderSend und OrderModify?
Ich kann nur vorschlagen, dass Sie, wenn Sie einen Fehler 130 erhalten, alles neu ausdrucken, Bid, Ask (mit MarketInfo), OOP, StopLevel, SL, den Sie setzen wollen, etc. etc.
Ich habe meine Funktion DoubleRound mit MODE_TICKVALUE (12,50) anstelle von MODE_TICKSIZE (0,25) aufgerufen.
Der Stoploss-Fehler #130 tritt nicht mehr auf. Die letzten Schritte schienen das Problem endlich auf den Punkt gebracht zu haben.
Ich werde nachher noch einen weiteren Beitrag verfassen, in dem ich alle unternommenen Schritte zusammenfasse. So können andere im Forum, die mit dem Fehler #130 kämpfen, diesen Thread als Referenz verwenden.
Vielen Dank für eure laufende Hilfe :).
Shinobi
Vielen Dank für Ihre laufende Hilfe :).
Shinobi
Die wichtigste Technik zur Fehlerbekämpfung ist die exzessive Protokollierung. Geben Sie alles aus, was im Entferntesten mit dem Fehler in Verbindung stehen könnte. Wenn Sie eine Protokollierungsfunktion definieren, die Sie ein- und ausschalten können, können Sie den Code nach Behebung des Problems behalten.
Bei der Initialisierung Ihres Expertenberaters sollten Sie alle Informationen protokollieren, die MarketInfo Ihnen mitteilen kann: https://docs.mql4.com/constants/marketinfo
Überprüfen Sie auch immer die Rückgabewerte von Funktionen, z.B. bei OrderModify:
Bei ECN-Brokern müssen Sie separate Aufträge für Kauf/Verkauf und Stoploss/Takeprofit erteilen. Sie müssen also Ihren Code in zwei Aufträge aufteilen, etwa so:
Für Verkaufsaufträge müssen Sie OP_BUY durch OP_SELL ersetzen. Sie sollten auch die Rückgabewerte von OrderSelect und OrderModify überprüfen (siehe Allgemeine Tipps oben).
Einige Broker verlangen, dass Stoploss, Takeprofit und Slippage auf 4/5 Ziffern eingestellt werden. Sie können dies erreichen, indem Sie den folgenden Code in Ihre init()-Funktion einfügen (danke WHRoeder):
Dann müssen Sie stoploss, takeprofit und slippage mit pips2db1 multiplizieren, bevor Sie sie an den Broker senden
Eine weitere mögliche Ursache ist, dass sich die Marktkurse zwischen der Aktivierung des Expert Advisor (EA) und der Ausführung der EA OrderSend() oder OrderModify() geändert haben. Um dieses Problem zu vermeiden, gibt es zwei mögliche Lösungen:
Die erste ist die Verwendung von: RefreshRates() vor der Verwendung von vordefinierten Marktvariablen wie: Ask und Bid. (diese Variablen erhalten ihre Werte, wenn der Tick den EA aktiviert)
Die zweite Möglichkeit ist, vordefinierte Marktvariablen überhaupt nicht zu verwenden. Stattdessen können Sie die aktuellen Marktwerte mit MarketInfo() verwenden. Anstelle von Ask, Bid und Point verwenden Sie
Wenn Stoploss oder Takeprofit zu nahe am Einstiegskurs liegen, wird die Order abgelehnt. Um dieses Problem zu vermeiden, sollten Sie den aktuellen Spread zwischen Ask und Bid berücksichtigen. Auch hier gibt es zwei Lösungen:
Die erste besteht darin, den Spread zu berechnen und ihn zu Ihrem Stoploss/Takeprofit zu addieren/subtrahieren.
Die zweite Lösung besteht darin, den Spread implizit zu berücksichtigen, indem man Ask und Bid bei der Berechnung von Stoploss oder Takeprofit verwendet:
Makler haben ein bestimmtes Stop-Level. Wenn Ihr Stoploss unter diesem Niveau liegt, wird Ihr Auftrag abgelehnt. Sie können das Stop-Level mit MarketInfo(Symbol(), MODE_STOPLEVEL) überprüfen.
Um dies zu vermeiden, sollten Sie Ihren Stop Loss mit dem Stop Level des Brokers vergleichen und ihn gegebenenfalls anpassen:
Freeze Level ist ein ähnliches Konzept. Ihr Stoploss muss ebenfalls größer sein als das Freeze Level des Brokers. Sie können das Freeze Level mit MarketInfo(Symbol(), MODE_FREEZELEVEL) überprüfen.
Um dies zu vermeiden, sollten Sie Ihren Stoploss ebenfalls mit dem Freeze-Level des Brokers vergleichen:
Schließlich kann es sein, dass Ihr Stoploss oder Takeprofit abgelehnt wird, weil das Symbol nur Stoploss/Takeprofit unterstützt, die seiner Ticksize entsprechen. Die Ticksize ist der minimale Abstand, den der Preis des Symbols nach oben und unten gehen kann. Wenn z.B. der Preis 1000 beträgt und die Ticksize 0,25, dann kann der Preis nur um ein Vielfaches von 0,25 (0,25 * n, wobei n eine natürliche Zahl ist) steigen oder fallen. Der Kurs kann also um 0,25 auf 1000,25 steigen oder um 1,75 auf 998,25 sinken.
Um die Tick Size zu berücksichtigen, brauchen Sie eine Funktion, die Double-Werte auf einen bestimmten Schrittwert rundet (z. B. die nächsten 0,25). Hier ist eine solche Funktion:
Ein Aufruf von DoubleRound mit number = 1023.81234 und step = 0.25 würde z.B. 1023.75 zurückgeben. Ein Aufruf mit 1023,967834 würde 1024,00 zurückgeben.
Bevor Sie nun Stoploss oder Takeprofit senden, runden Sie es auf die Tickgröße des Symbols mit:
Hier ist ein vollständiges kleines Beispiel, das alle oben genannten Gegenmaßnahmen berücksichtigt:
Ich hoffe, das hilft, #130 loszuwerden. Wenn die Änderung Ihres Codes nicht funktioniert, verwenden Sie zunächst ein Minimalbeispiel, wie das obige. Und dann, wenn der Fehler verschwindet, übernehmen Sie das Geänderte in Ihren Code.
Viel Glück!
Shinobi
Mein Dank geht an Raptor, WHRoeder, SDC, BigAl, gjol und 35806, die mir geholfen haben, den Fehler zu beheben und diese Referenz zusammenzustellen.