«

»

Sep 24

Korrekte Rundung von Stoploss und Takeprofit

EURUSDspreadDie ersten Schritte in der Entwicklung sind schwer und es gibt unglaublich viel zu beachten. Ein ganz wesentlicher Punkt der leider immer wieder falsch gemacht wird und teilweise zu gravierenden Fehlern führt, ist das Thema Rundung! da wir bei ForexInnovation recht viele Anfragen von Kunden und Entwicklern aus diesem Bereich bekommen, wollen wir in diesem Beitrag etwas genauer darauf eingehen.

Grundsätzlich: bei jedem OrderSend(…) und bei jedem OrderModify(…) müssen Sie die Preisangaben korrekt runden!

Sowohl der Eröffnungspreis, als auch alle Angaben für Stoploss und Takeprofit müssen auf die korrekte Anzahl von Kommastellen, welche der Broker vorgibt, gerundet sein.

Wir sehen oft Code, der etwa wie folgt aussieht

double newTP = openPrice + Takeprofit*_Point;
double newSL = openPrice - Stoploss*_Point;

Diese Art der Berechnung von SL und TP kann funktionieren, sie kann aber auch zu großen Problemen führen.

Wie funktioniert es richtig?

Jeder MT4 Broker gibt über die sogenanten MarketInfo ganz genaue Vorgaben wie ein Symbol getradet werden darf.

Also zum Beispiel das minimale Volumen, welches akzeptiert wird MarketInfo(Symbol(), MODE_MINLOT)

oder der Mindestabstand des SLs / TPs der übermittelt werden soll im Vergleich zum aktuellen Marktpreis MarketInfo(Symbol(), MODE_STOPLEVEL)

für die korrekte Rundung des SLs ist der Wert MODE_DIGITS entscheidend, also MarketInfo(Symbol(), MODE_DIGITS). Er gibt an, auf wie viele Kommastellen das gewählte Symbol getaxt wird. Alle Werte die an den MetaTrader Broker gesendet werden, müssen also auf diese Anzahl von Kommastellen gerundet sein (seit dem Update auf Build 600, also der Einführung nahezu der gesamten MQL5 Umgebung in MQL4 kann man diesen Wert für das aktuelle Symbol auch einfach über _Digits abfragen)

Korrekt ist es also, die Zeilen

double newTP = openPrice + Takeprofit*_Point;
double newSL = openPrice - Stoploss*_Point;

zu ändern in

double newTP = NormalizeDouble(openPrice + Takeprofit*_Point, _Digits);
double newSL = NormalizeDouble(openPrice - Stoploss*_Point, _Digits);

und selbst die Zeile

double openPrice = MarketInfo(Symbol(), MODE_ASK);

sollten Sie in diesem Fall ändern auf

double openPrice = NormalizeDouble(MarketInfo(Symbol(), MODE_ASK), _Digits);

denn schon alleine bei der Übergabe auf eine nicht initialisierte Variable kann es vorkommen, dass auf der “27.” Kommastelle eine 1 angehangen wird und der Broker diesen Wert nicht mehr akzeptiert.

Nachfolgend finden Sie einen ganz simplen MetaTrader4 EA, welcher die korrekte Rundung zeigt. Außerdem können Sie über die Variable simulateOrderModifyError einen Error forcieren, indem an den SL und TP jeweils noch ein minimaler Kleinstwert in Höhe von tp_and_sl_priceAddOn addiert /subtrahiert wird. Da viele MetaTrader Broker sich dieser Problematik bewußt sind, schneiden inzwischen viele Broker einfach alle Kommastellen hinter _Digits ab … aber eine Garantie, dass dies Ihr MT4 Broker ebenfalls tut und auch in Zukunft tun wird, gibt es nicht.

Für eine fehlerfreie Programmierung, die Ihnen auch in Zukunft überflüssige Wartungsarbeit spart, sollten Sie also ab sofort immer schön auf die vom Broker definierte Anzahl Kommastellen (_Digits) runden!

Download MQL Source-Code Korrekte Rundung

Wer es noch genauer wissen möchte und genau verstehen will, warum die Addition von zwei double, single oder float Werten nicht automatisch eine neu Zahl mit gleicher Anzahl Kommastellen ergibt, der kann gerne unter folgenden Links weiter lesen.

hier ein paar Basics rund um die zu Grunde liegende Normung des Handlings von Gleitkommazahlen http://de.wikipedia.org/wiki/IEEE_754

hier ein toller Beitrag aus einem sehr guten C# Forum http://www.mycsharp.de/wbb2/thread.php?threadid=98035

und noch ein weiterer Beitrag mit einigen praktischen Beispielen zum nachbauen und selber testen

http://www.mycsharp.de/wbb2/thread.php?threadid=64462

 

Wir hoffen wir konnten ein wenig helfen.

Viel Spaß und viel Erfolg beim selber ausprobieren
Thomas @ ForexInnovation

[email_link]



2 comments

  1. Sebastian

    Hi ForexInnovation,

    coole Sache die Ihr da startet! Endlich mal ein paar fachlich wertvolle Infos von echten Profis und nicht nur Halbwissen, welches sich in diversen Foren im Lauf der Jahre so sammelt und wo am Ende keiner mehr weiß, was denn nun wirklich richtig ist und was nicht.

    Bin gespannt auf die weiteren Themen, denn ich bin gerade selber dabei mich mit der Programmierung näher auseinander zu setzen … aber ehrlich gesagt, ein ganz schön kompliziertes Thema.

    Und noch eine Frage am Rande: geht Ihr auch auf die Einbindung von externen DLLs, also das Erstellen und das Einbinden von DLLs ein? und außerdem: werdet Ihr Euch auch mit Trading-Ansätzen beschäftigen?

    Viele Grüße aus dem schönen Maintal
    Sebastian

    1. Thomas Rosenkranz

      Hallo Sebastian,

      schön, dass es Dir gefällt, was wir hier starten! Wir hoffen wir können ein wenig Wissen vermitteln und vielleicht die eine oder andere Frage auf direktem Weg beantworten. Wir wissen wie frustrierend es sein kann, ein offensichtlich banales Problem zu lösen, wenn man doch nicht weiß, wer einem die Lösung verrät …

      Zu Deinen Fragen
      externe DLLs: werden wir sicherlich auch mit aufnehmen, aber erstmal bleiben wir eine Weile im MQL Bereich. Wenn uns hier “langweilig” wird und wir nicht mehr wissen, was wir noch an Wissen rüberbringen sollen, dann wenden wir uns auch mal ein paar spezielleren Themen zu. DLL Programmierung / Anbindung MT4 an R(!) oder andere Statistik Programme / Pipes usw.

      Trading-Ansätze: vielleicht ein wenig. aber die Grundlage für jedes stabil funktionierende Handelssystem ist: eine saubere Programmierung. von daher werden wir uns dieses Thema wahrscheinlich doch recht lange aufheben … aber unverhofft kommt oft, vielleicht ändert sich das auch in den nächsten Wochen und Monaten … wir fangen ja gerade erst an.

      In diesem Sinne, schöne Zeit in unserem Blog und gerne weiter empfehlen!
      Thomas

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*