Eine typische Ursache für "invalid price" (bei stop / stop limit orders) ist eine zu geringe Distanz zwischen angefordertem Kurs der Order und aktuellem Preis. Diese Mindest-Distanz ist brokerabhängig. Ich würde folgenden Wert überprüfen und mit der angeforderten Stop-Distanz abgleichen:
SymbolInfoDouble(_Symbol,SYMBOL_POINT)*(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL)
Heißt das nun, dass man keine Stops (egal ob stop loss / stop buy / stop sell) ausführen kann, die näher am aktuellen Kurs liegen? Selbstverständlich nicht - aber eben nicht als automatisch ausgeführte, bereits beim Broker hinterlegte Order, sondern indem man einen Auftrag zur Positions-Schließung (bei stop loss) bzw. Eröffnung (für stop buy/stop sell) erst sendet, wenn ein intern berechneter Stop-Kurs erreicht wird. Alternativ kann man auch zweigleisig fahren: einen Stop im erlaubten Mindest-Abstand an den Broker senden - quasi als garantierter Katastrophen-Stop (Stromausfall, keine Internetverbindung...), die tatsächliche Schließung aber vom EA schon vorher (=beim Erreichen des gewünschten SL) aktiv vom EA anfordern zu lassen, bevor der Kurs der bereits verbuchten Order erreicht wird.
Außerdem würde ich mir als erfahrener Programmierer überlegen, ob die Verwendung von CTrade tatsächlich Sinn macht. Die paar Parameter für OrderSend festzulegen ist ja wirklich eine Kleinigkeit, erlaubt aber volle Flexibilität und Transparenz und erspart manche Bug-Suche.
Eine typische Ursache für "invalid price" (bei stop / stop limit orders) ist eine zu geringe Distanz zwischen angefordertem Kurs der Order und aktuellem Preis. Diese Mindest-Distanz ist brokerabhängig. Ich würde folgenden Wert überprüfen und mit der angeforderten Stop-Distanz abgleichen:
Heißt das nun, dass man keine Stops (egal ob stop loss / stop buy / stop sell) ausführen kann, die näher am aktuellen Kurs liegen? Selbstverständlich nicht - aber eben nicht als automatisch ausgeführte, bereits beim Broker hinterlegte Order, sondern indem man einen Auftrag zur Positions-Schließung (bei stop loss) bzw. Eröffnung (für stop buy/stop sell) erst sendet, wenn ein intern berechneter Stop-Kurs erreicht wird. Alternativ kann man auch zweigleisig fahren: einen Stop im erlaubten Mindest-Abstand an den Broker senden - quasi als garantierter Katastrophen-Stop (Stromausfall, keine Internetverbindung...), die tatsächliche Schließung aber vom EA schon vorher (=beim Erreichen des gewünschten SL) aktiv vom EA anfordern zu lassen, bevor der Kurs der bereits verbuchten Order erreicht wird.
Außerdem würde ich mir als erfahrener Programmierer überlegen, ob die Verwendung von CTrade tatsächlich Sinn macht. Die paar Parameter für OrderSend festzulegen ist ja wirklich eine Kleinigkeit, erlaubt aber volle Flexibilität und Transparenz und erspart manche Bug-Suche.
Also das SYMBOL_TRADE_STOPS_LEVEL liegt bei 0.0. Habe auch schon mit verschieden großen Abständen zw. "price" und "limit_price" getestet.
Aber das Problem ist ja auch nicht der Stop, sondern das Limit. Anhand meines Beispiels will ich also beim Erreichen des Stops nicht um jeden Preis in den Markt, sondern max. zu meinem Limit-Preis. Nur daß halt "invalid price" kommt, sobald (bei einer Buy-Order) das Limit > Price ist (wobei ich davon ausgehe, daß bei diesen OrderTypen das Feld "price" gleichbedeutend mit Stop-Preis ist...!?).
Nun, da ich mich neu mit MQL5 beschäftige, gehe ich natürlich erstmal davon aus, daß die Bibliotheken und Funktionen korrekt sind. Schließlich ist der MT ja weit verbreitet. Sonst müsste man - bei mangelndem Vertrauen - als Softwareentwickler ja immer alles in Assembler programmieren ;-)
Aber danke für den Hinweis, daß dieses Tool ggf. fehlerbehafteter ist, als von mir vermutet!
MfG
Jürgen
siehe hier die unterschiedlichen order typen, ganz unten auch graphisch
https://www.metatrader5.com/de/terminal/help/trading/general_concept
- www.metatrader5.com
Nee, CTrade ist in dem Sinne nicht "fehlerbehaftet" - das ist schon ordentlich programmiert. Es erleichtert aber nicht gerade die Fehlersuche, wenn man ständig zwischen include-Datei und Hauptprogramm hin- und herspringen muss und die Frage ist, ob man für so etwas Elementares wie Orderausführung eine gesonderte Bibliothek braucht oder ob man in wenigen Zeilen halt das formuliert was man gerade haben will. Letztlich wohl eine Frage des persönlichen Geschmacks. Mir ist klar, dass sehr viele hier CTrade regelmäßig verwenden.
Wenn bei Deinem Broker bezogen auf das Symbol das Stoplevel tatsächlich bei 0.0 liegt, kannst Du meine erste Vermutung natürlich ignorieren.
@Chris70:
Dann bin ich erstmal beruhigt. Tatsächlich hatte ich beim Debuggen auch teilweise den Code der CTrade-Library mit einbezogen ;-)
@amando:
Danke für den Link! Diese Info ist tatsächlich insofern erleuchtend, daß das Verhalten so gewollt ist - welches somit allerdings für meine Zwecke nicht brauchbar ist.
Dann muß ich wohl versuchen, selbst irgendetwas zu "basteln"...
MfG
Jürgen
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo,
ich bin neu im Bereich MQL5, habe aber jahrelang Erfahrung im Bereich Softwareentwicklung - die letzten Jahre primär mit C#.
Derzeit programmiere ich privat an einem EA. Leider habe ich aktuell Probleme bei der Orderaufgabe via CTrade.OrderOpen(...) mit den o.g. Ordertypen.
Im Journal erscheinen folgende Meldungen:
failed buy stop limit 4.00 DE30 at 12481.70 (12484.40) sl: 12463.55 tp: 12496.95 [Invalid price]
CTrade::OrderSend: buy stop limit 4.00 DE30 at 12481.70 (12484.40) sl: 12463.55 tp: 12496.95 [invalid price]
Mit dieser Order möchte ich erreichen, daß nach dem Erreichen des Stops (hier bei 12481.70) ein Kauf zu max. 12484.40 erfolgt.
Wenn ich die Werte bei den Feldern "limit_price" (12484.40) und "price" (12481.70) vertausche, kommt zwar kein Fehler, aber das Verhalten ist nicht wie gewünscht.
Sprich: Wenn der Kurs den Wert aus "price" erreicht, wird aus der Buy-Stop-Limit-Order zwar eine Buy-Limit-Order, aber da der "limit_price" dann kleiner als der "price" ist, erfolgt kein Kauf.
Interpretiere ich diese Ordertypen falsch, oder wo könnte der Fehler liegen?
Besten Dank!
MfG
Jürgen