«

»

Nov 04

MetaTrader Tool zur Darstellung geschlossener Trades im Chart

MetaTrader_Tool_Trades_in_chart_01In den letzten Wochen habe ich mich zwei mal mit der Auswertung der historischen Trades beschäftigt. Dabei sind zwei sehr nützliche Tools heraus gekommen.
MetaTrader Tool 1: Darstellung der Performance sortiert nach MagicNummer
MetaTrader Tool 2: Darstellung der Performance für einzelne Währungspaare durch Buttons im Chart

Heute möchte ich noch einen Schritt weiter gehen und eine Möglichkeit vorstellen, die von viele MetaTrader Usern schon seit Jahren schmerzlich vermisst wird:

Die visuelle Darstellung geschlossener Trades im MetaTrader-Chart!

Jeder der schon einmal mit MetaTrader gearbeitet hat kennt das Problem. Man tradet so vor sich hin, parallel dazu arbeiten vielleicht noch ein paar Expert-Advisor und das eine oder andere Skript … Irgendwann möchte man die Trades, die man so in MetaTrader abgearbeitet hat nochmal Revue passieren lassen und dann kommt die böse Überraschung. Wie soll man das anstellen? Soll man die Trades der letzten Tage / Wochen / Monate selber in den Chart zeichnen???

Wohl nicht, die Arbeit ist extrem mühselig und nur etwas für jemanden, der sonst nicht gar so viel zu tun hat … das Metaquotes bis heute selber nicht in der Lage war hier ein vernünftiges Update für MetaTrader herauszubringen ist mir ein Rätsel.
… aber dafür gibt es ja den code4trading Blog …
Im folgenden werde ich also ein MetaTrader Tool vorstellen, dass in der Lage ist, die geschlossenen Trades per Linie und mit zusätzlichem Infolabel in den Chart zu zeichnen!


Step 1: Verteilung der Aufgaben in der OnInit()

Das Programm läuft nur einmal, deshalb brauchen wir die Start-Funktion von MetaTrader nicht. Sobald das Programm auf den Chart gezogen wird und aktiviert ist, läuft die OnInit() ab, aus der heraus alles gesteuert wird.
Es erfolgt eine Aufruf der Kommentierfunktion f_showSomeInfosOnTheChart() mit dem Überlauf firstComments, der Aufruf alle Trades zu durchlaufen f_loopAllClosedTrades() (und natürlich ggf zu painten) und später nochmal der Aufruf der Kommentierfunktion mit dem Überlauf lastComments. Warum ich diese Trennung vorgenommen habe, erläutere ich weiter unten.

#define firstComments 1
#define lastComments 2

void OnInit()
{
   f_showSomeInfosOnTheChart(firstComments);

   f_loopAllClosedTrades();

   f_showSomeInfosOnTheChart(lastComments);
}

Wie schon im Artikel zu den Grundlagen einer gut strukturierten Programmierung geschrieben, bitte KEINE “wilden” Berechnungen und Verzweigungen in der start() oder init() Funktion. In dieser Funktion wird lediglich koordiniert und verteilt.

Step 2: Durchlaufen aller geschlossenen Trades und Herausfiltern der relevanten Trades

void f_loopAllClosedTrades()
{
   string fName = StringConcatenate("void f_loopAllClosedTrades()");
   // ------------------------------------------------------------------------------------------------

   for (int thisClosedTradeByIndex = 0; thisClosedTradeByIndex < OrdersHistoryTotal(); thisClosedTradeByIndex++)
   {
      if (!f_selectThisTrade(thisClosedTradeByIndex, fName, SELECT_BY_POS, MODE_HISTORY))
         continue;

      if (OrderType() != OP_BUY && OrderType() != OP_SELL)
         continue;

      if (OrderSymbol() != Symbol())
         continue;

      if (!f_checkTheProfitDisplayModus())
         continue;

      if(!f_checkForStartBarIsInChartAvailable())
         continue;

      f_paintThisTradeInTheChart();
   }
}

WICHTIG: MetaTrader kann natürlich nur die Trades darstellen, die auch zum aktuellen Chart-Symbol gehören, auf dem das Tool aktiviert ist! Es muss also unbedingt der Filter

