EA Selbst Programmieren (Fragen&Antworten 2 - OP_BUYSTOP/OP_BUYLIMIT statt OP_BUY)

Wenn bei Handelssignal in diesem Expert Advisor (EA) für MetaTrader 4 (MT4) anstelle einer Market- eine Pending-Order, also Stop- oder Limit-Order, ausgeführt werden soll, stoßen wir auf Fehlermeldungen. Herr Z., ein Lernender unserer Video-Serie EA Selbst Programmieren, fragt daher:

Sobald ich in folgender Zeile
LongOrder = OrderSend (Symbol(),OP_BUY,Lots,Ask,10,0,0,0,Magic,0,clrRed);
OP_BUY durch OP_BUYSTOP oder OP_BUYLIMIT ersetze, bekomme ich beim Ausführen den Fehler "OrderSend Error 130". Das gleiche gilt für OP_SELLSTOP und OP_SELLLIMIT. Ich habe sehr lange recherchiert, den Stop Loss stark erhöht, den Take Profit auch. Alles was ich zu diesem Fehler online fand, habe ich ausprobiert. Es hat nichts funktioniert. Es funktioniert nur mit OP_BUY und OP_SELL.

Die Fehlermeldung 130 bedeutet laut MQL4-Dokumentation "Invalid stops", also ungültige Stop-Kurse. Veränderungen bei Stop-Loss und Take-Profit vorzunehmen, ist daher intuitiv. In der Codezeile oben sind Stop-Loss und Take-Profit aber beide mit 0 vorgesehen. Der EA übermittelt also beim Senden der Order an den Tradeserver des Brokers gar kein SL oder TP. Daher kann die Fehlermeldung nicht von dieser Quelle her rühren. 

Woran kann es aber sonst liegen? Nun, wenn ein EA die Fehlermeldung 130 im MT4 auslöst, kann dies an ALLEN möglichen "Pending"-Kursen liegen:

  1. Stop-Loss bei Markt- und Pending-Orders,
  2. Take-Profit bei Markt- und Pending-Orders oder,
  3. und jetzt kommt's: am Stop- bzw. Limit-Kurs einer Pending-Order.

Also müssen wir den vierten Parameter der OrderSend-Funktion genau unter die Lupe nehmen. In der Code-Zeile oben des EA's wird als Orderpreis "Ask" an den Tradeserver übermittelt. Das ist bei OP_BUY, also einer Markt-Order Buy, richtig und verpflichtend. Analog muss bei OP_SELL "Bid" übermittelt werden.

Bei OP_BUYLIMIT und OP_BUYSTOP muss allerdings ein Pending-Kurs übermittelt werden, der vom aktuellen Ask abweicht. Logisch, denn wenn wir den Ask-Kurs als Ausführungskurs der Limit- oder Stop-Order wollten, würde es sich ja um eine Markt-Order anstelle einer Pending-Order handeln.

Bei der BuyLimit-Order muss ein Kurs niedriger als Ask, bei der BuyStop-Order ein Kurs höher als Ask übermittelt werden. Bei BuyStop muss zudem der Mindestabstand für Stops Ihres Brokers (das so genannte Stop Level) eingehalten werden.

Auf der Sell-Seite ist alles natürlich spiegelbildlich und bezieht sich auf Bid statt Ask: Bei OP_SELLLIMIT muss der Pending-Kurs höher als der Bid, bei der OP_SELLSTOP niedriger als der Bid abzüglich Stop Level vorgegeben werden.

Für obiges Code-Beispiel des EA's mFX-MAXing bräuchten wir also die in Fett dargestellten Veränderungen:

LongOrder = OrderSend (Symbol(),OP_BUYLIMIT,Lots,Ask-LimitAbstand,10,0,0,0,Magic,0,clrRed);

oder

LongOrder = OrderSend (Symbol(),OP_BUYSTOP,Lots,Ask+StopAbstand,10,0,0,0,Magic,0,clrRed);

Die Parameter LimitAbstand und StopAbstand müssen noch als 'double' Variable im EA-Code definiert werden. Wenn Sie sie später in den EA Eingaben ansteuern möchten, dann sollten Sie sie in den ersten Block der globalen Variablen einfügen, z.B. als 'extern double LimitAbstand=0.00100;'. Der LimitAbstand bzw. StopAbstand ist in dieser Programmiervariante nicht in Pips, Punkten oder Prozent einzugeben, sondern als Kursdifferenz.

Nun kann der mit Ihrem MT4 verbundene Tradeserver Ihren EA richtig verstehen.

Haben Sie weitere Fragen zu MQL4 und zur Programmierung von Expert Advisors für MetaTrader 4? Dann klicken Sie hier, um zur Frage-stellen-und-Antwort-bekommen-Seite zu gelangen.

Herzliche Grüße
Ihr EA-Programmierer Cristof Ensslin von mindful FX