«

»

Oct 27

MetaTrader Tool zum Senden einer Mail bei jedem Trade-Open und bei jedem Trade-Close

Nachdem sich schon das erste MetaTrader Tool für die Versendung einer Mail bei jedem Trade-Close großer Beliebtheit erfreut hat, liefere ich heute die vielfach gewünschte Erweiterung für das Versenden einer Mail bei jeder Trade-Eröffnung nach.

Ich habe für dieses Tool im MQL Quellcode einige interessante Erweiterungen vorgenommen, insbesondere das Arbeiten mit ENUM Datentypen ist eine sehr charmante Art der Programmierung. Der wesentliche Vorteil ist die fast zwangsläufige Vermeidung von Fehlern, wenn man auf diese Art und Weise programmiert.

Ich habe das Tool so erweitert, dass man ab sofort beim Start 3 Auswahlmöglichkeiten hat

  • Mails ausschließlich wenn ein Trade geschlossen wird
  • Mails ausschließlich wenn ein Trade eröffnet wird
  • Mails in allen Fällen, egal ob neuer Trade oder geschlossener Trade

Nachfolgend ein Screenshot wie ich diese Auswahlmöglichkeit über die externen Variablen dargestellt habe.
MetaTrader_mailSendVarianten

Als User kann man also ganz bequem eine der drei Möglichkeiten auswählen. Anders als die meisten Expert-Advisor die Sie sicherlich kennen, muss man nicht Zahlen eingeben um den einen oder anderen Modus auszuwählen, sondern als Nutzer dieses Expert-Advisors bekommt man die Varianten passend serviert ohne Fehler bei der Eingabe machen zu können.

Wie habe ich das im MQL-Code gelöst?

MetaTrader bietet ENUM Datentypen!

enum ENUM_MAIL_SEND_VARIANTE {onlyMailSendForClosedTrades, onlyMailSendForNewOpenedTrades, mailSendForTradeOpenAndTradeClose};
extern ENUM_MAIL_SEND_VARIANTE MailSendVariante = mailSendForTradeOpenAndTradeClose;

Ich habe den enum Datentyp verwendet und eine eigene enum Range definiert.
Meine enum lautet ENUM_MAIL_SEND_VARIANTE und hat drei verschiedene Varianten … um ganz genau zu sein legt enum integer Konstanten fest, die per Namen adressiert werden können.
onlyMailSendForClosedTrades und onlyMailSendForNewOpenedTrades und mailSendForTradeOpenAndTradeClose
In der zweiten Zeile definiere ich eine Variable MailSendVariante, der ich den Datentyp meiner enum zuweise und die ich auch noch extern mache, so dass Sie in den Expert-Advisor Eigenschaften erscheint und vom User einstellbar ist.

An einer späteren Stelle im Quellcode, erfolgt dann die Abfrage, welche Mails gesendet werden sollen. Das sieht im MQL Code wie folgt aus

void f_checkForMailSend()
{
   if (MailSendVariante == onlyMailSendForClosedTrades || MailSendVariante == mailSendForTradeOpenAndTradeClose)
      f_checkForMailsendForClosedTrades();

    if (MailSendVariante == onlyMailSendForNewOpenedTrades || MailSendVariante == mailSendForTradeOpenAndTradeClose)
      f_checkForMailsendForNewOpenedTrades();
}

… in dieser Funktion wird geprüft, welche Auswahl der User bei der Aktivierung des EAs getroffen hat und entsprechend wird gecheckt, welche Mails gesendet werden sollen, oder eben auch nicht.

Leider sehen wir immer wieder, dass enums umständlich und sehr fehleranfällig verwendet werden. Das passiert dadurch, dass oft der Wert der einzelnen Konstanten abgefragt wird. Dazu muss man wissen, dass jede einzelne Konstante die eine enum hat immer einen um eins erhöhten Wert bezogen auf die Vorgängervariante hat. Die erste Konstante hat immer die 0, die zweite die 1 usw …
Das ganz gilt aber nur so lange, wie man keine anderen Werte zuweist. Man könnte rein theoretisch auch so etwas definieren

