![Berg- oder Eisbergdiagramme](https://c.mql5.com/i/articles/overlay.png)
Berg- oder Eisbergdiagramme
Einführung
Was halten Sie von der Idee, der MetaTrader 5-Plattform einen neuen Chart-Typ hinzuzufügen? Einige Leute sagen, dass es an einigen Dingen mangelt, die andere Plattformen bieten. Aber die Wahrheit ist, dass MetaTrader 5 eine sehr praktische Plattform ist, da sie Ihnen Dinge ermöglicht, die auf vielen anderen Plattformen nicht (oder zumindest nicht ohne weiteres) möglich sind.
Eine der häufigsten Beschwerden ist, dass es in MetaTrader 5 nur drei Charttypen gibt: Kerzen, Balken und Linien. Ist das wirklich so? Oder liegt es daran, dass jemand nicht weiß, wie die Plattform tatsächlich funktioniert oder welche Möglichkeiten die MQL5-Sprache bietet?
Meistens sind diejenigen, die sich am meisten beschweren, diejenigen, die am wenigsten über die Plattform lernen. Jeder möchte Dinge sofort zur Hand haben, und wenn sie nicht sofort verfügbar sind, beschweren sie sich.
In diesem Artikel — der dieses Mal nicht sehr lang sein wird — werden wir uns ansehen, wie man ein Diagramm in einem anderen, aber nützlichen Stil erstellt. Es kann besonders für diejenigen nützlich sein, die mit bestimmten Stilen handeln, wie Swing-Trading, Positionshandel und sogar Portfolio-Handel.
Heute werden wir uns das Berg- oder Eisbergdiagramm ansehen. Darüber hinaus werden wir noch ein wenig mehr über die Arbeit mit MQL5 erfahren. In diesem Artikel werden wir ein sehr interessantes Diagramm für eine effiziente Positionsverfolgung entwickeln: Mit diesem Diagramm müssen Sie nicht ständig überprüfen, ob ein Handel profitabel ist oder nicht. Sie können einfach anhand des Charts feststellen, ob Sie mit einer bestimmten Position im Gewinn oder Verlust sind.
Das Bergdiagramm ist dem linearen Darstellungsstil sehr ähnlich, weist aber ein paar Unterschiede auf. Ein Liniendiagramm (siehe Abbildung 01) zeigt lediglich an, ob sich der Kurs nach oben oder nach unten bewegt, aber mehr nicht. Die Bergdiagramm bietet viel mehr Möglichkeiten. Das Bergdiagramm ist in Abbildung 02 dargestellt.
Abbildung 01 - Typisches Liniendiagramm
Abbildung 02 - Typisches Bergdiagramm
Das in Abbildung 02 gezeigte Diagramm ist die häufigste Form des Bergdiagramms. Es gibt mehrere Arten, die auch unterschiedliche Namen haben können. Eine der Grundvarianten ist in Abbildung 03 dargestellt.
Abbildung 03 - Eisbergdiagramm für Kaufpositionen
Abbildung 03 zeigt ein Diagramm, das sehr leicht zu lesen ist. In diesem speziellen Fall bezieht sich das in Abbildung 03 dargestellte Diagramm auf Kaufpositionen, es könnte aber auch für Verkaufspositionen verwendet werden. Ein solches Diagramm ist in Abbildung 04 dargestellt.
Abbildung 04 - Eisbergdiagramm für Verkaufspositionen
Anhand von Eisbergdiagrammen können Sie sofort erkennen, ob eine Position profitabel ist oder Verluste macht. Das Diagramm verwendet verschiedene Farben, um den Handelsstatus (Gewinn/Verlust) anzuzeigen. So können wir durch einfaches Hinzufügen von Farbe zu einer Bergkarte einen anderen Stil einführen, der für diejenigen, die mit dem Studium des Marktes beginnen, viel einfacher zu lesen ist. Sie kann besonders nützlich sein, wenn Sie eine langfristige Position platzieren müssen.
Das Interessante daran ist, dass das System so einfach und gleichzeitig so anpassungsfähig ist, dass wir damit nicht nur Berg- oder Eisbergdiagramme erstellen können, sondern auch ein komplexeres Liniendiagramm, wie in Abbildung 05 dargestellt.
Abbildung 05 - Liniendiagramm zur Positionsanalyse
Der Linienstil kann geändert werden, d.h. es muss nicht unbedingt eine durchgezogene Linie sein. Wir können zum Beispiel das folgende Diagramm erstellen.
Abbildung 06 - Liniendiagramm zur Analyse einer Kaufposition
Man könnte meinen, dass wir einen sehr komplexen Code erstellen müssen, der extrem schwierig auszuführen oder zu verstehen ist. Der Code, den wir erstellen werden, ist jedoch recht einfach und daher auch für diejenigen leicht zu verstehen, die mit der Sprache MQL5 nicht vertraut sind. Daher kann es ein guter Ausgangspunkt für diejenigen sein, die mehr über die Funktionsweise der Plattform erfahren wollen, bevor sie sich an die Erstellung schwierigerer Dinge machen.
Was unser Code tut, um ein Berg- oder Eisbergdiagramm zu erstellen, ist dem Heiken-Ashi-Indikator sehr ähnlich. Aber im Gegensatz zu Heiken-Ashi erstellt unser Chart-System 100% saubere Charts, ähnlich wie die oben gezeigten. Es wird nichts Zusätzliches geben, auch nicht das Standardchart, das in MetaTrader 5 angezeigt wird.
Darüber hinaus bedeutet die Erstellung eines nutzerdefinierten Charts nicht, dass wir nicht in der Lage sind, unsere Lieblingsindikatoren darauf anzuwenden: Mit diesem neuen Chartstil können Sie alle Indikatoren, Expert Advisors, Skripte und alles andere verwenden, ohne den Code zu ändern. Das ist wunderbar, wenn man bedenkt, wie viele Dinge im Laufe der Zeit auftreten können.
Lassen Sie uns nun sehen, wie Sie das neue Chart-System in MetaTrader 5 implementieren.
Umsetzung
Sehen Sie sich die obigen Zahlen an. Wie die Erstellung des Diagramms aussehen kann, oder zumindest für den Teil, über den wir gesprochen haben (er ist in den Abbildungen 05 und 06 dargestellt)? Als erstes fällt mir der gleitende Durchschnitt ein. Sowohl Abbildung 05 als auch Abbildung 06 zeigen den gleitenden Durchschnitt. Dies ist etwas, das Abbildung 01 sehr ähnlich ist, aber aus irgendeinem Grund hat es andere Farben. Was ist mit anderen Formen?
Was sind die Geheimnisse der Charts in den Abbildungen 02, 03 und 04? Gibt es eine Möglichkeit, die gleiche Funktion zu implementieren, ohne die MetaTrader 5-Plattform zu überlasten?
Mit Ausnahme von Abbildung 01, einem Standard-Liniendiagramm auf der MetaTrader 5-Plattform, werden alle Charts auf ähnliche Weise erstellt, nämlich mit Hilfe eines gleitenden Durchschnitts. Auch Eisbergdiagramme werden auf die gleiche Weise erstellt.
Um dies zu verstehen, sehen Sie sich den folgenden Code an. Sie ist sehr einfach und beginnt mit den folgenden Zeilen:
#property copyright "Daniel Jose" #property icon "\\Images\\Icons\\Mountain Chart.ico" #property description "This indicator allows you to create a mountain chart" #property description "Whose average price can be indicated facilitating market analysis" #property version "1.00" #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 1
In dieser Zeile geben wir den Speicherort der Bilddatei an, die als Symbol für unser System verwendet werden soll. Wir geben auch an, dass wir einen Indikator (ja, das Diagramm wird ein Indikator darstellen) im Hauptfenster des Finanzinstruments verwenden werden.
Jetzt kommt der wichtige Punkt: Wir werden zwei Puffer verwenden, ABER (mit Betonung auf diesem Wort) sie werden nicht so verwendet, wie Sie vielleicht denken, also achten Sie auf diesen Teil. Wir werden einen Indikator zeichnen, und auch hier ist nicht alles genau so, wie es hier angegeben ist.
Es gibt drei mögliche Charttypen: mehrfarbiges Liniendiagramm, Eisbergdiagramm und Bergdiagramm. Deshalb halten wir uns nicht an die eingangs genannten Informationen.
Als Nächstes folgen einige einfache und notwendige Erklärungen, um sicherzustellen, dass alles funktioniert:
double Buff1[], Buff2[]; //+------------------------------------------------------------------+ enum eType {Fill, Contour}; //+------------------------------------------------------------------+ input double user01 = 0.0; //Analysis price input eType user02 = Fill; //Type of Mountain //+------------------------------------------------------------------+ struct st0 { long id; color CandleBear, CandleBull, CandleLine, LineUp, LineDown; }_memConfig;
Hier deklarieren wir zwei Puffer, die wir verwenden werden. Dann erstellen wir eine Enumeration, um den Typ des Diagramms zu wählen: Liniendiagramm, Eisberg- oder Bergdiagramm. Jetzt kommt der Moment, der speziell mit der Interaktion mit dem Nutzer verbunden ist. Wir wollen verstehen, wie das Diagramm dargestellt wird und welche Art von Diagramm wir auf dem Bildschirm sehen werden. Wir haben die folgenden Kombinationen:
Diagrammtyp | zugewiesener Wert von user01 | zugewiesener Wert von user02 |
---|---|---|
Einfarbiges Liniendiagramm | Wert ist 0 | Wert zur Angabe des Umrisses |
Mehrfarbiges Liniendiagramm | Schwellenwert des Preises | Wert zur Angabe des Umrisses |
Bergdiagramm | Wert ist 0 | Wert, der die Füllung angibt |
Eisbergdiagramm | Preiswert der Wasserlinie | Wert, der die Füllung angibt |
Diese Tabelle hilft Ihnen bei der Auswahl des Diagrammtyps, den Sie auf Ihrem Bildschirm anzeigen können.
Um alles noch deutlicher zu machen, habe ich am Ende des Artikels ein Video hinzugefügt, in dem die einzelnen Einstellungen und das Ergebnis demonstriert werden. So können Sie besser verstehen, was vor sich geht, denn manche Dinge sind schwer zu verstehen, wenn man sich den Code nur ansieht. Schauen Sie sich unbedingt das Video an: Es wird Ihnen helfen, alle möglichen Kombinationen zu verstehen. Im Artikeltext wird nicht beschrieben, wie man die Farben ändert, aber das Video zeigt dies.
Machen Sie sich keine Gedanken über die Struktur, denn sie dient nur als Speicher für bestimmte Informationen.
Wir sind also fertig damit. Kommen wir nun zur ersten Funktion in unserem Chart-System:
int OnInit() { IndicatorSetString(INDICATOR_SHORTNAME, "Mountain Chart"); Init_MountainChart(); return INIT_SUCCEEDED; }
Diese Funktion ist sehr einfach: Sie geben den Namen des Indikators an und rufen eine Funktion auf, um das Chart entstehen zu lassen. Wir könnten den Inhalt der aufgerufenen Funktion hier einfügen, aber ich mag es, Dinge zu trennen und den Code gut organisiert zu halten.
Nachfolgend finden Sie die nächste Funktion:
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { for (int c0 = (prev_calculated == 0 ? 0 : prev_calculated - 1); c0 < rates_total; c0++) { Buff1[c0] = price[c0]; Buff2[c0] = (user02 == Fill ? user01 : (price[c0] > user01 ? 0 : 1)); } return rates_total; }
Dies ist eine sehr einfache Funktion, und sie sollte wirklich sehr einfach sein, da sie bei jedem Preis-Tick oder bei jeder Preisänderung ausgeführt wird. MetaTrader 5 erzeugt ein Ereignis, in dessen Folge OnCalculate aufgerufen wird. Daher muss die Funktion sehr schnell ablaufen.
Um zu vermeiden, dass bei jedem Funktionsaufruf die gesamte Datenreihe von Anfang an neu berechnet wird, verwenden wir eine einfache Berechnung, bei der der vorherige Wert angepasst wird. Dadurch wird die schnellstmögliche Ausführung gewährleistet. Ganz am Anfang kann es zu einer leichten Verzögerung kommen, aber alle anderen Berechnungen sollten sehr schnell ablaufen.
Achten Sie nun auf Folgendes: Wir erhalten nur einen Wertetyp von MetaTrader 5, dieser Wert ist im Meldungsfeld des Indikators ausgewählt. Die möglichen Werte, die MetaTrader 5 an den Indikator übermittelt, sind in Abbildung 08 dargestellt.
Abbildung 08 - Arten von Werten, die vom MetaTrader 5 an den Indikator übertragen werden.
Dieser Wert wird in buffer01 implementiert — dies ist der Puffer, den wir verwenden werden. Buffer02 erhält den Wert, der von dem zu erstellenden Dokument abhängt. Warum verwenden wir diese Implementierung?
Das liegt daran, dass wir zwei verschiedene Zeichenstile verwenden werden. In einem der Stile erhält buffer02 einen Wert, der den Schwellenwert oder die Wasserlinie darstellt. Wenn der Wert der Wasserlinie über 0 liegt, geschieht dies, weil kein Vermögenswert unter diesem Wert gehandelt werden kann und es daher keinen Sinn hat, einen Vermögenswert mit einem negativen Wert zu halten. Wenn Sie den Füllmodus verwenden, erhalten Sie ein Bergdiagramm, wie in Abbildung 02 oben dargestellt.
Ist der Wert der Wasserlinie jedoch ungleich Null, so ergibt sich ein Eisbergdiagramm wie in den Abbildungen 03 und 04. Ähnlich verhält es sich, wenn wir den Umrissmodus verwenden und die Wasserlinie 0 ist, dann haben wir ein Liniendiagramm, das sich jedoch vom Standard-Liniendiagramm in MetaTrader 5 unterscheidet.
Sie können die Dicke und den Stil der Linie festlegen und erhalten so ein Diagramm, das den Abbildungen 05 und 06 ähnelt, obwohl der Wert der Wasserlinie dort von Null abweicht und deshalb an verschiedenen Stellen der Linie unterschiedliche Farben aufweist.
Nachstehend eine weitere Funktion:
void OnDeinit(const int reason) { ShowBars(); }
Der Indikator wird einfach beendet und das Diagramm kehrt in seinen ursprünglichen Zustand zurück. Schauen wir uns nun eine weitere Funktion an, die einer zusätzlichen Erklärung bedarf.
void Init_MountainChart(void) { _memConfig.id = ChartID(); PlotIndexSetInteger(0, PLOT_DRAW_TYPE, (user02 == Fill ? DRAW_FILLING : DRAW_COLOR_LINE)); SetIndexBuffer(0, Buff1, INDICATOR_DATA); SetIndexBuffer(1, Buff2, (user02 == Fill ? INDICATOR_DATA : INDICATOR_COLOR_INDEX)); PlotIndexSetInteger(0, PLOT_COLOR_INDEXES, 2); PlotIndexSetString(0, PLOT_LABEL, "MidPoint"); PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrForestGreen); PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrFireBrick); PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, 0); HideBars(); }
Nach dem Aufruf dieser Funktion erhalten wir die ID des Diagramms, an das der Indikator angehängt werden soll. Dieser Teil wird von der Funktion verwendet, die das Chart löscht und neu startet. Auf diese Merkmale werden wir später eingehen. Beachten Sie nun den folgenden Punkt: Wenn der Nutzer das Diagramm ausfüllen möchte, verwenden wir dieses Entwurfsmodell, und wenn nur die Gliederung erstellt werden soll, verwenden wir ein anderes Modell.
Deshalb sieht der Code ein wenig anders aus, als Sie vielleicht zu Beginn denken. Der Punkt liegt in einem Detail: beide Modelle verwenden zwei Puffer, aber das Modell DRAW_FILLING verwendet beide Puffer mit Daten, und das Modell DRAW_COLOR_LINE verwendet einen Puffer mit Daten und einen weiteren mit Farbe. Deshalb ist es wichtig, in der Funktion, die für die Anzeige des Indikators zuständig ist, korrekt zu rechnen.
Der erste Datenpuffer buffer01 wird immer verwendet. Buffer02 hängt davon ab, was wir konstruieren wollen: Er kann Daten oder einen Farbindex enthalten. Ich will damit nicht sagen, dass buffer02 die verwendete Farbe enthalten wird. Geben Sie dort NICHT die Farbe an. Dieser Puffer gibt einen Index an, der die zu verwendende Farbe bestimmt. Deshalb habe ich in der Berechnungsfunktion keine Farbinformationen verwendet — nur die Werte 0 und 1, da wir nur mit zwei Farben arbeiten werden.
Buff2[c0] = (user02 == Fill ? user01 : (price[c0] > user01 ? 0 : 1));
Lassen Sie uns nun weitermachen. Als Nächstes werden wir die zweifarbige Matrix definieren. Die Beschriftung, die wir hier verwenden, wird auf der Wasserlinie sichtbar sein, wenn der Mauszeiger darüber schwebt und wenn die Farbe ausgewählt und definiert wird. Ich habe diese Funktion hinzugefügt, um zu zeigen, wie Sie Informationen speichern können, die Sie vielleicht in Zukunft benötigen.
Lassen Sie uns nun Standardfarben definieren, die der Nutzer nicht ändern kann. Sie müssen den Indikator zunächst an das Diagramm anhängen und erst dann die Farben ändern. Dies wird auch in dem Video am Ende des Artikels gezeigt.
Zum Schluss, geben Sie an, von welcher Position aus das Diagramm erstellt werden soll.. Eigentlich ist diese Funktion nicht notwendig, ich möchte nur zeigen, wie man sie nutzen kann.
Danach können wir zu den letzten beiden Funktionen unseres Mikrodiagrammsystems übergehen. Die Funktion HideBars blendet das Standardlayout des MetaTrader 5-Charts aus. Das bedeutet, dass wir das Chart selbst in MetaTrader 5 ausblenden werden. Dies ist sehr einfach zu bewerkstelligen. Aber wir wollen den Nutzer nicht verärgern, wenn etwas schief geht. Deshalb speichern wir die ursprünglichen Daten, um sie später wiederherzustellen, wenn der Indikator aus dem Symbolchart entfernt wird. So können wir später leicht zum ursprünglichen Farbschema zurückkehren.
void HideBars(void) { _memConfig.CandleBear = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CANDLE_BEAR); _memConfig.CandleBull = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CANDLE_BULL); _memConfig.CandleLine = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CHART_LINE); _memConfig.LineUp = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CHART_UP); _memConfig.LineDown = (color) ChartGetInteger(_memConfig.id, CHART_COLOR_CHART_DOWN); ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BEAR, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BULL, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_LINE, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_UP, clrNONE); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_DOWN, clrNONE); ChartRedraw(); } //+------------------------------------------------------------------+ void ShowBars(void) { ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BEAR, _memConfig.CandleBear); ChartSetInteger(_memConfig.id, CHART_COLOR_CANDLE_BULL, _memConfig.CandleBull); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_LINE, _memConfig.CandleLine); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_UP, _memConfig.LineUp); ChartSetInteger(_memConfig.id, CHART_COLOR_CHART_DOWN, _memConfig.LineDown); ChartRedraw(); }
Nach dem Zurücksetzen der Daten wird der Nutzer nicht einmal merken, dass etwas nicht stimmt. Es ist nicht mehr nötig, alles neu einzurichten, was immer gut ist, weil es die Nutzung des Systems komfortabler macht.
Dennoch kann der Nutzer nach dem Entfernen des Indikators ein wenig überrascht sein, da es einige Zeit dauert, bis das Diagramm wieder vollständig gerendert ist. Das Ergebnis ist, dass der Chart des Finanzinstruments genauso aussieht wie vor der Einführung des Indikators.
Demonstration (UNBEDINGT ANSEHEN)
Schlussfolgerung
In diesem Artikel habe ich gezeigt, dass sowohl MQL5 als auch die MetaTrader 5-Plattform selbst viel mehr leisten können, als viele sich vorstellen können. Wir haben in dem Artikel einfache Dinge getan, die aber helfen können, komplexere Dinge zu verstehen.
Das größte Problem ist, dass die Leute dieses oder jenes über die Plattform oder die MQL5-Sprache sagen, obwohl sie die Möglichkeiten der Plattform gar nicht erforschen und nicht wirklich wissen, was möglich ist und was nicht. Sie sagen einfach, was andere sagen, ohne die Möglichkeiten zu verstehen.
Jedes Mal, wenn Sie hören, dass MetaTrader 5 oder MQL5 begrenzt sind und dass ihnen bestimmte Funktionen fehlen, zeigen Sie diesen Artikel denjenigen, die das behaupten. Das einzige, was wirklich begrenzt ist, ist ihre Kreativität oder ihr Wissen. Sie sagen diese Dinge, weil sie keine Ahnung vom Programmieren haben und den Zweck der MetaTrader 5-Plattform nicht verstehen, die funktional, sicher und schnell sein sollte, aber vor allem eine Plattform. Dies ist jedoch die Plattform, die aufgrund ihres hohen Maßes an Individualisierung eine flexible Anpassung an jeden von uns ermöglicht.
Übersetzt aus dem Portugiesischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/pt/articles/11078
![Algorithmen zur Optimierung mit Populationen Ameisenkolonie-Optimierung (ACO)](https://c.mql5.com/2/50/popular_algorithm_ant_colony_optimization_avatar.png)
![Die Magie der Zeit von Handelsintervallen mit dem Instrument Frames Analyzer](https://c.mql5.com/2/50/Frames_Analyzer_avatar.png)
![DoEasy. Steuerung (Teil 25): Das WinForms-Objekt Tooltip](https://c.mql5.com/2/50/MQL5-avatar-doeasy-library-2__2.png)
![DoEasy. Steuerung (Teil 24): Das WinForms-Hilfsobjekt für Hinweise](https://c.mql5.com/2/50/MQL5-avatar-doeasy-library-2__1.png)
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.