![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
Der beste Weg, um den Stoploss richtig zu setzen, ist, sich den Spread genau zu überlegen. Der Spread ist der Abstand zwischen dem Ask und dem Bid. Wenn Sie also einen Stoploss zu einem Kaufauftrag mit Bid - SL hinzufügen, wird der Spread automatisch mit einbezogen und Sie brauchen ihn nicht zu kodieren und können den Spread effektiv völlig ignorieren. Die Verwendung von Ask + SL für einen Verkaufsauftrag hat denselben Effekt. Aber VORSICHT --- in Zeiten geringen Handelsvolumens vergrößert sich der Spread und es kann gut sein, dass Sie einen SL haben, der weit von dem Platz entfernt ist, den Sie erwarten --- deshalb sollten Sie vielleicht einen Code hinzufügen, der verhindert, dass der SL oberhalb einer bestimmten Spread-Größe hinzugefügt wird.
Nachdem die Frage des Spreads geklärt ist, liegt die nächste Hauptursache für Fehler 130 darin, dass sich die Preise geändert haben, während Ihr EA noch ausgeführt wird. Dies kann durch einen EA verursacht werden, der sehr lange für die Ausführung braucht, oder der Server ist sehr beschäftigt mit der Bearbeitung von Geschäften, was die Ausführung Ihres EAs verzögert. Das Ergebnis ist, dass ein Tick Ihren EA dazu veranlasst hat, mit der Ausführung zu beginnen, aber ein anderer Tick kam, bevor die Ausführung beendet war, und die Preise sind nun ungültig.
In jedem Fall müssen Sie die Kurse mit RefreshRates aktualisieren: while (RefrshRates() == 1) Sleep(5); ------ oder was immer Sie als Wartezeit festlegen.
In jedem Fall müssen Sie die Preise mit Hilfe von RefreshRates aktualisieren: while (RefrshRates() == 1) Sleep(5); ------ oder was immer Sie als Wartezeit angeben möchten.
AFAIK RefreshRates() hat nichts mit dem Fehler 130 zu tun.
Ich stimme RaptorUK zu, dass die Verwendung von MODE_ASK etc. die Notwendigkeit von RefreshRates() beseitigen würde, aber ich nahm an, dass wie in Shinobis Codebeispiel ....
Ich sende eine Bestellung mit zum Beispiel:
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
die vordefinierte Variable ASK verwendet wird und sich daher sowohl der Ask/Bid- als auch der Spread-Wert geändert haben könnten, was den Fehler 130 verursacht. In einem solchen Fall könnte RefreshRates() unmittelbar vor dem OrderSend verwendet werden
Punkt genommen RaptorUK und ich stimme zu, dass die Verwendung von MODE_ASK usw. die Notwendigkeit für RefreshRates() beseitigen würde, aber ich nahm an, dass wie in Shinobis Codebeispiel ....
Ich sende eine Bestellung mit zum Beispiel:
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
die vordefinierte Variable ASK verwendet wird und sich daher sowohl der Ask/Bid- als auch der Spread-Wert geändert haben könnten, was zu dem Fehler 130 führt. In einem solchen Fall könnte RefreshRates() unmittelbar vor dem OrderSend verwendet werden
Ich bin im Moment etwas beschäftigt, aber sobald ich die Chance habe, werde ich alle eure Vorschläge ausprobieren und dann einen zusammenfassenden Beitrag für alle schreiben, die mit dem gleichen Problem über diesen Thread stolpern könnten.
Danke und pass auf dich auf!
shinobi
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
sagt nicht alles aus. Wie berechnen Sie initial_stop - mit Bid?
Wie berechnen Sie den SLIPPAGE - unter Berücksichtigung von 4/5-stelligen Brokern?
Ich musste für eine Weile eine Pause einlegen (Umzug in eine neue Stadt, neuer Job).
Aber jetzt möchte ich an diesen Thread anknüpfen und endlich eine Lösung für diesen verfluchten #130 Stoploss-Fehler finden.
Ich bin dankbar für alle Ihre Ratschläge und habe versucht, sie alle umzusetzen:
1: Spread.
2: Changing Market Rates
3: 4-5 Digits-Broker
Ich habe also alle Vorschläge berücksichtigt, aber der Fehler besteht immer noch. Soweit ich das beurteilen kann, tritt er genauso oft auf wie vorher, also muss es eine andere Ursache dafür geben.
Hier ist ein aktuelles Protokoll:
tickvalue: 12.50000000
pos size: 37.00000000
Ask/Bid 1262.00000000/1261.75000000
stoploss:12.59610000
position_size: 37
Spread 0.25000000
Error could not take long position. Fehler ist: #130 invalid stops
Die obige OrderSend-Codezeile wurde mit den protokollierten Werten verwendet, um zu versuchen, eine Long-Position einzugehen.
Haben Sie weitere Ideen, was die Ursache sein könnte?
Danke!
shinobi
Ist dies ein ECN Broker?
Bei ECN-Brokern müssen Sie eröffnen und DANN Stops setzen.
Um die mögliche Ursache einer ungültigen Anzahl von Ziffern auszuschließen, habe ich den Stoploss gemäß WHRoeders Code gerundet:
Machen Sie einfach
extern double StopLoss = 50;
extern double TakeProfit = 50;
dann für Käufe:
double SL=Bid - StopLoss*Point;
double TP=Gebot + TakeProfit*Punkt;
int Ticket=OrderSend(Symbol(),0,1,Ask,2,SL,TP,"",12345);
if( Ticket<0) print("error="GetLastError());
for sells:
double SL=Ask + StopLoss*Point;
double TP=Ask - TakeProfit*Punkt;
int Ticket=OrderSend(Symbol(),1,1,Bid,2,SL,TP,"",12345);
if( Ticket<0) print("error="GetLastError());
dann die Log-Datei posten, wenn es nicht funktioniert.
SDC:
Ich habe Ihren Code wie folgt ausprobiert:
Der einzige Unterschied ist, dass ich Point, Ask und Bid durch MarketInfo ersetzt habe, um das von Raptor und BigAI erwähnte RefreshRates Problem zu vermeiden.
Das Problem bleibt bei diesem einfachen Beispiel bestehen. Ich erhalte immer noch
#ESZ1,M5: Eröffnungsposition
#ESZ1,M5: Tickwert: 12.50000000
#ESZ1,M5: Größe der Position: 1.00000000
#ESZ1,M5: Ask/Bid 1244.50000000/1244.25000000
#ESZ1,M5: Spanne 0,25000000
#ESZ1,M5: SL: 1244.00000000
#ESZ1,M5: TP: 1245.00000000
#ESZ1,M5: Fehler=130
Raptor:
Ich verwende derzeit UWC-Trader mit einem Demokonto zum Testen.
Wie bereits erwähnt handle ich mit Futures. Z.B. ESZ1 und FDXZ1.
WHRoeder:
Sorry, ich runde auch nicht. Ersetze "runden" durch "anpassen für 4/5-stellige Broker". D.h. ich habe gerade deinen Code angewendet.
Ich habe auch den OrderSend so gepostet, wie ich ihn in meiner vorherigen Antwort verwende. Und die Werte aller beteiligten Variablen. Ich bin mir nicht sicher, welcher andere Teil des Codes interessant sein könnte.
Wie das von SDC vorgeschlagene Minibeispiel gezeigt hat, kann der Fehler auf diesen einfachen Code zurückgeführt werden. Es muss also etwas Grundsätzlicheres sein.
Ich handele nicht mit Metallen, also sollte die Rundung nicht wichtig sein.
Ich werde es als nächstes versuchen:
Eröffnung (kein Stoploss) und spätere Modifizierung (Stoploss setzen).
Nochmals vielen Dank für Ihre Gedanken,
Shinobi