enum ENUM_MAIL_SEND_VARIANTE {onlyMailSendForClosedTrades = 55, onlyMailSendForNewOpenedTrades, mailSendForTradeOpenAndTradeClose = 99};
extern ENUM_MAIL_SEND_VARIANTE MailSendVariante = mailSendForTradeOpenAndTradeClose;

… in dem Fall würden die enum Varianten folgende Werte annehmen
onlyMailSendForClosedTrades = 55
onlyMailSendForNewOpenedTrades (keine Angabe, also +1) = 56
mailSendForTradeOpenAndTradeClose = 99

… und dann könnte die Abfrage in f_checkForMailSend wie folgt aussehen…

void f_checkForMailSend()
{
   if (MailSendVariante == 55 || MailSendVariante == 99)
      f_checkForMailsendForClosedTrades();

    if (MailSendVariante == 56 || MailSendVariante == 99)
      f_checkForMailsendForNewOpenedTrades();
}

… mal abgesehen davon, dass dies alles andere als sich selbst erklärender Quellcode ist (siehe dazu den Blog-Eintrag zu den Grundlagen einer gut strukturierten Programmierung), ist dies auch noch sehr fehleranfällig.

Fragen Sie bei der Verwendung von enum also immer die definierten Konstanten ab, alles andere macht keinen Sinn, weil es sowieso keine anderen Varianten gibt!

Im Netzt finden Sie bei MetaQuotes noch die Dokumentation zu MQL-ENUM und bei Microsoft gibt es im Developer Network ebenfalls noch eine ganz brauchbare Beschreibung.

Einführung von Unterdateien in include Strukturen

Durch die Erweiterung dieses MetaTrader Tools sind im MQL-Quellcode diverse Funktionen dazu gekommen. Inzwischen sind wir somit bei einer Gesamtlänge von mehreren 100 Zeilen angekommen. Die Übersichtlichkeit geht somit langsam aber sicher verloren. Ich habe aus diesem Grund eine Auslagerung von diversen Funktionen in sogeannte includes vorgenommen.

In eine include habe ich Funktionen ausgelagert, die nur etwas mit dem Versenden von Mails bei der Trade-Eröffnung zu tun haben und in eine weitere include separate Funktionen für das Mailversenden beim Trade-Close.

Damit die includes allerdings nicht einfach im include Hauptordner liegen, wo sich irgendwann sehr viele includes ansammeln können, habe ich noch einen Unterorder angelegt. In der Orderstruktur sieht das dann wie folgt aus

MQL_Unterordner

Wenn Sie include Dateien angelegt haben und Funktionen ausgelagert sind, dann müssen Sie am Ende natürlich noch im Quellcode der Hauptdatei die notwendigen include Dateien aufrufen. Das sieht dann wie folgt aus

#include <code4Trading_MailSend/_sendMailClosedTrades.mqh>
#include <code4Trading_MailSend/_sendMailNewTrades.mqh>

… der Aufruf definiert: includiere an dieser Stelle den gesamten MQL-Code aus der Datei xxx

ACHTUNG: ganz wichtig ist dabei: an dieser Stelle.

Wenn Sie am Ende den Quellcode kompilieren, erfolgt dies in chronologischer Abfolge von der ersten zur letzten Zeile. An jeder #include Zeile ersetzt der Kompilierer das #include durch den sich dahinter verbergenden Quellcode. Wenn Sie eine include-Datei einzeln kompilieren, wird es unvermeidbar vorkommen, dass Sie viele Fehlermeldungen erhalten, weil zum Beispiel nicht alle Variablen in einer include bekannt sind oder Funktionsaufrufe von unbekannten Funktionen getätigt werden (also zum Beispiel von Funktionen, die erst  in einer später includierten Datei aufgerufen werden … gibt halt genau an dieser Stelle einen Fehler, weil die Funktion ja jetzt noch nicht bekannt ist).
Achten Sie immer darauf, beim Kompilieren in MetaTrader mit Strg+F7 zu kompilieren!