if (OrderSymbol() != Symbol())
   continue

eingebaut werden!
Der besagt so viel wie: wenn das aktuelle Symbol des ausgewählten Trades (zum Beispiel EUR/USD) nicht dem Symbol des aktiven Charts auf dem das MetaTrader Tool läuft (zum Beispiel GBP/USD) entspricht, dann ignoriere diesen Trade und mache ein continue. Continue springt dann zurück auf die nächstgelegene for oder while oder do-while Schleife. Die MQL Dokumenation sagt zu continue folgendes aus
The continue operator passes control to the beginning of the nearest outward loop while, do-while or for operator, the next iteration being called. The purpose of this operator is opposite to that of break operator.

Wenn die Symbole also nicht übereinstimmen, dann ignorieren wir diesen Trade.
Nur zur Vollständigkeit: man kann natürlich auch alle Trades in einen Chart darstellen. Am Ende sind es ja nur Zahlen die einfach unterschiedlich groß sind. Aber es ist einfach unmöglich im EUR/USD Chart bei einem Level von 1.3550 oder 1.2550 einen USD/JPY Trade von beispielsweise 105.70 zu finden. So weit kann man aus dem Chart einfach nicht rausscrollen… es macht also durchaus Sinn, nur die Trades aus der Historie in den Chart zu zeichnen, die auch dem aktuellen Chart-Symbol entsprechen.

Bei zu vielen Trades fand ich die Darstellung recht unübersichtlich, weshalb ich noch eine weitere Filtermöglichkeit implementiert habe. Es gibt über die Variable TradesToBeDisplayed die Möglichkeit nur Winner oder nur Looser Trades zu zeichnen. Standardmäßig habe ich es auf showAllClosedTrades, also alle Trades gestellt. Aber wenn Sie das Tool auf dem Chart aktivieren, können Sie es wie gewünscht verändern. Wer sich mit ENUMs nicht so auskennt, der kann im Blog-Eintrag mit ausführlicher ENUM-Erläuterung nochmal nachlesen.

enum ENUM_TradesToBeDisplayed {showAllClosedTrades, onlyShowWinnerTrades, onlyShowLooserTrades};
extern ENUM_TradesToBeDisplayed TradesToBeDisplayed = showAllClosedTrades;

Die komplette Darstellung der Funktion zur Ausfilterung ungewünschter Trades lasse ich an dieser Stelle weg. Wer sich den MQL-Quellcode runter lädt kann sich diese Funktion in Ruhe anschauen.

Interessant ist der letzte Filter, den ich über die Funktion f_checkForStartBarIsInChartAvailable() aufrufe.
Dieser Filter hat folgenden Zweck: Leider ist MetaTrader nicht in der Lage sich alleine eine vernünftige Historie zu laden. Wenn Sie also ein paar Wochen nicht traden und dann MetaTrader wieder anmachen, dann werden Sie “herrliche” Lücken in den Daten vorfinden. Diese können Sie dann zwar durch den Download der “MetaTrader Universal-Daten” auffüllen, aber das entspricht in der Regel nicht dem, was Ihr Broker geliefert hat. Bei Indizes gibt es diese Möglichkeit außerdem nicht, dort ist der Datenimport wesentlich komplizierter.
Ich habe also in das Tool einen Filter eingebaut, der Trades zu denen das Tool keine Daten im Chart findet einfach nicht zeichnet. Würde man diesen Filter nicht einbauen, würde das Tool diese Trades auf den letzten Datenpunkt vor dem GAP legen. Das würde dann wie folgt aussehen

MetaTrader_Tool_Trades_in_chart_03

… das ist nicht so wirklich schön.

Bevor wir uns in MetaTrader eine solche Anhäufung von wertlosen Informationen auf den Chart zaubern, blenden wir diese Trades doch lieber aus und erzeugen stattdessen lieber eine Anzeige auf dem Chart, in dem diese Trades alle schön sauber aufgelistet sind. Dann weiß man sofort welche Trades nicht darstellt wurden und kann bei Bedarf die Daten nachladen.

MetaTrader_Tool_Trades_in_chart_02

Die Variante die ich bevorzugen sieht dann also so aus.

