Problem mit Orderarten ORDER_TYPE_BUY_STOP_LIMIT / ORDER_TYPE_SELL_STOP_LIMIT

 

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

 

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.

 
Chris70:

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

Grundlagen - Handelsoperationen - MetaTrader 5 Hilfe
Grundlagen - Handelsoperationen - MetaTrader 5 Hilfe
  • www.metatrader5.com
Bevor Sie beginnen die Trade-Funktionen der Plattform zu nutzen, müssen Sie ein klares Verständnis der standardmäßigen Begriffe Order, Deal und Position besitzen. ist die Anweisung an den Broker ein Finanzinstrument zu kaufen oder zu verkaufen. Es gibt zwei Haupt-Ordertypen: Markt und Pending. Zusätzlich gibt es Take Profit und Stop Loss...
 

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