Dieses Art und Weise der Kompilierung sorgt dafür, dass nicht nur der gerade aktive Quellcode-Part einer include kompiliert wird, sondern der Compiler verwendet alle offenen Dateien und kompiliert sie gleichzeitig. Der Compiler findet bei dieser Art der Kompilierung alle notwendigen Code-Bestandteile und setzt den zu kompilierenden Code korrekt zusammen!

MT_Kompilierung
In älteren MetaTrader Versionen ging das noch nicht, dort musste man mühsehlig immer schön drauf achten, den Quellcode auch bei 5 oder 10 oder gar noch mehr includes in der korrekten Reihenfolge aufzubauen … sehr anstrengend.


… auf die Überwachung der Trades, und das Erkennen von Veränderungen gehe ich an dieser Stelle nicht weiter ein. Die Logik für die Erkennung von Trades die gerade geschlossen wurden hat sich nicht verändert und die Logik für die Erkennung von Trades die gerade geöffnet wurden ist sehr ähnlich. Ich denke, wer sich mit dem Quellcode vom ersten Tool beschäftigt hat und die Logik verstanden hat, der kommt auch mit der Erweiterung klar. Und falls nicht gerne bei uns melden, wir helfen weiter.


Zum Abschluss der gesamte MQL-Quellcode und auch die sofort verwendbare ex4-Datei hier kostenlos zum Download für alle registrierten Nutzer und natürlich wie immer für jegliche private Nutzung frei verfügbar. Wer noch keinen User hat, einfach einen eigenen USER-Registrieren, valide Mail-Adresse eingeben und schon steht sämtlicher Quellcode aller Blog-Einträge zum Download zur Verfügung.
Wir übernehmen wie immer keine Garantie für die korrekte Funktionsweise dieses Tools bei allen MetaTrader Brokern die es auf der Welt gibt. Bitte auch dieses MetaTrader Tool wie immer bei Ihrem Broker testen und bei Fragen gerne melden.

Download MetaTrader Tool zum Senden von Mails bei Trade-Eröffnung und Trade-Close

Viel Erfolg beim selber ausprobieren
Thomas @ ForexInnovation



5 comments

Skip to comment form

  1. Torsten

    Wunderbar, dass es so schnell ging mit der Weiterentwicklung! Vielen Dank!
    Werde testen und berichten.

    Schönen Sonntag!

  2. Mattteo

    Hallo Thomas.

    in welchen Order sollen die Dateien kopiert werden?
    Sorry für meine Frage aber ich beginne gerade mich mit diesen Themen zur beschäftigen…. 🙂

    Gruß
    Mattteo

    1. Thomas Rosenkranz

      Hallo Mattteo,

      ich habe mal einen Beitrag angelegt, in dem ich das Thema Ordnerstruktur und auch den sehr nützlichen Portable-Modus ausführlich erkläre.
      http://www.code4trading.com/mt4-basiswissen/ordnerstruktur-in-metatrader-und-einrichtung-des-portable-modus/

      Viele Grüße
      Thomas

  3. Martin Bill

    Hallo

    Ich würde gerne das Tool zum Senden einer Mail bei jedem Trade-Open und bei jedem Trade-Close verwenden aufgrund der Trades die ein Expert Advisor öffnet und schließt. Mit den Emails würde ich dann benachrichtigt was gerade läuft und ich wüsste, wenn ich allenfalls eingreifen müsste.
    Eignet sich dieses Tool für diese Verwendung?

    Viele Grüsse
    Martin

    1. Thomas Rosenkranz

      Hi Martin,

      naja, wenn ich es nicht total vermasselt habe, dann wird das Tool genau das tun. Steht so im Header, steht so in der Beschreibung, steht so im Quellcode … ich würde also ein Wette annehmen, dass das Tool auch tatsächlich genau das tut und nicht doch den Bitcoin handelt …

      Viel Spaß damit
      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>

*