… jeder einzelne Trade der nicht gezeichnet werden kann, weil MetaTrader keine Daten vorrätig hat, wird sauber aufgelistet. Außerdem findet noch eine Zählung der gezeichneten und der nicht gezeichneten Trades statt.

Deshalb findet im übrigen auch die Trennung in der Kommentierung statt. Zu Beginn werden die ersten drei Zeilen kommentiert. Danach erfolgt bei jedem Trade der nicht gezeichnet werden kann eine einzelen Kommentierung und ganz zum Schluss erfolgt noch einmal die Ausgabe der Anzahl der Trades. Dafür brauche ich dann die letzte Kommentierung.

Ich habe profitable Trades mit grüner Liniefarbe versehen und Verlierer Trades mit roter Liniefarbe. Das kann man bei Bedarf im Quellcode selber ändern, oder einfach auf eine externe Variable legen und schon kann man es bei der Aktivierung des Expert-Advisors selber einstellen.

Die Strichstärke für die Linien habe ich auf 2 gestellt. Diese Variable ist bereits über die externen Variablen einstellbar.

Die Label, die immer die folgenden Informationen enthalten “Richtung | Volumen | Profit-Loss” haben eine einstellbare Schriftfarbe. Außerdem kann man die Label ausblenden. Um ganz genau zu sein, es sind keine Label, sondern Textboxen, aber auch das kann man sich im Quellcode in Ruhe anschauen.

Was man an dem Tool aus meiner Sicht noch verbessern könnte: die Platzierung der Label. Wenn man viele Trades auf einem “Haufen” hat, dann überlappen sich die Label sehr schnell, so dass Sie wertlos sind, weil man nichts mehr erkennt. Man müsste also eine Abfrage entwerfen, die eine Anhäufung von Labeln erkennt und entsprechend entzerrt. Außerdem könnte man Trades die in Teilverkäufen geschlossen wurde gesondert darstellen, zum Beispiel mit einer gestrichelten Linie. Aktuell sieht es so aus, als ob mehrer Trades an der selber Stelle eröffnet wurden … aber so ist das mit allen Tools, man kann immer noch etwas verbessern …

 

Last but not least ein Hinweis zu den Trendlinien die ich verwendet habe. Es gibt in MetaTrader die Möglichkeit festzulegen, ob eine Trendlinie links und/oder rechts verlängert wird / oder eben nicht.
Dafür muss man ObjectSetInteger und den ENUM OBJPROP_RAY_LEFT / OBJPROP_RAY_RIGHT verwenden. Setzt man beide auf false, dann geht die Trendlinie nur vom Eröffnungspunkt bis zum Endpunkt. Nachfolend ein Auszug aus der Funktion in der ich die Linie erstelle. Die letzten beiden Zeilen adjustieren die Trendlinie zu einer vernünftigen, begrenzten Linie. Das war in früheren MetaTrader Versionen nicht möglich!

   ...
   string lineName = StringConcatenate("TRADE_LINE_TICKET#",IntegerToString(OrderTicket()));
   if (!ObjectCreate(ChartID(), lineName, OBJ_TREND, 0, OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice()))
   {
      f_PrintMeTheErrorThatHasOccured(GetLastError(), fName);
      return;
   }
   else
      tradesPaintedInChart++;

   ObjectSetInteger(ChartID(), lineName, OBJPROP_RAY_LEFT, false);
   ObjectSetInteger(ChartID(), lineName, OBJPROP_RAY_RIGHT, false);
   ...

… weil es so schön ist seine geschlossenen Trades noch einmal vernünftig zu betrachten, nachfolgend noch ein weiterer exemplarischer Screenshot dieses Expert-Advisors mit ein paar GBP/CHF Trades (und auch einem Short-Trade der mit Teilverkäufen beendet wurde). In Summe fast nur Winner-Trades 🙂

MetaTrader_Tool_Trades_in_chart_04


Und für alle MQL-Programmierer und MetaTrader Programmierer, die noch ein wenig mehr wissen möchten zum Quellcode gibt es nachfolgend den Code-Review in unserem YouTube Kanal.


Zum Schluss 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 zur Darstellung geschlossener Trades im Chart

Viel Erfolg beim selber ausprobieren
Thomas @ ForexInnovation



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>

*