English Русский 中文 Español 日本語 Português 한국어 Français Italiano Türkçe
William Blaus Indikatoren und Handelssysteme in MQL5. Teil 1: Indikatoren

William Blaus Indikatoren und Handelssysteme in MQL5. Teil 1: Indikatoren

MetaTrader 5Handelssysteme | 14 März 2016, 13:08
1 810 0
Andrey F. Zelinsky
Andrey F. Zelinsky

Die technische Analyse kann im Handel nur sinnvoll genutzt werden, wenn gute Werkzeuge zur Hand sind.
Das Rüstzeug eines guten Börsenhändlers sind Erfahrung, Urteilsvermögen und eine von einer guten Handelssoftware bereitgestellte mathematische Hierarchie.
William Blau

Einleitung

Der erste Teil des Artikels „William Blaus Indikatoren und Handelssysteme in MQL5. Teil 1: Indikatoren“ liefert eine Darstellung der in MQL5 entwickelten Indikatoren und Oszillatoren, die von William Blau in seinem Buch „Momentum, Richtung und Divergenz“ beschrieben werden.

Der Quellcode der in dem hier vorliegenden Beitrag behandelten Indikatoren und Oszillatoren in der Programmiersprache MQL5 wird in der angehängten gepackten Datei Blau_Indicators_MQL5_en.zip vorgestellt.

Grundlagen der Analyse nach William Blau

William Blaus technische Analyse besteht aus vier Etappen:

  1. Anhand der Daten einer Kursreihe (Zeitraum q) wird ein Wert berechnet und anschließend in einem Diagramm abgebildet. Das Diagramm des Werts gibt weder die grundlegenden Tendenz der Kursbewegung wieder, noch hebt sie Wendepunkte hervor.
  2. Der resultierende Wert wird mithilfe der Methode EMA einmal (Zeitraum r), ein zweites (Zeitraum s) und ein drittes Mal (Zeitraum u) geglättet; anschließend wird ein Diagramm mit dem geglätteten Wert ausgegeben. Das Diagramm eines geglätteten Werts ist hinreichend genau und kommt den Schwankungen der Kurskurve mit einer geringfügigen Verzögerung recht nahe. Zudem markiert es die Tendenz und die Wendepunkte der Kursbewegung und beseitigt das Kursrauschen.
  3. Der geglättete Wert wird normalisiert und ein Diagramm des normalisierten geglätteten Werts (Indikators) wird ausgegeben. Die Normalisierung ermöglicht die Interpretation des Indikatorwertes als Maß des Überkaufs oder Überverkaufs des Marktes.
  4. Der normalisierte geglättete Wert (Indikator) wird mithilfe der Methode EMA einmal geglättet (Zeitraum ul); ein Oszillator wird angelegt, ein Diagramm des Indikators und der Signallinie, die Grenzen für den Überkauf und den Überverkauf des Marktes werden hinzugefügt. Der Oszillator ermöglicht die Unterscheidung der Signale bezüglich des Überkaufs/Überverkaufs des Marktes sowie des Endes und der Wendepunkte eines Trends.

Indikatoren

In dem Beitrag werden folgende Gruppen von Indikatoren vorgestellt:

  1. Auf dem Indikator Momentum beruhende Indikatoren:
  2. Auf dem Indikator Stochastik beruhende Indikatoren:
  3. Auf dem Stochastik Momentum Index beruhende Indikatoren:
  4. Auf der mittleren Abweichung von den Markttrends beruhende Indikatoren:
  5. Auf der Konvergenz/Divergenz des gleitenden Durchschnittswerts (MA) beruhende Indikatoren:
  6. Auf dem Kerzen- (Candlestick-) Momentum beruhende Indikatoren:
  7. Auf dem zusammengesetzten Hoch-Tief-Momentum beruhende Indikatoren:

In jeder Gruppe von Indikatoren werden vorgestellt:

  • Die Indikatoren der geglätteten Werte;
  • Die Kennziffern der normalisierten geglätteten Werte;
  • Die Oszillatoren auf der Grundlage der Kennziffern der normalisierten geglätteten Werte.

In dem Abschnitt True Strength Index erhalten wir:

  • eine ausführliche Analyse des Ansatzes von William Blau hinsichtlich der technischen Analyse von Kursdiagrammen; sowie
  • eine umfassende Darstellung des Algorithmus und des Programmcodes aller Indikatoren aus der Gruppe der auf dem Indikator Momentum beruhenden Indikatoren.

Als Glättungsmethode verwendet William Blau den exponentiellen gleitenden Durchschnittswert (Exponential Moving Average, kurz: EMA). Der exponentielle gleitende Durchschnittswert wird durch Hinzufügen eines bestimmten Teils des aktuellen Kurses zu dem vorhergehenden Wert des gleitenden Durchschnitts ermittelt.

Bei der Verwendung exponentieller gleitender Durchschnittswerte kommt den letzten Kursen das größere Gewicht zu.

Die Funktion zur Berechnung des EMA:

EMA(k,n) = EMA(k-1,n) + 2/(n+1) * (price(k) - EMA(k-1,n))
         = price(k) * 2/(n+1) + EMA(k-1,n) * (1 - 2/(n+1))

mit:

  • EMA(k,n) für den exponentiellen geglätteten Durchschnittswert für den Zeitraum n zum Zeitpunkt k;
  • price(k) für den Kurs zum Zeitpunkt k.

In dem „Benutzerhandbuch für die MetaTrader-Instanz auf dem Ausgabegerät (Terminal)“ werden in dem Abschnitt „Analyse/Technische Indikatoren/Trendindikatoren/Moving Average“ vier Arten gleitender Durchschnittswerte sowie die Verfahren zu ihrer Verwendung in der technischen Analyse beschrieben, siehe auch iMA.

Die Bibliothek mit den Funktionen

Die Bibliothek mit den Funktionen zur Berechnung gleitenden Durchschnittswerte befindet sich in der Datei MovingAverages.mqh. Uns interessiert die Funktion ExponentialMAOnBuffer(), die das Ausgabedatenfeld buffer[] mit den EMA-Werten des Eingangsdatenfeldes price[] füllt. Allerdings weist die in der Datei MovingAverages.mqh vorgestellte Umsetzung der Funktion ExponentialMAOnBuffer() den Mangel auf, dass sie den Zeitraum n = 1 nicht verarbeitet.

Siehe Quellcode:

if(period<=1 || rates_total-begin<period) return(0);

William Blau dagegen verwendet in seinem Buch den Glättungszeitraum n = 1 wie das Fehlen der Glättung.

Deshalb wurden am Code der Funktion ExponentialMAOnBuffer() einige Änderungen vorgenommen:

if(period<1 || rates_total-begin<period) return(0);

dabei kam die Funktion ExponentialMAOnBufferWB() heraus. Der Code dieser Funktion findet sich in der Datei WilliamBlau.mqh.

In der Datei WilliamBlau.mqh finden sich auch folgende Funktionen:

  • Die Funktion PriceName() gibt die Bezeichnung der Art des Kurses aus:
string PriceName(
                 const int applied_price // price type
                )
  • Die Funktion CalculatePriceBuffer() berechnet das Datenfeld mit den Kursen für die angegebene Kursart:
int CalculatePriceBuffer(
                         const int applied_price,   // price type
                         const int rates_total,     // rates total
                         const int prev_calculated, // bars, processed at the last call
                         const double &Open[],      // Open[]
                         const double &High[],      // High[]
                         const double &Low[],       // Low[]
                         const double &Close[],     // Close[]
                         double &Price[]           // calculated prices array
                        )

Die Kursbasis und der Zeitraum des Kursdiagramms

William Blau betrachtet die Schlusskurse und einen Zeitraum von einem Tag. Die im Rahmen dieses Beitrags entwickelten Indikatoren ermöglichen die Auswahl der Kursbasis (siehe Kurskonstanten), der Zeitraum des Kursdiagramms wird vom Zeitrahmen des Indikators bestimmt (siehe Diagrammzeiträume).

 

1. True Strength Index (Index der „wahren Stärke“)

Betrachtete Indikatoren (s. Anhang):

  1. Blau_Mtm.mq5 - Indikator der Geschwindigkeit (Momentum für den Zeitraum q; geglättetes Momentum für den Zeitraum q);
  2. Blau_TSI.mq5 - True Strength Index (normalisiertes geglättetes Momentum für den Zeitraum q);
  3. Blau_Ergodic.mq5 - Ergodischer Oszillator (auf der Grundlage des True Strength Index).

1.1. Momentum

Eine Beschreibung des in die Instanz von MetaTrader 5 auf dem Ausgabegerät (Terminal) integrierten technischen Geschwindigkeitsindikators Momentum sowie der Arten seiner Verwendung bei der technischen Analyse bietet der Abschnitt Analyse/Technische Indikatoren/Oszillatoren/Momentum (siehe auch iMomentum) in dem „Benutzerhandbuch für die MetaTrader-Instanz auf dem Ausgabegerät (Terminal)“. Im Gegensatz zu dem Indikator Momentum von William Blau berechnet der in die Anwendungsinstanz auf dem Ausgabegerät (Terminal) integrierte (iMomentum) die Geschwindigkeit alsabsolute Kursänderung.

Ein Beispiel für William Blaus Umsetzung eines Indikators der „wahren Stärke“ (TSI) in MQL5 bietet der Artikel MQL5: Erstellen eines eigenen Indikators.


1.1.1. Technische Analyse mithilfe des Geschwindigkeitsindikators (Momentum)

Gegenstand der technischen Analyse ist das Kursdiagramm eines Finanzinstrumentes. Jedes Element des Diagramms ist ein Kursbalken. Die Parameter eines Kursbalkens sind: der Zeitpunkt der Eröffnung, der Eröffnungskurs, der Höchstkurs, der niedrigste Kurs, der Schlusskurs, der Handelsumfang und weitere. Ein Kursbalken wird angelegt, um das Kursverhalten während eines bestimmten diskreten Zeitraums (Diagrammzeitraums) abzubilden.

Die Aufgabe der technischen Analyse eines Kursdiagramms besteht in der Notwendigkeit, die vorhandene Tendenz, den Trend, der Kursbewegung zu bestimmen, Preisspitzen und -täler anzugeben sowie die Richtung der Kursänderungen in dem bevorstehenden Zeitraum zu prognostizieren. Die Schwierigkeit der Analyse von Kursdiagrammen ergibt sich daraus, dass der Kurs, obwohl er sich im Rahmen seiner Grundtendenz bewegt, Schwankungen in unterschiedliche Richtungen durchläuft, was zu dem so genannten Kursrauschen führt.

William Blaus Vorschläge: Erstens: die Geschwindigkeit, das Momentum. William Blau hat das Momentum als relative [Schluss-] Kursänderung für jeden [Tages-] Zeitraum berechnet und einen Geschwindigkeitsindikator (Momentum) angelegt. Aus mathematischer Sicht handelt es sich bei der Funktion Momentum um die erste Ableitung der Kursfunktion.

Abb. 1.1. Der Geschwindigkeitsindikator Momentum für den Zeitraum q

Abb. 1.1. Der Geschwindigkeitsindikator Momentum für den Zeitraum q

Der Indikator Momentum bildet die Kursschwankungen innerhalb eines Zeitraums ab, zeigt die Geschwindigkeit (Größe) und die Richtung der Kursänderung in dem Zeitraum an, sie gibt jedoch nicht die allgemeine Tendenz der Kursbewegung wieder und markiert auch nicht die Wendepunkte.

Zweitens: die Glättung Der gleitende Durchschnittswert des Momentum-Indikators (die summierten Kursschwankungen eines Zeitraums) gibt sowohl die allgemeinen als auch die lokalen Schwankungen der Kurskurve fast exakt wieder. In der Abbildung 1.2 (a) in den Unterfenstern I und II werden die Geschwindigkeitsindikatoren (der geglättete Momentum) mit Zeiträumen von 20 bzw. 300 für den gleitenden Durchschnittswert vorgestellt.

Je größer der Zeitraum für den gleitenden Durchschnittswert desto genauer nähert sich (bildet) der geglättete Momentum den Schwankungen der Kurskurve an (ab). Aus mathematischer Perspektive ist die Funktion zur Glättung des Momentums eine Integralfunktion des Momentums oder die wiederhergestellte Funktion des Kurses.

Abb. 1.2 (a). Der geglättete Geschwindigkeitsindikator Momentum für den Zeitraum q

Abb. 1.2 (a). Der geglättete Geschwindigkeitsindikator Momentum für den Zeitraum q


Abb. 1.2 (b). Der geglättete Geschwindigkeitsindikator Momentum für den Zeitraum q

Abb. 1.2 (b). Der geglättete Geschwindigkeitsindikator Momentum für den Zeitraum q


In der Abb. 1.2 (a) werden im Hauptfenster die geglätteten EMA-Indikatoren mit Zeiträumen von 5, 20 bzw. 100 vorgestellt. Eine unwesentliche Verlängerung des Zeitraums für den gleitenden Durchschnitt führt zu einer Verzögerung, wodurch der gleitende Durchschnittswert de facto unfähig wird, die Schwankungen der Kurskurve wiederzugeben.

Drittens: die wiederholte Glättung Die erste Glättung des Momentums markiert die allgemeine Tendenz der Kursbewegung sowie die Wendepunkte, sie beseitigt das Kursrauschen jedoch nicht. Zur Beseitigung des Kursrauschens ist eine erneute Glättung mit einem kurzen Zeitraum für den gleitenden Durchschnittswert erforderlich.

In der Abb. 1.2 (b) wird im Unterfenster I der Indikator des geglätteten Momentums (mit einem Zeitraum von 20 für den gleitenden Durchschnittswert), abgebildet und in den Unterfenstern II und III die Indikatoren des zwei- bzw. dreifach geglätteten Momentums (mit Zeiträumen von 5 bzw. 3 für den gleitenden Durchschnitt). Die wiederholte Glättung beseitigt das Kursrauschen, fügt der Kurve jedoch eine leichte Verschiebung (Verzögerung) zu.

Viertens: Abweichung als Signal für eine Trendänderung. Bei der Glättung des Momentums kann es bei einem kurzen Zeitraum für den gleitenden Durchschnitt zu einer Abweichung (Divergenz) der Kurve des geglätteten Momentums von der Tendenz der Kurskurve kommen.

In der Abb. 1.2 (a) zeigt sich die Abweichung in dem Diagramm im Unterfenster I, in Abb. 1.2 (b) dagegen in den Unterfenstern I, II und III (die Richtung der Kursänderung weicht von der Richtung des geglätteten Momentums ab). Derartige Abweichungen weisen häufig auf eine Trendänderung hin. Aus mathematischer Sicht ist die Abweichung (Divergenz) eine Funktion des Glättungszeitraums.

Die Zuverlässigkeit der Interpretation der Abweichung als Signal für eine Trendänderung kann gesteigert werden, indem wenn man die Abweichung lediglich in den Bereichen für den Überkauf bzw. Überverkauf des Marktes betrachtet (s. §  1.2.1).


1.1.2. Die Definition des Momentums

Die Geschwindigkeit (das Momentum) ist eine relative Kursänderung in einem Zeitraum.

Das Vorzeichen des Momentums weist die Richtung der Kursänderung aus: ein positives Momentum bedeutet, dass der Kurs in dem Zeitraum gestiegen ist; eine negatives heißt, er ist gefallen. Bei der Größe des Momentums handelt es sich um die relative Geschwindigkeit der Kursänderung (die erste Ableitung des Kurses).

Abb. 1.3. Die Bestimmung des Momentums

Abb. 1.3. Die Bestimmung des Momentums

Die Formel für das Momentum:

mtm(price) = price - price[1]

mit:

  • price - Kurs bei [Schließung] des aktuellen Zeitraums;
  • price [1] - Kurs bei [Schließung] des vorhergehenden Zeitraums.

William Blau betrachtet das Momentum als die Differenz zwischen dem Kurs bei [Schließung] des aktuellen Zeitraums und Kurs bei [Schließung] des vorhergehenden Zeitraums. Bei der Berechnung des Momentums für einen Einzelzeitraum verwendet William Blau die Kurse zweier Zeiträume (des aktuellen und des diesem vorhergehenden).

In die Formel zur Berechnung des Momentums fügen wir den Zeitraum q ein, wobei q die Anzahl der in die Berechnung einbezogenen Zeiträume ist (nach William Blau ist q = 2).

Die Formel für das Momentum für den Zeitraum q:

mtm(price,q) = price - price[q-1]

mit:

  • q - Anzahl der in die Berechnung des Momentums einbezogenen Zeiträume (Balken) des Kursdiagramms;
  • price - Kurs [Schließung] des aktuellen Zeitraums;
  • price [q-1] - Kurs bei [Schließung] der vorhergehenden (q-1) Zeiträume.

In der resultierenden Formel entspricht unserem Momentum für zwei Zeiträume das auf lediglich einen Zeitraum bezogene Momentum von William Blau.

Die Formel für das geglättete Momentum für den Zeitraum q:

Mtm(price,q,r,s,u) = EMA(EMA(EMA( mtm(price,q) ,r),s),u)

mit:

  • price - Kurs bei [Schließung] - Kursbasis des Kursdiagramms;
  • q - Anzahl der in die Berechnung des Momentums einbezogenen Zeiträume (Balken) des Kursdiagramms;
  • mtm(price,q)=price-price[q-1] - Momentum für den Zeitraum q;
  • EMA (mtm (price, q), r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf das Momentum für den Zeitraum q;
  • EMA (EMA(..., r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA (EMA (EMA (..., r), s), u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung, den EMA(s).

1.1.3. Mtm(price,q,r,s,u) - Geschwindigkeitsindikator (Momentum). Beschreibung
  • Dateiname: Blau_Mtm.mq5
  • Bezeichnung: Momentum (Momentum für den Zeitraum q; geglättetes Momentum für den Zeitraum q) von William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das Momentum berechnet wird (Voreinstellung: q = 2);
    • r - Zeitraum des ersten EMA, angewendet auf das Momentum (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung. Wenn beispielsweise Mtm (price, 2,20,5,1) eingestellt wird, erhalten wir ein zwei Mal geglättetes Momentum, bei Einstellung von Mtm (price, 2,1,1,1) dagegen ein ungeglättetes;
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

1.2. Der True Strength Index

1.2.1. Technische Analyse unter Verwendung des „Index der wahren Stärke“

Fortsetzung: Anfang siehe Abschnitt 1.1.1.

Fünftens: Normalisierung. Die Überführung des geglätteten Momentums auf einen einheitlichen Maßstab (Abbildung in dem Intervall [-1, +1]) mithilfe der Normalisierung der Werte ermöglicht die Bestimmung der Grenzen für den Überkauf oder Überverkauf des Marktes. Durch die weitere Vergrößerung des normalisierten geglätteten Momentums um den Faktor 100 wird die Zahlenreihe in eine Prozentreihe umgewandelt (Abbildung in dem Intervall [-100, +100])

Abb. 1.4. Der Indikator der normalisierten Geschwindigkeit (das normalisierte geglättete Momentum)

Abb. 1.4. Der Indikator der normalisierten Geschwindigkeit (das normalisierte geglättete Momentum)


Die Abweichung als Signal für einen Trendwechsel kann als zuverlässig gelten, wenn sich das normalisierte geglättete Momentum in den Bereich des Überkaufs oder Überverkaufs des Marktes befindet.

1.2.2. Bestimmen des „Index der wahren Stärke“

Der Index der wahren Stärke (True Strength Index, TSI) ist ein Indikator der normalisierten Geschwindigkeit (des normalisierten über den Zeitraum q geglätteten Momentums). Die Überführung der Werte des geglätteten Momentums auf einen einheitlichen Maßstab (Abbildung in dem Intervall [-1, +1]) erfolgt durch die Normalisierung jedes Wertes des geglätteten Momentums (die konsolidierte Summe der geglätteten Kursschwankungen im Zeitraum q) auf den als absoluten Wert genommenen Wert des geglätteten Momentums.

Die Multiplikation mit dem Faktor 100 verwandelt das abgebildete Intervall in eine Prozentreihe [-100, +100]. Die Normalisierung ermöglicht die Interpretation des TSI als Grenze für den Überkauf (positiver Wert) oder Überverkauf (negativer Wert) des Marktes.

Die Formel für den Index der wahren Stärke:

                     100 * EMA(EMA(EMA( mtm(price,q) ,r),s),u)         100 * Mtm(price,q,r,s,u)
TSI(price,q,r,s,u) = –––––––––––––––––––––––––------–––––––––– = ––––––––––––––––------–––––––––––––––
                       EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)     EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)
if EMA(EMA(EMA(|mtm(price,q)|,r),s),u)=0, then TSI(price,q,r,s,u)=0

mit:

  • price - Kurs bei [Schließung] - Kursbasis des Kursdiagramms;
  • q - Anzahl der in die Berechnung des Momentums einbezogenen Zeiträume (Balken) des Kursdiagramms;
  • mtm(price,q)=price-price[q-1] - Momentum für den Zeitraum q;
  • | Mtm (price, q) | - absoluter Wert des Momentums für den Zeitraum q;
  • Mtm (price, q, r, s, u) - drei Mal geglättetes Momentum für den Zeitraum q;
  • EMA (..., r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf:
    1) den Indikator für das Momentum für den Zeitraum q;
    2) den absoluten Wert des Momentums für den Zeitraum q;
  • EMA (EMA(..., r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA (EMA (EMA (..., r), s), u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

1.2.3. TSI(price,q,r,s,u) - der Index der wahren Stärke. Beschreibung
  • Dateiname: Blau_TSI.mq5
  • Bezeichnung: „Index der wahren Stärke“ (True Strength Index) (normalisiertes geglättetes Momentum für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das Momentum berechnet wird (Voreinstellung: q = 2);
    • r - Zeitraum des ersten EMA, angewendet auf das Momentum (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • (nicht obligatorisch) zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

1.3. Der ergodische Oszillator

1.3.1. Technische Analyse unter Verwendung des ergodischen Oszillators

Fortsetzung: Anfang siehe Abschnitt 1.1.1 und 1.2.1.

Sechstens: Die Bereiche des Überkaufs und Überverkaufs des Marktes Das Einheitenintervall [-1, +1] oder das Prozentintervall [-100.100], innerhalb dessen die Werte des normalisierten geglätteten Momentums geändert werden, ermöglicht die Ermittlung der Bereiche, in denen der Markt „überkauft“ (overbought) oder „überverkauft“ (oversold) ist.

Die Indikatoren der technischen Analyse, die den überkauften oder überverkauften Zustand des Marktes ausweisen, werden als Oszillatoren bezeichnet. Für jeden Oszillator sind Grenzwerte festgelegt, bei deren Erreichen ein Signal bezüglich des Überkaufs oder Überverkaufs des Marktes ausgegeben wird. Für Trendmärkte sind Oszillatoren ungeeignet, da sich diese Märkte beliebig lange in einem Zustand des Überkaufs/Überverkaufs befinden können.

Siebtens: Die Signallinie. Um Signale bezüglich des Endes eines Trends und die Umkehr einer Kursbewegungstendenz zu empfangen, wird eine Signallinie verwendet. Das Signal für den Kauf wird ausgegeben, wenn die Kurslinie die Signallinie von unten nach oben schneidet. Ein Verkaufssignal geht ein, wenn die Kurslinie die Signallinie von oben nach unten schneidet. Wenn es sich bei der Kurslinie um die des erdogischen Oszillators (des Index der wahren Stärke) handelt, bildet die wiederholte Glättung des ergodischen Oszillators die Signallinie. Das Verfahren der wiederholten Glättung entspricht dem der letzten Phase der Glättung des ergodischen Oszillators.

Achtens: Der Kursbewegungstrend. Der Kursbewegungstrend ist aufsteigend (Aufwärtstrend), wenn die Kurslinie (des ergodischen Oszillators) oberhalb der Signallinie verläuft. Der Trend ist absteigend (Abwärtstrend), wenn die Kurslinie (des ergodischen Oszillators) unterhalb der Signallinie verläuft.

Abb. 1.5. Ergodischer Oszillator

Abb. 1.5. Ergodischer Oszillator


1.3.2. Die Definition des ergodischen Oszillators

Ergodic(price,q,r,s,u) = TSI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( Ergodic(price,q,r,s,u) ,ul)

mit:

  • Ergodic() - Ergodischer Oszillator - Index der wahren Stärke TSI(price,q,r,s,u);
  • SignalLine() - Signallinie - der auf den ergodischen Oszillator angewendete exponentielle gleitende Durchschnitt (EMA) für den Zeitraum ul;
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden gültigen Wertes (>1) des exponentiellen gleitenden Durchschnitts des ergodischen Oszillators sein. Wenn wir zum Beispiel die zweifache Glättung Ergodic (price, q, r, s, u) = Ergodic (price, 2,20,5,1) verwenden, gilt nach William Blau: ul = s = 5.

1.3.3. Ergodic (price, q,r,s,u,ul) - Ergodischer Oszillator. Beschreibung
  • Dateiname: Blau_Ergodic.mq5
  • Bezeichnung: Ergodischer Oszillator (auf der Grundlage eines Index der wahren Stärke) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - der ergodische Oszillator (Index der wahren Stärke):
      • q - Zeitraum, für den das Momentum berechnet wird (Voreinstellung: q = 2);
      • r - Zeitraum des ersten EMA, angewendet auf das Momentum (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • grafische Darstellung #1 - die Signallinie:
      • ul - EMA-Zeitraum der Signallinie, angewendet auf den erdogischen Oszillator (Voreinstellung: ul = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“);
    • zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes, der Beschreibung der Grenze; Ändern der grafischen Abbildung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs einzelner Indikatorfenster (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung
    • ul>0. Ist ul = 1, stimmt die Signallinie mit der des ergodischen Oszillators überein;
    • der Mindestumfang des Kursdatenfeldes ist gleich = (q-1 + r + s + u + ul-4 +1).

1.4. Der Programmcode (ausführliche Darstellung)

1.4.1. "Blau_Mtm.mq5" - Indikator Mtm(price,q,r,s,u) - Momentum

Der Programmcode des Indikators Mtm (price,q,r,s,u):

//+------------------------------------------------------------------+
//|                                                     Blau_Mtm.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window     // indicator in a separate window
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots
//--- main graphic plot #0
#property indicator_label1  "Mtm"       // graphic plot label #0
#property indicator_type1   DRAW_LINE   // draw as a line
#property indicator_color1  Blue        // color
#property indicator_style1  STYLE_SOLID // line style - solid line
#property indicator_width1  1           // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA
//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes
int    rates_total_min; // total rates min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // plot buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
   // buffers for intermediate calculations
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");             // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // applied price
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[] arrays
                        PriceBuffer          // price buffer
                       );
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Untersuchen wir den Code etwas genauer.

1.4.1.1. Die Einstellungen des Indikators Mtm (price,q,r,s,u)

Literaturhinweise

Was in der MQL5-Hilfe bezüglich der Indikatoreinstellungen gelesen werden sollte:

  1. Das Kapitel „Benutzerdefinierte Indikatoren“.
  2. Die Beziehung zwischen den Indikatoreigenschaften und den entsprechenden Funktionen (im Kapitel „Benutzerdefinierte Indikatoren“).
  3. Programmeigenschaften (#property) (im Kapitel „Grundlagen der Programmiersprache / Präprozessor“).
  4. Darstellungsstile (Eigenschaften der grafischen Abbildung) (im Kapitel „Voreingestellte Konstanten, Aufzählungen und Gerüste / Indikatorkonstanten“).
  5. Eigenschaften der benutzerdefinierten Indikatoren (im Kapitel „Voreingestellte Konstanten, Aufzählungen und Gerüste / Indikatorkonstanten“).
Urheberrecht. Beschreibung des Indikators
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description

Einstellungen ausschließlich mithilfe der Präprozessoranweisung #property. Das Urheberrecht (die Parameter copyright und link), die Fassung (der Parameter version) sowie die Beschreibung des MQL5-Programms (der Parameter description) werden in dem Fenster „Eigenschaften“ des Indikators angezeigt (Registerkarte „Eigenschaften“, Rubrik „Erweitert“).

Eingebettete Include-Datei
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)

Der Präprozessor ersetzt die Zeile #Include <WilliamBlau.mqh> durch den Inhalt der Datei WilliamBlau.mqh. Diespitzen Klammern weisen darauf hin, dass die Datei WilliamBlau.mqh dem Standardverzeichnis entnommen wird. Weitere Informationen s. „Eingebettete Dateien (#include).

Zum Inhalt der Datei WilliamBlau.mqh siehe Einleitung.

Indikatoreinstellungen (global)

Bei dem benutzerdefinierten Indikator handelt es sich lediglich um einige grafische Darstellungen. Die grafische Abbildung des Indikators kann entweder im Hauptfenster des Kursdiagramms oder in einem eigenen (Unter-) Fenster erfolgen Jede grafische Abbildung weist bestimmte Darstellungseigenschaften, wie Farbe, Stil und Linienstärke, auf.

Die zur Erstellung der grafischen Abbildung erforderlichen Daten werden den als Indikatorpuffer bezeichneten Zwischenspeichern entnommen (jeder grafischen Darstellungen können ein bis fünf Indikatorpuffer entsprechen). Ein Datenfeld (Array) des Indikators wird zum Zwischenspeicher bestimmt.

Um den Indikator einzurichten, müssen wir (s. Abb. 1.6):

  1. das Fenster für die Wiedergabe unseres Indikators angeben;
  2. die Anzahl der grafischen Darstellungen angeben;
  3. die Anzahl der Indikatorpuffer angeben;
  4. die Indikatordatenfelder deklarieren;
  5. die Verknüpfung: Indikatordatenfeld -> Indikatorpuffer -> grafische Darstellung, herstellen;
  6. die Eigenschaften jeder grafischen Darstellung beschreiben;
  7. die Abbildungsgenauigkeit der Indikatorwerte angeben;
  8. zu jeder grafischen Darstellung die Anzahl der anfänglichen Balken ohne Wiedergabe der grafischen Darstellung angeben;
  9. die waagerechten Grenzen festlegen und ihre Eigenschaften beschreiben (nicht vorhanden);
  10. die Skalierungsgrenzen für das gesonderte Indikatorfenster festlegen (nicht vorhanden)
  11. die Kurzbezeichnung für den Indikator angeben.

Abb. 1.6. Einstellungen für den Indikator Mtm (price,q,r,s,u)

Abb. 1.6. Einstellungen für den Indikator Mtm (price,q,r,s,u)


Die Einrichtung des Indikators erfolgt:

Mehr dazu siehe Die Beziehung zwischen den Indikatoreigenschaften und den entsprechenden Funktionen.

Der Unterschied zwischen diesen Möglichkeiten zur Einrichtung des Indikators besteht darin, dass die Einstellungen bei der Anweisung #property bereits geändert werden können, bevor der Indikator mit einem Kursdiagramm verknüpft wurde, wogegen die mithilfe der Sonderfunktionen eingerichteten Einstellungen erst geändert werden können, nachdem  der Indikator mit einem Kursdiagramm verknüpft wurde. Die Einstellungen können in dem Fenster mit den „Eigenschaften“ des Indikators geändert werden.

Einstellungen: Fenster zur Abbildung des Indikators (1)
#property indicator_separate_window     // indicator in a separate window

Die Einrichtung ist zwingend erforderlich und kann ausschließlich mithilfe der Präprozessoranweisung #property vorgenommen werden. Es sind zwei Möglichkeiten zur Abbildung des Indikators vorgesehen:

  1. Im Hauptfenster des Kursdiagramms: indicator_chart_window;
  2. oder in einem eigenen (Unter-) Fenster: indicator_separate_window.
Einstellungen: Anzahl der Zwischenspeicher (3) und grafischen Darstellungen (2)
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots

Diese Einstellungen sind zwingend erforderlich und können ausschließlich mithilfe der Präprozessoranweisung #property vorgenommen werden. Die Anzahl der Zwischenspeicher (indicator_buffers) und die der grafischen Darstellungen (indicator_plots) sind nicht begrenzt.

Einstellungen: Indikatordatenfelder (Arrays) (4)
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA

Die Indikatordatenfelder werden auf globaler Ebene als eindimensionale dynamische Datenfelder der Art „double“ deklariert.

Einstellungen: Herstellen der Verbindung (5) zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen.
// graphic plot #0
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
// buffers for intermediate calculations
SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA

Der Code wird in der Funktion OnInit() der Ereignisverarbeitungsroutine Init() aufgezeichnet.

Die Verbindung des Indikatorpuffers mit dem entsprechenden eindimensionalen dynamischen Datenfeld wird mithilfe der Funktion SetIndexBuffer() hergestellt:

bool SetIndexBuffer(
   int                 index,    // index of the indicator buffer (starts from 0)
   double              buffer[], // dynamic array
   ENUM_INDEXBUFFER_TYPE data_type // type of data, stored in the indicator array
   );

Bei dem Indikatorpuffer handelt es sich um ein eindimensionales dynamisches Datenfeld der Art „double“, dessen Größe von der Anwendungsinstanz auf dem Ausgabegerät (Terminal) so nachjustiert wird, dass sie stets der Anzahl der Balken entspricht, für die der Indikator berechnet wird. Die Vergabe der Kennziffern für die Zwischenspeicher den Indikators beginnt bei „0“.

Ein Indikatorpuffer kann drei Arten von Daten speichern: INDICATOR_DATA, INDICATOR_COLOR_INDEX undINDICATOR_CALCULATIONS. Jeder grafischen Darstellung können je nach Art seiner Abbildung ein bis fünf Indikatorpuffer entsprechen: ein bis vier Zwischenspeicher für Indikatorwerte (mit Daten der Art INDICATOR_DATA) sowie einer für die Farbe (mit Daten der Art INDICATOR_COLOR_INDEX).

Die Indikatorpuffer mit der Datenart INDICATOR_CALCULATIONS sind für Zwischenberechnungen vorgesehen. Nach der Einbindung weist ein Indikatordatenfeld dieselbe Kennziffernfolge auf wie ein gewöhnliches Datenfeld (siehe unten unter Punkt 1.4.1.2).

Einstellungen: Eigenschaften der grafischen Darstellungen (6)

Bei der Einrichtung jeder einzelnen grafischen Darstellung sind anzugeben:

  1. Das Symbol;
  2. Die Art der Darstellung (zu allen 18 Darstellungsstilen s. die Aufzählung ENUM_DRAW_TYPE);
  3. Die Linienfarbe;
  4. Die Linienart (mögliche Arten s. die Aufzählung ENUM_LINE_STYLE);
  5. Linienstärke.

Es bestehen zwei Möglichkeiten, die Einstellungen vorzunehmen:

1) Mithilfe der Präprozessoranweisung #property (Umsetzung wie folgt):

//--- graphic plot #0 (Main)
#property indicator_label1  "Mtm"       // label of graphic plot #0
#property indicator_type1   DRAW_LINE   // Drawing type: DRAW_LINE - line
#property indicator_color1  Blue        // Line color - Blue
#property indicator_style1  STYLE_SOLID // Line style: STYLE_SOLID - solid line
#property indicator_width1  1           // Line width

2) Mithilfe einer Gruppe von Funktionen zur Einrichtung der Eigenschaften grafischer Darstellungen: PlotIndexSetDouble(), PlotIndexSetInteger(), PlotIndexSetString():

//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");            // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);       // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);          // line width

Der Code wird in der Funktion OnInit() der Ereignisverarbeitungsroutine Init() aufgezeichnet. Beschreibung der PlotIndexSet*()-Gruppe von Funktionen:

bool PlotIndexSetDouble|Integer|String(
   int                             plot_index, // index of the graphic plot
   int                             prop_id,    // identifier of the property of the graphic plot
   double|int,char,bool,color|string  prop_value  // new value of the property
   );

Zur Präzisierung der Abbildung der gewählten Art der grafischen Darstellung werden die in der Aufzählung ENUM_PLOT_PROPERTY aufgeführten Bezeichner der Eigenschaften der grafischen Darstellung verwendet.

Die Vergabe der Kennziffern für die grafischen Darstellungen beginnt bei „0“. Zu den Gründen für die Bevorzugung der Einrichtung mithilfe der Anweisung #property s. o. unter „Indikatoreinstellungen (global)“. Einige Eigenschaften der grafischen Darstellungen (Farbe, Stil, Linienstärke) können in dem Fenster „Eigenschaften“ (Registerkarte „Farbe“) des Indikators geändert werden.

Einstellungen: Genauigkeit der Darstellung der Indikatorwerte ​​(7)
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

Der Code wird in der Funktion OnInit() der Ereignisverarbeitungsroutine Init() aufgezeichnet. Beschreibung der Funktionen zur Einrichtung der Indikatoreigenschaften IndicatorSet*():

bool IndicatorSetDouble|Integer|String(
   int                    prop_id,   // ID of indicator property
   double|int,color|string  prop_value // new value of a property
   );

Die Bezeichner für die Indikatoreigenschaften sind in der Aufzählung ENUM_CUSTOMIND_PROPERTY aufgeführt.

Die Darstellungsgenauigkeit der Indikatorwerte wird ausschließlich mithilfe der Funktion IndicatorSetInteger() festgelegt und der Bezeichner der Indikatoreigenschaft INDICATOR_DIGITS mithilfe der Aufzählung ENUM_CUSTOMIND_PROPERTY_INTEGER.

In dem Beispiel werden die zur Abbildung vorgesehenen Werte der Indikatorpuffer, die bei der Wiedergabe in einem sich bei Annäherung des Mauszeigers an die Indikatorlinie aufklappenden Infofensters neben der Kurzbezeichnung des Indikators stehen, auf die Genauigkeit der Nachkommastellenzahl _Digits im Kurs des Finanzinstrumentes gerundet, auf das der Indikator angesetzt ist.

Einstellungen: Anzahl der anfänglichen Balken ohne Abbildung (8)

Die Zusammenstellung der Daten für die Abbildung des Momentum-Indikator von William Blau für den Zeitraum q erfolgt in vier Schritten:

Schritt 1. Auf der Grundlage der Daten des Kursdatenfeldes PriceBuffer[] wird das Momentum (für den Zeitraum q) berechnet. Die Werte für das Momentum für den Zeitraum q werden in dem Datenfeld MtmBuffer[] zwischengespeichert. Da die Kennziffernvergabe des Kursdatenfeldes bei „0“ beginnt, fangen die aussagekräftigen Daten im Kursdatenfeld ebenfalls mit der Kennziffer „0“ an, und die aussagekräftigen Daten im Datenfeld MtmBuffer[] beginnen mit der Kennziffer (q-1).

Schritt 2. Die aussagekräftigen Daten in dem Datenfeld MtmBuffer[] werden geglättet (für den Glättungszeitraum r). Die Werte für das geglättete Momentum für den Zeitraum q werden in dem Datenfeld EMA_MtmBuffer[] zwischengespeichert. Während die Kennziffernvergabe des Datenfeldes MtmBuffer[] bei „0“ beginnt, fangen die aussagekräftigen Daten im Datenfeld MtmBuffer[] mit der Kennziffer (q-1) an, und die aussagekräftigen Daten im Datenfeld EMA_MtmBuffer[] beginnen mit der Kennziffer (q-1) + (r-1).

Die Schritte 3 und 4. Zu den vergleichbaren Erwägungen bezüglich der Festlegung, ab welchem Balken die aussagekräftigen Daten in den Datenfeldern DEMA_MtmBuffer[] (für den Glättungszeitraum s) und MainBuffer[] (Glättungszeitraum u) beginnen, siehe Abb. 1.7.

Abb. 1.7. Die aussagekräftigen Daten des Indikators Mtm (price,q,r,s,u)

Abb. 1.7. Die aussagekräftigen Daten des Indikators Mtm (price,q,r,s,u)


Auf globaler Ebene erfolgt die Deklarierung der Variablen:

//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes

Bei den Werten der Variablen handelt es sich um die Kennziffer des Balkens, ab dem die aussagekräftigen Daten in dem der jeweiligen Variablen entsprechenden Datenfeld des Indikators beginnen. Die Variablenwerte werden in der Funktion OnInit() der Ereignisverarbeitungsroutine Init berechnet und in der Funktion OnCalculate() der Ereignisverarbeitungsroutine Calculate verwendet.

//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);

Die Anzahl der anfänglichen Balken ohne Abbildung der grafischen Darstellung können ausschließlich mithilfe der Funktion PlotIndexSetInteger() festgelegt werden, und der Bezeichner für die Indikatoreigenschaft PLOT_DRAW_BEGIN in der Aufzählung ENUM_PLOT_PROPERTY_INTEGER.

Einstellungen: Die Kurzbezeichnung für den Indikator (11)
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

Der Code wird in der Funktion OnInit() der Ereignisverarbeitungsroutine Init() aufgezeichnet. Die Kurzbezeichnung für den Indikator kann ausschließlich mithilfe der Funktion IndicatorSetString() angegeben werden, der Bezeichner der Eigenschaft INDICATOR_SHORTNAME  des Indikators mithilfe der Aufzählung ENUM_CUSTOMIND_PROPERTY_STRING. Die Funktion PriceName() gibt die Bezeichnung der Art des Kurses in Abhängigkeit von dem Wert des Eingangsparameters AppliedPrice aus. Der Code der Funktion PriceName() findet sich in der Datei WilliamBlau.mqh (siehe Einleitung).

Eingangsparameter
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type

Weitere Informationen s. Eingangsvariablen. Die Eingangsparameter können in dem Fenster „Eigenschaften“ (unter der Registerkarte „Eingangsparameter“ des Indikators geändert werden.

1.4.1.2. Berechnung des Indikators Mtm (price,q,r,s,u):

Berechnung: Der Algorithmus

Der Algorithmus zur Berechnung des Indikators Mtm(price,q,r,s,u):

  1. Überprüfung, ob die Daten zur Berechnung des Indikators ausreichen;
  2. Berechnung des Kursdatenfeldes gemäß der angegebenen Kursart - Anlegen des Datenfeldes PriceBuffer[];
  3. Bestimmung der Kennziffer des Balkens, bei dem die Berechnung des Momentums für den Zeitraum q beginnt/fortgesetzt wird;
  4. Berechnung des Momentums für den Zeitraum q - Anlegen des Datenfeldes MtmBuffer[];
  5. Erste Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum r) - Anlegen des Datenfeldes EMA_MtmBuffer[];
  6. Zweite Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum s) - Anlegen des Datenfeldes DEMA_MtmBuffer[];
  7. Dritte Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum u) - Anlegen des Datenfeldes MainBuffer[] - Berechnung der Werte zur Wiedergabe der grafischen Darstellung #0.
Berechnung: Die Funktion OnCalculate()

Die Berechnung der Indikatorwerte erfolgt in der Funktion OnCalculate() der Ereignisverarbeitungsroutine Calculate. Wir nutzen die zweite Variante des Aufrufs von OnCalculate().

int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at the previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
//---
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }

Der Parameter rates_total  gibt die Anzahl der abgebildeten und dem Indikator zur Verarbeitung verfügbaren Balken des Kursdiagramms wieder. prev_calculated bezeichnet die Anzahl der Balken des Kursdiagramms, deren Verarbeitung durch den Indikator zum Zeitpunkt des Beginns des jeweils aktuellen Aufrufs der Funktion OnCalculate() bereits abgeschlossen war.

Die Funktion OnCalculate() liefert die Anzahl der zum Zeitpunkt des Endes ihres jeweiligen Aufrufs von dem Indikator verarbeiteten Balken des Kursdiagramms. Sie gibt den Parameter rates_total aus und muss so eingerichtet sein, dass bei ihrem ersten Aufruf alle bis dahin nicht verarbeiteten Balken des Kursdiagramms verarbeitete werden.

Das bedeutet, dass, wenn der Parameter prev_calculated beim ersten Aufruf der Funktion OnCalculate() gleich „0“ ist, er beim zweiten Aufruf entweder gleich „rates_total“ oder „rates_total +1“ ist, und dass die Funktion OnCalculate() ab ihrem zweiten Aufruf nur den letzten Balken verarbeitete (neu berechnet). Weitere Erläuterungen nebst Beispiel s. hier.

Die Indikatorpuffer und die Datenfelder Time[], Open[], High[], Low[], Close[], TickVolume[], Volume[] und Spread[] pflegen standardmäßig eine Kennziffernvergabe von links nach rechts, von Anfang des Datenfeldes bis zu seinem Ende, von den ältesten zu den aktuellsten Daten. Die Kennziffer des ersten Elements ist stets „0“. Die Größe des Indikatorpuffers wird von der Anwendungsinstanz auf dem Ausgabegerät (Terminal) so nachjustiert wird, dass sie stets der Anzahl der Balken entspricht, für die der Indikator berechnet wird.

Berechnung: Überprüfung, ob die Daten zur Berechnung des Indikators ausreichen (1)
//--- check rates
   if(rates_total<rates_total_min) return(0);

Die globale Variable rates_total_min gibt den Mindestumfang der Eingangszeitreihen des Indikators an; sie wird in der Funktion OnInit() der Ereignisverarbeitungsroutine Init berechnet.

   rates_total_min=begin4+1; // minimum size of the input timeseries of the indicator
Berechnung: Das Kursdatenfeld PriceBuffer[] (2)
//--- calculation of the prices array PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // size of the input timeseries
                        prev_calculated,     // bars, processed on the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // calculate the prices array
                       );

Zur Erstellung des Kursdatenfeldes PriceBuffer[] wird die Funktion CalculatePriceBuffer() verwendet. Der Code dieser Funktion findet sich in der Datei WilliamBlau.mqh (siehe Einleitung). Die Kursart wird in dem Eingangsparameter AppliedPrice angegeben.

Berechnung: Bestimmung der Kennziffer des Balkens, bei dem die Berechnung des Momentums für den Zeitraum q beginnt/fortgesetzt wird (3)

Bei der lokalen Variablen pos handelt es sich um die Kennziffer des Balkens, ab dem der Indikator bei dem jeweils aktuellen Aufruf der Funktion OnCalculate() berechnet wird. Wir vereinigen die Berechnung des Wertes der Variablen pos mit der Vorbereitung des Datenfeldes MtmBuffer[] zu einem Berechnungsvorgang (der Zurücksetzung der nicht aussagekräftigen Elemente des Datenfeldes MtmBuffer[] auf null).

Berechnung: Momentum für den Zeitraum q (4)
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];

Das Momentum für den Zeitraum q wird als die Differenz zwischen dem Kurs PriceBuffer[i] des aktuellen Zeitraums und dem Kurs (q-1) der vorhergehenden Zeiträume berechnet: PriceBuffer[i-(q-1)].

Berechnung: Glättung mithilfe der Methode EMA (5 - 7)

//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);

Zu der Funktion ExponentialMAOnBuffer() s. Einleitung. In dem Beispiel für die Berechnung des ersten EMA für den Zeitraum r füllt die Funktion ExponentialMAOnBuffer() das Ausgabedatenfeld EMA_MtmBuffer[] mit den Werten des ​​EMA (für den Zeitraum r) aus dem Eingangsdatenfeld MtmBuffer[]; wobei alle nicht aussagekräftigen Daten bis einschließlich der Kennziffer (begin1-1) jeweils mit dem Wert „0“ gefüllt werden.

 

1.4.2. "Blau_TSI.mq5" - Indikator TSI(price,q,r,s,u) - der Index der „wahren Stärke“

Der Programmcode des Indikators TSI(price,q,r,s,u) (erstellt auf der Grundlage der an dem Code Blau_Mtm.mq5 vorgenommenen Änderungen und Ergänzungen):

//+------------------------------------------------------------------+
//|                                                     Blau_TSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "True Strength Index (William Blau)"      // description
#include <WilliamBlau.mqh>               // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window      // indicator in a separate window
#property indicator_buffers 10           // number of buffers used
#property indicator_plots   1            // graphic plots
//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width
//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "TSI"        // label for graphic plot #0
#property indicator_type1   DRAW_LINE    // draw as a line
#property indicator_color1  Blue         // line color
#property indicator_style1  STYLE_SOLID  // line style
#property indicator_width1  1            // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // TSI (graphic plot #0)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period 1st EMA
double DEMA_MtmBuffer[];    // s-period 2nd EMA
double TEMA_MtmBuffer[];    // u-period 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4; // starting index
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"TSI");             // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // draw as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"
//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum
*/
//---
   begin1=q-1;        //                             - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_...[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_...[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - TEMA_...[], MainBuffer[]
   //
   rates_total_min=begin4+1; // rates total min
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous tick
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price buffer
                       );
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Wir sehen uns lediglich die an dem Programmcode Blau_Mtm.mq5 vorgenommenen Änderungen und Ergänzungen etwas genauer an.

1.4.2.1. Einstellungen des Indikators TSI(price,q,r s,u) (an dem Programmcode Blau_Mtm.mq5 vorgenommene Änderungen und Ergänzungen)

Indikatoreinstellungen (global)

Die Einstellungen des Indikators TSI(price,q,r,s,u) unterscheiden sich von denen des Indikators Mtm(price,q,r,s,u) (s. Abb. 1.8):

  1. Angabe des Fensters für die Wiedergabe des Indikators (unverändert);
  2. Angabe der Anzahl der grafischen Darstellungen (unverändert);
  3. Angabe der Anzahl der Indikatorpuffer (die Anzahl der Zwischenspeicher wurde heraufgesetzt);
  4. Deklarieren der Indikatordatenfelder (es wurden Datenfelder hinzugefügt);
  5. Herstellen der Verbindung: Indikatordatenfeld -> Indikatorpuffer -> grafische Darstellung (Neuanordnung);
  6. Beschreibung der Eigenschaften jeder einzelnen grafischen Darstellung (geändertes Symbol);
  7. Angabe der Genauigkeit der Darstellung der Indikatorwerte ​​(geänderte Genauigkeit);
  8. Zu jeder grafischen Darstellung Angabe der Anzahl der anfänglichen Balken ohne Wiedergabe der jeweiligen grafischen Darstellung (unverändert);
  9. Festlegen der waagerechten Grenzen und Beschreiben ihrer Eigenschaften (neu);
  10. Festlegen der Skalierungsgrenzen für das separate Indikatorfenster (neu);
  11. Angabe der Kurzbezeichnung für den Indikator (geänderte Bezeichnung).

Abb. 1.8. Einstellungen für den Indikator TSI(price,q,r,s,u)

Abb. 1.8. Einstellungen für den Indikator TSI(price,q,r,s,u)


Einstellungen (Änderungen)

An dem Programmcode Blau_Mtm.mq5 wurden die folgenden unbedeutenden Änderungen vorgenommen.

1. Die Kurzbeschreibung des MQL5-Programms wurde geändert:

#property description "True Strength Index (William Blau)"      // description

2. (zu Einstellung 6) Die Anzahl der grafischen Darstellungen wurde nicht heraufgesetzt; die Art der Abbildung (DRAW_LINE - Linie), die Linienfarbe (Blue), die Linienart (STYLE_SOLID - Volllinie) sowie die Linienstärke (1) sind unverändert; geändert wurde das Symbol für die grafische Darstellung #0:

#property indicator_label1  "TSI"        // label for graphic plot #0

3. (zu Einstellung 7) Die Genauigkeit der Darstellung der Indikatorwerte wurde geändert:

   IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (zu Einstellung 11) Die Kurzbezeichnung für den Indikator wurde geändert:

   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
Einstellungen: Waagerechte Grenzen (9)

Bei der Einrichtung der waagerechten Grenzen sind zu jeder von ihnen anzugeben:

  1. der Wert der senkrechten Achse;
  2. eine Beschreibung der Grenze (nicht zwingend erforderlich). Die waagerechten Grenzen werden einheitlich abgebildet:
    1. Farbe zur Ausgabe der Linie; 
    2. Linienart (mögliche Arten s. die Aufzählung ENUM_LINE_STYLE);
    3. Linienstärke.

Es bestehen zwei Möglichkeiten, die Einstellungen vorzunehmen:

1) Mittels der Präprozessoranweisung #property (wie hier umgesetzt).

//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width

2) Mithilfe der Einstellungsfunktionen der Gruppe IndicatorSet *():

//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"

Der Code wird in der Funktion OnInit() der Ereignisverarbeitungsroutine Init() aufgezeichnet. Die Vergabe der Kennziffern für die waagerechten Grenzen beginnt bei „0“. Für eine exaktere Wiedergabe der waagrechten Grenze werden die in der Aufzählung ENUM_CUSTOMIND_PROPERTY aufgeführten Bezeichner der Indikatoreigenschaften INDICATOR_LEVEL* verwendet.

Die Beschreibung der einzelnen Grenzen kann ausschließlich mithilfe der Funktion IndicatorSetString() angegeben werden, der Bezeichner der Indikatoreigenschaft INDICATOR_LEVELTEXT dagegen anhand der Aufzählung ENUM_CUSTOMIND_PROPERTY_STRING. Die Beschreibung der Grenze wird auf der linken Seite direkt über ihr platziert. 

Im „Eigenschaften“-Fenster des Indikators können (unter der Registerkarte „Grenzen“) waagerechte Grenzen hinzugefügt/gelöscht sowie ihr Wert, ihre Beschreibung und die Art ihrer Abbildung geändert werden.

Einstellungen: Skalierungsgrenzen für das separate Indikatorfenster (10)

Es bestehen zwei Möglichkeiten, die Einstellungen vorzunehmen:

1) Mittels der Präprozessoranweisung #property (wie hier umgesetzt).

//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum

2) Mithilfe der Funktion IndicatorSetDouble(), die Bezeichner für die Indikatoreigenschaften INDICATOR_MINIMUM und INDICATOR_MAXIMUM  dagegen anhand der Aufzählung ENUM_CUSTOMIND_PROPERTY_DOUBLE.

//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum

Der Code wird in der Funktion OnInit() der Ereignisverarbeitungsroutine Init() aufgezeichnet. Die Ober- und Untergrenze für den Maßstab des separaten Indikatorfensters können in dem „Eigenschaften“-Fenster des Indikators (unter der Registerkarte „Maßstab“) geändert werden.

Einstellungen (Änderungen): Die Indikatorpuffer (3 - 5)

Änderungen der Einstellung „Indikatordatenfeld -> Indikatorpuffer -> grafische Darstellung“:

1. (zu Einstellung 3) die Anzahl der Zwischenspeicher (Puffer) wurde heraufgesetzt:

#property indicator_buffers 10           // the number of buffers for the calculation of the indicator

2. (zu Einstellung 4) zur Berechnung des absoluten Wertes für das Momentum für den Zeitraum q erforderliche Indikatordatenfelder wurden hinzugefügt:

double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)

der Einsatzzweck des Datenfeldes MainBuffer[] wurde geändert:

double MainBuffer[];        // TSI (graphic plot #0)
double TEMA_MtmBuffer[];    // u-period 3rd EMA

3. (zu Einstellung 5) Die Verknüpfung „Indikatordatenfeld -> Indikatorpuffer -> grafische Darstellung“ wurde geändert:

   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

1.4.2.2. Berechnung des Indikators TSI(price,q,r s,u) (an dem Programmcode Blau_Mtm.mq5 vorgenommene Änderungen und Ergänzungen)

Berechnung: Der Algorithmus

Der Algorithmus zur Berechnung des Indikators TSI(price,q,r,s,u):

  1. Überprüfung, ob die Daten zur Berechnung des Indikators ausreichen;
  2. Berechnung des Kursdatenfeldes gemäß der angegebenen Kursart - Anlegen des Datenfeldes PriceBuffer[];
  3. Bestimmung der Kennziffer des Balkens, bei dem die Berechnung des Momentums für den Zeitraum q beginnt/fortgesetzt wird;
  4. Berechnung des Momentums für den Zeitraum q sowie seines absoluten Wertes - Anlegen der Datenfelder MtmBuffer[] und AbsMtmBuffer[];
  5. Erste Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum r) - Anlegen der Datenfelder EMA_MtmBuffer[] und EMA_AbsMtmBuffer[];
  6. Zweite Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum s) - Anlegen der Datenfelder DEMA_MtmBuffer[] und DEMA_AbsMtmBuffer[];
  7. Dritte Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum u) - Anlegen der Datenfelder TEMA_MtmBuffer[] und TEMA_AbsMtmBuffer[];
  8. Bestimmung der Kennziffer des Balkens, bei dem die Berechnung des Index der wahren Stärke beginnt/fortgesetzt wird;
  9. Berechnung des Index der wahren Stärke - Anlegen des Datenfeldes MainBuffer[] - Berechnung der Werte zur Wiedergabe der grafischen Darstellung #0.

Die wesentlichen an dem Algorithmus vorgenommenen Änderungen (in aller Kürze):

  • a) (s. Punkt 4 - 7) parallel zur Berechnung des Momentums für den Zeitraum q (Datenfeldgruppe *MtmtBuffer[]) erfolgt die Berechnung seines absoluten Wertes (Datenfeldgruppe *AbsMtmBuffer[];
  • b) (s. Punkt 8 - 9) die Berechnung des TSI wurde hinzugefügt.
Berechnung: der Indikator Momentum für den Zeitraum q und sein absoluter Wert (3 - 7)
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);

Berechnung: der Index der „wahren Stärke“ (8 - 9)

//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }

1.4.3. "Blau_Ergodic.mq5" - der Indikator Ergodic(price,q,r,s,u,ul) - Ergodischer Oszillator

Der Programmcode des Indikators Ergodic(price,q,r,s,u,ul) (erstellt auf der Grundlage der an dem Code Blau_TSI.mq5 vorgenommenen Änderungen und Ergänzungen):

//+------------------------------------------------------------------+
//|                                                 Blau_Ergodic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "Ergodic Oscillator (William Blau)"       // description
#include <WilliamBlau.mqh>                 // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window        // indicator in a separate window
#property indicator_buffers 11             // number of buffers
#property indicator_plots   2              // indicator plots
//--- horizontal levels
#property indicator_level1 -25             // level #0
#property indicator_level2 25              // level #1
#property indicator_levelcolor Silver      // level color
#property indicator_levelstyle STYLE_DOT   // level style
#property indicator_levelwidth 1           // level width
//--- min/max
#property indicator_minimum -100           // minimum
#property indicator_maximum 100            // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width
//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input int    ul=3; // ul- period of a Signal Line
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // Ergodic (graphic plot #0)
double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period of the 1st EMA
double DEMA_MtmBuffer[];    // s-period of the 2nd EMA
double TEMA_MtmBuffer[];    // u-period of the 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period of the 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period of the 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period of the 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4, begin5; // starting indexes
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Ergodic");           // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); // draw as a histogram
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Silver);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);             // line width
//--- graphic plot #1 (Signal Line)
   PlotIndexSetString(1,PLOT_LABEL,"Signal");            // label of graphic plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);      // draw as a line
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Red);           // line color
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);             // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of indicator levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level #0 "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level #1 "Overbought"
//--- min/max values
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // min
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // max
*/
//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- rates total
   if(rates_total<rates_total_min) return(0);
//--- calculation of PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price array
                       );
//--- calculation of mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period of the 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period of 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- calculation of Ergodic (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // starting from begin4
      for(i=0;i<pos;i++)       // pos
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Wir sehen uns lediglich die an dem Programmcode Blau_TSI.mq5 vorgenommenen Änderungen und Ergänzungen etwas genauer an.

1.4.3.1. Einstellungen des Indikators Ergodic(price,q,r s,u) (an dem Programmcode Blau_TSI.mq5 vorgenommene Änderungen und Ergänzungen)

Indikatoreinstellungen (global)

Die Einstellungen des Indikators Ergodic(price,q,r,s,u) unterscheiden sich von denen des Indikators TSI(price,q,r,s,u) (s. Abb. 1.9):

  1. Angabe des Fensters für die Wiedergabe des Indikators (unverändert);
  2. Angabe der Anzahl der grafischen Darstellungen (eine grafische Darstellung wurde hinzugefügt);
  3. Angabe der Anzahl der Indikatorpuffer (die Anzahl der Zwischenspeicher wurde heraufgesetzt);
  4. Deklarieren der Indikatordatenfelder (ein Datenfeld wurde hinzugefügt);
  5. Herstellen der Verknüpfung: Indikatordatenfeld -> Indikatorpuffer -> grafische Darstellung (Neuanordnung);
  6. Beschreibung der Eigenschaften aller grafischen Darstellungen (es wurden Eigenschaften geändert und eine grafische Darstellung wurde hinzugefügt);
  7. Angabe der Abbildungsgenauigkeit der Indikatorwerte (unverändert);
  8. Zu jeder grafischen Darstellung Angabe der Anzahl der anfänglichen Balken ohne Wiedergabe der jeweiligen grafischen Darstellung (eine grafische Darstellung wurde hinzugefügt);
  9. Festlegen der waagerechten Grenzen und Beschreiben ihrer Eigenschaften (unverändert);
  10. Festlegen der Skalierungsgrenzen für das separate Indikatorfenster (unverändert);
  11. Angabe der Kurzbezeichnung für den Indikator (geänderte Bezeichnung).

Abb. 1.9. Einstellungen für den Indikator Ergodic(price,q,r,s,u,ul)

Abb. 1.9. Einstellungen für den Indikator Ergodic(price,q,r,s,u,ul)


Einstellungen (Änderungen)

Der Programmcode Blau_TSI.mq5 wurde wie folgt geändert.

1. Die Kurzbeschreibung des MQL5-Programms wurde geändert:

#property description "Ergodic Oscillator (William Blau)"       // description

2. Ein Eingangsparameter wurde hinzugefügt

input int    ul=3; // ul- period of a Signal Line

3. (zu Einstellung 11) Die Kurzbezeichnung für den Indikator wurde geändert:

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
Einstellungen (Änderungen): Grafische Darstellungen (2, 6)

1. (zu Einstellung 2) Eine weitere grafische Darstellung (die Signallinie) wurde hinzugefügt:

#property indicator_plots   2              // indicator plots

2. (zu Einstellung 6) a) Die Eigenschaften der ersten grafischen Darstellung #0 "Ergodic“ wurden geändert.

Zuvor wurde zur Anzeige eine Linie (mit dem Bezeichner DRAW_LINE) verwendet, jetzt dagegen wurde für die Wiedergabe ein von der Nulllinie ausgehendes Histogramm (mit dem Bezeichner DRAW_HISTOGRAM in der Aufzählung ENUM_DRAW_TYPE) gewählt.

Die Ausgabefarbe und die Stärke der Linien wurden geändert:

//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width

b) Hinzugefügt wurde die grafische Darstellung #1 "Signal" (Signallinie):

//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
Einstellungen (Änderungen): Die Indikatorpuffer (3 - 5)

Änderungen der Einstellung „Indikatordatenfeld -> Indikatorpuffer -> grafische Darstellung“:

1. (zu Einstellung 3) die Anzahl der Puffer wurde heraufgesetzt:

#property indicator_buffers 11             // number of buffers

2. (zu Einstellung 4) Hinzugefügt wurde ein für die Berechnung und Abbildung der Werte der Signallinie unerlässliches Datenfeld:

double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)

3. (zu Einstellung 5) Die Verknüpfung „Indikatordatenfeld -> Indikatorpuffer -> grafische Darstellung“ wurde geändert:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
Einstellungen: Anzahl der anfänglichen Balken ohne Abbildung (8)
  • Die Anzahl der anfänglichen Balken ohne Wiedergabe der grafischen Darstellung #0 "Ergodic" ist unverändert. Die Berechnung wird in Abschnitt 1.4.1.1. vorgestellt.
  • Die Verfahren zur Berechnung der Anzahl der anfänglichen Balken ohne Wiedergabe der grafischen Darstellung #1 "Signal" sind ähnlich. Das Datenfeld SignalBuffer[] resultiert aus der Glättung der aussagekräftigen Daten des Datenfeldes MainBuffer[] (mit dem Glättungszeitraum ul).

Während die Kennziffernvergabe des Datenfeldes MainBuffer[] bei „0“ beginnt, fangen die aussagekräftigen Daten im Datenfeld MainBuffer[] mit der Kennziffer (q-1)+(r-1)+(s-1)+(u-1) an, und die aussagekräftigen Daten im Datenfeld SignalBuffer[] beginnen mit der Kennziffer (q-1)+(r-1)+(s-1)+(u-1)+(ul-1).

Es wird die globale Variable begin5  deklariert:

int    begin1, begin2, begin3, begin4, begin5; // starting indexes

Die Berechnung (vollständig, zu mehr s. Abschnitt 1.4.1.1):

//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);

1.4.3.2. Berechnung des Indikators Ergodic(price,q,r s,u,ul) (an dem Programmcode Blau_TSI.mq5 vorgenommene Änderungen und Ergänzungen)

Berechnung: Der Algorithmus

Der Algorithmus zur Berechnung des Indikators Ergodic(price,q,r,s,ul):

  1. Überprüfung, ob die Daten zur Berechnung des Indikators ausreichen;
  2. Berechnung des Kursdatenfeldes gemäß der angegebenen Kursart - Anlegen des Datenfeldes PriceBuffer[];
  3. Bestimmung der Kennziffer des Balkens, bei dem die Berechnung des Momentums für den Zeitraum q beginnt/fortgesetzt wird;
  4. Berechnung des Momentums für den Zeitraum q sowie seines absoluten Wertes - Anlegen der Datenfelder MtmBuffer[] und AbsMtmBuffer[];
  5. Erste Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum r) - Anlegen der Datenfelder EMA_MtmBuffer[] und EMA_AbsMtmBuffer[];
  6. Zweite Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum s) - Anlegen der Datenfelder DEMA_MtmBuffer[] und DEMA_AbsMtmBuffer[];
  7. Dritte Glättung mithilfe der Methode EMA (mit dem Glättungszeitraum u) - Anlegen der Datenfelder TEMA_MtmBuffer[] und TEMA_AbsMtmBuffer[];
  8. Bestimmung der Kennziffer des Balkens, bei dem die Berechnung des Index der wahren Stärke beginnt/fortgesetzt wird;
  9. Berechnung des ergodischen Indikators (Index der wahren Stärke) - Anlegen des Datenfeldes MainBuffer[] - Berechnung der Werte zur Wiedergabe der grafischen Darstellung #0.
  10. Berechnung der Signallinie - Glättung des ergodischen Indikators mithilfe der Methode EMA (mit dem Glättungszeitraum ul) - Anlegen des Datenfeldes SignalBuffer[] - Berechnung der Werte zur Wiedergabe der grafischen Darstellung #1.

Die wesentlichen Änderungen an dem Algorithmus (in aller Kürze) a) (s. Punkt 1) die Vorgabe für den Mindestumfang der Eingangszeitreihen des Indikators wurde geändert; b) (s. Punkt 10) die Berechnung der Signallinie wurde hinzugefügt.

Berechnung (Änderung): Überprüfung, ob die Daten zur Berechnung des Indikators ausreichen (1)

An dem Algorithmus wurde nichts geändert:

//--- rates total
   if(rates_total<rates_total_min) return(0);

Der Wert der globalen Variablen rates_total_min (der in der Funktion OnInit() der Ereignisverarbeitungsroutine Init berechnete Mindestumfang der Eingangszeitreihen des Indikators) wurde geändert:

   rates_total_min=begin5+1; // the minimum size of the input timeseries of the indicator
Berechnung: Die Signallinie (10)
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);

2. Das stochastische Momentum

Die betrachteten Indikatoren (s. Anhang) sind in zwei Gruppen unterteilt:

I. Auf dem Stochastik-Indikator beruhende Indikatoren:

  1. Blau_TStoch.mq5 - Stochastik (Stochastik-Indikator für den Zeitraum q; geglätteter Stochastik-Indikator für den Zeitraum q);
  2. Blau_TStochI.mq5 - Stochastischer Index (normalisierter geglätteter Stochastik-Indikator für den Zeitraum q);
  3. Blau_TS_Stochastic.mq5 - Stochastischer TS-Oszillator (auf der Grundlage des stochastischen Index).

II. Auf dem stochastischen Momentum beruhende Indikatoren:

  1. Blau_SM.mq5 - Indikator der stochastischen Geschwindigkeit (Stochastisches Momentum für den Zeitraum q; geglättetes stochastisches Momentum für den Zeitraum q);
  2. Blau_SMI.mq5 - Index der stochastischen Geschwindigkeit (normalisiertes geglättetes stochastisches Momentum für den Zeitraum q);
  3. Blau_SM_Stochastic.mq5 - Stochastischer SM-Oszillator (auf der Grundlage des Index der stochastischen Geschwindigkeit).

2.1. Auf der Stochastik beruhende Indikatoren

Das Benutzerhandbuch für die MetaTrader-Anwendung auf einem Ausgabegerät (Terminal) bietet in Abschnitt „Analyse/Technische Indikatoren/Oszillatoren/Stochastik-Oszillator“ eine Darstellung des in die MetaTrader 5-Instanz für Ausgabegeräte integrierten technischen Indikators Stochastik-Oszillator und seiner Verwendung in der technischen Analyse (s. auch iStochastic.)

 

2.1.1. Der Stochastik-Oszillator von George C. Lane

Stochastik, stochastischer Oszillator (Stochastic, Stochastic Oscillator) ist ein Indikator, der die Lage des Kurses in Bezug auf den Bereich der Kursschwankungen für die zurückliegenden q Zeiträume angibt. Verfasser und Verbreiter der „Stochastik“ ist George C. Lane.

Man unterscheidet:

  • die schnelle Stochastik, manchmal als %K bezeichnet; und
  • die langsame Stochastik (Signallinie), oder %D.

Die Stochastikformel desGeorge C. Lane:

           price - LL(q)
%K = 100 * -------------
           HH(q) - LL(q)
%D = SMA(%k, ul)

mit:

  • % K - schnelle Stochastik;
  • % D - langsame Stochastik (Signallinie);
  • price - Kurs bei [Schließung] des aktuellen Zeitraums;
  • q - Anzahl der an der Berechnung der Stochastik beteiligten Zeiträume (Balken) des Kursdiagramms;
  • HH(q) - Höchster Wert des Kurses in den q vorausgehenden Zeiträumen als Obergrenze für den Zeitraum q;
  • LL(q) - Niedrigster Wert des Kurses in den q vorausgehenden Zeiträumen als Untergrenze für den Zeitraum q;
  • SMA (% K, ul) - der einfache gleitende Durchschnittswert der Ordnung ul, angewendet auf die schnelle Stochastik (% K).

Nach Ansicht von George C. Lane besteht der Grundgedanke darin, dass bei einem tendenziellen Kursanstieg (Aufwärtstrend) der Kurs dazu neigt, in der Nähe den vorhergehenden Höchstwerte stehen zu bleiben. Bei einem tendenziellen Kursrückgang (Abwärtstrend) neigt er zum Verharren in der Nähe der vorherigen Tiefststände.

 

2.1.2. Der Stochastik-Oszillator von William Blau


Abb. 2.1. Auf dem stochastischen Oszillator beruhende Indikatoren William Blaus

Abb. 2.1. Auf dem stochastischen Oszillator beruhende Indikatoren William Blaus

 

2.1.2.1. Die Stochastik


Unter Stochastik verstehen wir den Abstand des [Schluss-] Kurses des aktuellen Zeitraums zu dem niedrigsten Punkt der Kursschwankungen der zurückliegenden q Zeiträume. Der Wert des Stochastik-Indikators gibt an, wie stark der Kurs gegenüber dem niedrigsten Punkt der Kursschwankungen in dem Zeitraum q versetzt ist. Die Stochastik-Werte in dem Zeitraum q sind entweder positiv oder gleich null.

Abb. 2.2. Die Bestimmung der Stochastik

Abb. 2.2. Die Bestimmung der Stochastik

Die Formel für die Stochastik für den Zeitraum q:

stoch(price,q) = price - LL(q)

mit:

  • price - Kurs bei [Schließung] des aktuellen Zeitraums;
  • q - Anzahl der an der Berechnung der Stochastik beteiligten Zeiträume (Balken) des Kursdiagramms;
  • LL(q) - Niedrigster Wert des Kurses in den q vorausgehenden Zeiträumen als Untergrenze für den Zeitraum q;

Die Formel für die geglättete Stochastik für den Zeitraum q:

TStoch(price,q,r,s,u) = EMA(EMA(EMA( stoch(price,q) ,r),s),u)

mit:

  • price - Kurs bei [Schließung] - Kursbasis des Kursdiagramms;
  • q - Anzahl der in die Berechnung der Stochastik einbezogenen Zeiträume (Balken) des Kursdiagramms;
  • stoch(price,q)=price-LL(q) - Stochastik für den Zeitraum q;
  • EMA(stoch(price,q),r) - erste Glättung - EMA für den Zeitraum r, angewendet auf die Stochastik für den Zeitraum q;
  • EMA(EMA(..., r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA(EMA(EMA(..., r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

TStoch(price,q,r,s,u) - Stochastik. Beschreibung

  • Dateiname: Blau_TStoch.mq5
  • Bezeichnung: Stochastik-Indikator (Stochastik für den Zeitraum q; geglättete Stochastik für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den die Stochastik berechnet wird (Voreinstellung: q = 5);
    • r - Zeitraum des ersten EMA, angewendet auf die Stochastik (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

2.1.2.2. Der stochastische Index

Der stochastische Index ist die normalisierte geglättete Stochastik für den Zeitraum q);

Die Werte der geglätteten Stochastik für den Zeitraum q werden in das Prozentformat übertragen (mit dem Abbildungsintervall [0, 100]). Jeder Wert der geglätteten Stochastik für den Zeitraum q wird mit dem Wert des Kursschwankungsbereichs für den Zeitraum q normalisiert. Die Normalisierung ermöglicht die Interpretation des Wertes der geglätteten Stochastik für den Zeitraum q als Grenze für den Überkauf / Überverkauf des Marktes.

Die Formel für den stochastischen Index:

                         100 * EMA(EMA(EMA( price-LL(q) ,r),s),u)       100 * TStoch(price,q,r,s,u)
TStochI(price,q,r,s,u) = ---------------------------------------- = ----------------------------------
                            EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)      EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then TStochI(price,q,r,s,u)=0

mit:

  • price - Kurs bei [Schließung] - Kursbasis des Kursdiagramms;
  • q - Anzahl der in die Berechnung der Stochastik einbezogenen Zeiträume (Balken) des Kursdiagramms;
  • LL(q) - Niedrigster Wert des Kurses in den q vorausgehenden Zeiträumen als Untergrenze für den Zeitraum q;
  • HH(q) - Höchster Wert des Kurses in den q vorausgehenden Zeiträumen als Obergrenze für den Zeitraum q;
  • stoch(q)=price-LL(q) - Stochastik für den Zeitraum q;
  • TStoch(price,q,r,s,u) - dreifach geglättete Stochastik für den Zeitraum q;
  • HH(q)-LL(q) - Kursschwankungsspanne für den Zeitraum q;
  • EMA(...,r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf:
    1. die Stochastik für den Zeitraum q;
    2. die Kursschwankungsspanne für den Zeitraum q;
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA(EMA(EMA(...,r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

TStochI(price,q,r,s,u) - Stochastischer Index. Beschreibung

  • Dateiname: Blau_TStochI.mq5
  • Bezeichnung: Stochastik-Index (normalisierte geglättete Stochastik für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den die Stochastik berechnet wird (Voreinstellung: q = 5);
    • r - Zeitraum des ersten EMA, angewendet auf die Stochastik (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Darstellung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“);
    • (nicht obligatorisch) zwei Grenzen (voreingestellt auf 40 bzw. 60) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf 0) und der oberen (voreingestellt auf 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

2.1.2.3. Der stochastische Oszillator

Definition des stochastischen Oszillators:

TS_Stochastic(price,q,r,s,u) = TStochI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( TS_Stochastic(price,q,r,s,u) ,ul)

mit:

  • TS_Stochastic() - schnelle Stochastik, %k - stochastischer Index TStochI(price,q,r,s,u);
  • SignalLine() - langsame Stochastik (Signallinie),% d - EMA für den Zeitraum ul, angewendet auf die schnelle Stochastik (% k);
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden Wertes (>1) des exponentiellen gleitenden Durchschnitts der schnellen Stochastik sein.

TS_Stochastic(price,q,r,s,u,ul) - Stochastischer Oszillator. Beschreibung

  • Dateiname: Blau_TS_Stochastic.mq5
  • Bezeichnung: Stochastischer Oszillator (auf der Grundlage des stochastischen Index) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - schnelle Stochastik (stochastischer Index),% k:
      • q - Zeitraum, für den die Stochastik berechnet wird (Voreinstellung: q = 5);
      • r - Zeitraum des ersten EMA, angewendet auf die Stochastik (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • grafische Darstellung #1 - langsame Stochastik (Signallinie):
      • ul - EMA-Zeitraum der Signallinie, angewendet auf die schnelle Stochastik (Voreinstellung: ul = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • zwei Grenzen (voreingestellt auf 40 bzw. 60) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf 0) und der oberen (voreingestellt auf 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung
    • ul>0. Ist ul = 1, stimmt die langsame Stochastik (Signallinie) mit der der schnellen Stochastik überein;
    • der Mindestumfang des Kursdatenfeldes ist gleich = (q-1 + r + s + u + ul-4 +1).

 

2.1.2.4. Aufeinanderfolge (Kontinuität)


Der stochastische Oszillator von William Blau beinhaltet den von George Lane. Damit der TS_Stochastic (William Blau) dem in MetaTrader 5 umgesetzten stochastischen Oszillator (George Lane) entspricht, ist Folgendes anzugeben:

TS_Stochastic( price=Close, q=KPeriod, r=1, s=1, u=1, ul=DPeriod )
Stochastic( KPeriod=q, DPeriod=ul, Slowing=1, price="Low/High", method="Exponential" )

Abb. 2.3. Der stochastische Oszillator von William Blau beinhaltet den stochastischen Oszillator von George Lane

Abb. 2.3. Der stochastische Oszillator von William Blau beinhaltet den stochastischen Oszillator von George Lane

 

2.1.2.5. Der Programmcode des stochastischen Oszillators


Am Beispiel des Indikators TS_Stochastic(price,q,r,s,u,ul) sehen wir:

1) Die Verbindung zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // fast Stochastic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // slow Stochastic: ul-period EMA of the fast Stochastic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);         // min value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);         // max value (q bars)
   SetIndexBuffer(5,StochBuffer,INDICATOR_CALCULATIONS);      // q-period Stochastic
   SetIndexBuffer(6,EMA_StochBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_StochBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA
   SetIndexBuffer(9,HHLLBuffer,INDICATOR_CALCULATIONS);       // q-period price range
   SetIndexBuffer(10,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (price range)
   SetIndexBuffer(11,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (price range)
   SetIndexBuffer(12,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (price range)

2) Den Algorithmus zur Berechnung der Stochastik sowie der Kursspanne jeweils für den Zeitraum q:

   // calculation of StochBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // LLBuffer[] - search for the minimal price (q bars)
      // HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // StochBuffer[] - q-period Stochastic
      StochBuffer[i]=PriceBuffer[i]-LLBuffer[i];
      // HHLLBuffer[] - q-period price range
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }

2.2. Auf dem stochastischen Momentum beruhende Indikatoren

Abb. 2.4. Auf dem stochastischen Momentum beruhende Indikatoren William Blaus

Abb. 2.4. Auf dem stochastischen Momentum beruhende Indikatoren William Blaus

 

2.2.1. Das stochastische Momentum

Das stochastische Momentum (Stochastic Momentum, SM) beschreibt den Abstand zwischen dem [Schluss-] Kurs des aktuellen Zeitraums und der Mitte des Bereichs der Kursschwankungen der dem Zeitraum q vorhergehenden Zeiträume. Der Wert des stochastischen Momentums gibt an, wie stark sich der Kurs in Bezug auf die Mitte des Bereichs der Kursschwankungen im Zeitraum q verschoben hat.

Das Symbol des stochastischen Momentums für den Zeitraum q gibt die Position des Kurses in Bezug auf die Mitte des Bereichs der Kursschwankungen im Zeitraum q an: ein positives stochastisches Momentum bedeutet, dass der Kurs über dem Mittelpunkt liegt; ein negatives, dass er sich darunter befindet.

Abb. 2.5. Bestimmung des stochastischen Momentums

Abb. 2.5. Bestimmung des stochastischen Momentums

Die Formel für das stochastische Momentum für den Zeitraum q:

sm(price,q) = price - 1/2 * [LL(q) + HH(q)]

mit:

  • price - Kurs bei [Schließung] des aktuellen Zeitraums;
  • q - Anzahl der in die Berechnung des stochastischen Momentums einbezogenen Zeiträume des Kursdiagramms;
  • LL(q) - Niedrigster Wert des Kurses in den q vorausgehenden Zeiträumen als Untergrenze für den Zeitraum q;
  • HH(q) - Höchster Wert des Kurses in den q vorausgehenden Zeiträumen als Obergrenze für den Zeitraum q;
  • 1/2* [LL(q)+HH(q)] - Mitte des Bereichs der Kursschwankungen im Zeitraum q.

Die Formel für das geglättete stochastische Momentum für den Zeitraum q:

SM(price,q,r,s,u) = EMA(EMA(EMA( sm(price,q) ,r),s),u)

mit:

  • price - Kurs bei [Schließung] - Kursbasis des Kursdiagramms;
  • q - Anzahl der in die Berechnung des stochastischen Momentums einbezogenen Zeiträume des Kursdiagramms;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - stochastisches Momentum für den Zeitraum q;
  • EMA(sm(price,q),r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf das stochastische Momentum für den Zeitraum q;
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA(EMA(EMA(...,r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

2.2.1.2. SM(price,q,r,s,u) - Indikator der stochastischen Geschwindigkeit (Stochastisches Momentum). Beschreibung

  • Dateiname: Blau_SM.mq5
  • Bezeichnung: Indikator der stochastischen Geschwindigkeit (Stochastisches Momentum für den Zeitraum q; geglättetes stochastisches Momentum für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das stochastische Momentum berechnet wird (Voreinstellung: q = 5);
    • r - Zeitraum des ersten EMA, angewendet auf das stochastische Momentum (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

2.2.2. Index der stochastischen Geschwindigkeit

Der Index der stochastischen Geschwindigkeit (Stochastic Momentum Index, SMI) ist ein Indikator für die normalisierte stochastische Geschwindigkeit (das normalisierte geglättete stochastische Momentum für den Zeitraum q). Die Werte des geglätteten stochastischen Momentums für den Zeitraum q werden in das Prozentformat übertragen (mit dem Abbildungsintervall [-100, 100]).

Jeder Wert des geglätteten stochastischen Momentums für den Zeitraum q wird mit dem Wert des Kursschwankungsbereichs für den Zeitraum q normalisiert. Die Normalisierung ermöglicht die Interpretation der Werte des SMI als Grenzen für den Überkauf (positiver Wert) oder den Überverkauf (negativer Wert) des Marktes.

Die Formel für den Index der stochastischen Geschwindigkeit:

                     100 * EMA(EMA(EMA( price-1/2*[LL(q)+HH(q)] ,r),s),u)           100 * SM(price,q,r,s,u)
SMI(price,q,r,s,u) = ---------------------------------------------------- = ----------------------------------------
                           EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)         EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)
if EMA(EMA(EMA(1/2*[HH(q)-LL(q)],r),s),u)=0, then SMI(price,q,r,s,u)=0

mit:

  • price - Kurs bei [Schließung] - Kursbasis des Kursdiagramms;
  • LL(q) - Niedrigster Wert des Kurses in den q vorausgehenden Zeiträumen als Untergrenze für den Zeitraum q;
  • HH(q) - Höchster Wert des Kurses in den q vorausgehenden Zeiträumen als Obergrenze für den Zeitraum q;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - stochastisches Momentum für den Zeitraum q;
  • SM(price,q,r,s,u) - dreifach geglättetes stochastisches Momentum für den Zeitraum q;
  • HH(q)-LL(q) - Kursschwankungsspanne für den Zeitraum q;
  • 1/2* [LL(q)+HH(q)] - Mitte des Bereichs der Kursschwankungen im Zeitraum q.
  • 1/2* [HH(q)-LL(q)] - Hälfte des Bereichs der Kursschwankungen im Zeitraum q.
  • EMA(...,r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf:
    1) das stochastische Momentum für den Zeitraum q
    2) die Hälfte des Bereichs der Kursschwankungen im Zeitraum q;
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA(EMA(EMA(...,r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

2.2.2.2. SMI(price,q,r,s,u) - Index der stochastischen Geschwindigkeit (Stochastic Momentum Index). Beschreibung

  • Dateiname: Blau_SMI.mq5
  • Bezeichnung: Index der stochastischen Geschwindigkeit (normalisiertes geglättetes stochastisches Momentum für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das stochastische Momentum berechnet wird (Voreinstellung: q = 5);
    • r - Zeitraum des ersten EMA, angewendet auf das stochastische Momentum (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • (nicht obligatorisch) zwei Grenzen (voreingestellt auf -40 bzw. +40) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

2.2.3. Der stochastische Oszillator

Definition des stochastischen Oszillators:
SM_Stochastic(price,q,r,s,u) = SMI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( SM_Stochastic(price,q,r,s,u) ,ul)

mit:

  • SM_Stochastic() - Index der stochastischen Geschwindigkeit SMI(price,q,r,s,u);
  • SignalLine() - Signallinie - EMA für den Zeitraum ul, angewendet auf den Index der stochastischen Geschwindigkeit;
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden gültigen Wertes (>1) des exponentiellen gleitenden Durchschnitts des Index der stochastischen Geschwindigkeit sein.

2.2.3.1. SM_Stochastic(price,q,r,s,u,ul) - Stochastischer Oszillator. Beschreibung

  • Dateiname: Blau_SM_Stochastic.mq5
  • Bezeichnung: Stochastischer Oszillator (auf der Grundlage des stochastischen Momentums) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - Index der stochastischen Geschwindigkeit (Stochastic Momentum Index):
      • q - Zeitraum, für den das stochastische Momentum berechnet wird (Voreinstellung: q = 5);
      • r - Zeitraum des ersten EMA, angewendet auf das stochastische Momentum (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • grafische Darstellung #1 - die Signallinie:
      • ul - EMA-Zeitraum der Signallinie, angewendet auf den Index der stochastischen Geschwindigkeit (Voreinstellung: ul = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • zwei Grenzen (voreingestellt auf -40 bzw. +40) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • ul>0. Bei ul = 1 deckt sich die Signallinie mit dem Index der stochastischen Geschwindigkeit;
    • der Mindestumfang des Kursdatenfeldes ist gleich = (q-1 + r + s + u + ul-4 +1).

 

2.2.4. Der Programmcode des stochastischen Oszillators

Am Beispiel des Indikators SM_Stochastic(price,q,r,s,u,ul) sehen wir:

1) Die Verbindung zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                   // Stochastic Momentum Index
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                 // Signal Line: ul-period EMA of Stochastic Momentum Index
   // buffers for intermediate calculations (not used for plotting)
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);          // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);             // minimal price value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);             // maximal price value (q bars)
   SetIndexBuffer(5,SMBuffer,INDICATOR_CALCULATIONS);             // q-period Stochastic Momentum
   SetIndexBuffer(6,EMA_SMBuffer,INDICATOR_CALCULATIONS);         // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_SMBuffer,INDICATOR_CALCULATIONS);        // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_SMBuffer,INDICATOR_CALCULATIONS);        // u-period of the 3rd EMA
   SetIndexBuffer(9,HalfHHLLBuffer,INDICATOR_CALCULATIONS);       // half of price range (q bars)
   SetIndexBuffer(10,EMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (half of price range)
   SetIndexBuffer(11,DEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (half of price range)
   SetIndexBuffer(12,TEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (half of price range)

2) Den Algorithmus zur Berechnung des stochastischen Momentums für den Zeitraum q sowie der Hälfte des Bereichs der Kursschwankungen im Zeitraum q;

//--- calculation of q-period Stochastic Momentum and half of price range (q bars)
   if(prev_calculated==0)       // at first call
     {
      pos=begin1;               // starting from 0
      for(i=0;i<pos;i++)        // pos values
        {
         SMBuffer[i]=0.0;       // zero values
         HalfHHLLBuffer[i]=0.0; //
         LLBuffer[i]=0.0;       //
         HHBuffer[i]=0.0;       //
        }
     }
   else pos=prev_calculated-1;  // overwise calculate only last value
   // calculation of SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // calculation of LLBuffer[] - search for the minimal price (q bars)
      // calculation of HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // calculation of SMBuffer[] - q-period Stochastic Momentum
      SMBuffer[i]=PriceBuffer[i]-0.5*(LLBuffer[i]+HHBuffer[i]);
      // calculation of HalfHHLLBuffer[] - half of price range (q bars)
      HalfHHLLBuffer[i]=0.5*(HHBuffer[i]-LLBuffer[i]);
     }

3. Der Indikator der Abweichung vom Trend

Die betrachteten Indikatoren (s. Anhang) sind in zwei Gruppen unterteilt:

I. Auf der Abweichung vom Markttrend beruhende Indikatoren:

  1. Blau_MDI.mq5 - Indikator der durchschnittlichen Abweichung vom Trend (mittlere Abweichung [MD], geglättete mittlere Abweichung [MAD]);
  2. Blau_Ergodic_MDI.mq5 - Ergodischer MDI-Oszillator (auf der Grundlage des Indikators der mittleren Abweichung [MDI]).

II. Auf der Konvergenz/Divergenz der gleitenden Durchschnittswerte (MA) beruhende Indikatoren:

  1. Blau_MACD.mq5 - Indikator der Konvergenz/Divergenz der gleitenden Durchschnittswerte (MACD; geglätteter MACD);
  2. Blau_Ergodic_MACD.mq5 - Ergodischer MACD-Oszillator (auf der Grundlage des Indikators der Konvergenz/Divergenz der gleitenden Durchschnittswerte [MACD]).

3.1. Auf der Abweichung vom Markttrend beruhende Indikatoren

Abb. 3.1. Auf der Abweichung vom Markttrend beruhende Indikatoren William Blaus

Abb. 3.1. Auf der Abweichung vom Markttrend beruhende Indikatoren William Blaus

 

3.1.1. Indikator der mittleren Abweichung (Mean Deviation Indicator)

Die mittlere Abweichung vom Trend (Trendausschlussverfahren) gibt den Abstand des [Schluss-] Kurses von dem auf den [Schluss-] Kurs angewendeten exponentiellen gleitenden Durchschnittswert (EMA) für den Zeitraum r an.

Die Tendenz der Marktentwicklung, der Markttrend: der auf den Kurs angewendete EMA für den Zeitraum r wird zur Bestimmung eines auf- (der EMA wird größer) oder eines absteigenden (der EMA wird kleiner) Trends der Kursentwicklung verwendet.

Der gleitende Durchschnitt glättet die Kurskurve, aber selbst eine unwesentliche Vergrößerung des Zeitraums des gleitenden Durchschnittswerts führt zu einer Verzögerung, was an den Wendepunkten des Kurses gut erkennbar wird (s. dazu auch Punkt 1.1.1, Abb. 1.2). Der Wert der mittleren Trendabweichung gibt an, wie sehr der Kurs bezüglich des auf ihn angewendeten EMA für den Zeitraum r versetzt ist.

Das Symbol für die mittlere Abweichung vom Trend markiert die Position des Kurses in Bezug auf den auf ihn angewendeten EMA für den Zeitraum r: bei einer positiven Abweichung vom Trend übersteigt der Kurs den EMA; ist die Abweichung negativ, liegt er unter dem EMA.

Die Formel für die mittlere Trendabweichung:

md(price,r) = price - EMA(price,r)

mit:

  • price - [Schluss-] Kurs des aktuellen Zeitraums;
  • EMA(price,r) - Markttrend (Tendenz der Marktentwicklung) - der auf den Kurs angewendete EMA für den Zeitraum r.

Siehe dazu im Benutzerhandbuch für die MetaTrader-Instanz auf dem Ausgabegerät (Terminal) im Abschnitt Analyse/Technische Indikatoren/Trendindikatoren:

  1. Zweifach geglätteter exponentieller gleitender Durchschnitt, DEMA;
  2. Dreifach geglätteter exponentieller gleitender Durchschnitt, TEMA;

Einen vergleichbaren Parameter verwendet Alexander Elder in seinen Indikatoren Bears Power und Bulls Power. Siehe dazu im Benutzerhandbuch für die MetaTrader-Instanz auf dem Ausgabegerät (Terminal) im Abschnitt Analyse/Technische Indikatoren/Trendindikatoren:

  1. Bears Power;
  2. Bulls Power.

Der Indikator der mittleren Abweichung vom Trend (Mean Deviation Index, MDI) gibt die geglättete mittlere Abweichung von der allgemeinen Tendenz der Marktentwicklung wieder.

Die Formel für den Indikator der mittleren Trendabweichung:

MDI(price,r,s,u) = EMA(EMA( md(price,r) ,s),u) = EMA(EMA( price-EMA(price,r) ,s),u)

mit:

  • price - [Schluss-] Kurs - Kursbasis des Kursdiagramms;
  • EMA(price,r) - Markttrend - erste Glättung - auf den Kurs angewendeter EMA für den Zeitraum r;
  • md(price,r)=price-EMA(price,r) - mittlere Trendabweichung - Abweichung des Kurses von dem auf ihn angewendeten EMA für den Zeitraum r;
  • EMA(md(price,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf die mittlere Trendabweichung;
  • EMA(EMA(md(price,r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

3.1.1.3. MDI(price,r,s,u) - Indikator der mittleren Abweichung (Mean Deviation Index). Beschreibung

  • Dateiname: Blau_MDI.mq5
  • Bezeichnung: Indikator der mittleren Abweichung vom Markttrend (mittlere Abweichung; geglättete mittlere Abweichung) nach William Blau.
  • Eingangsparameter:
    • r - Zeitraum des ersten EMA, angewendet auf den Kurs (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf die mittlere Abweichung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • r>1;
    • s>0, u>0. Sind s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung;
    • der Mindestumfang des Kursdatenfeldes ist gleich (r+s+u-3+1).

 

3.1.2. Ergodischer MDI-Oszillator

Definition des ergodischen MDI-Oszillators:
Ergodic_MDI(price,r,s,u) = MDI(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MDI(price,r,s,u) ,ul)

mit:

  • Ergodic_MDI() - Ergodischer Oszillator - Index der mittleren Abweichung vom Trend MDI(price,r,s,u);
  • SignalLine() - Signallinie - der auf den ergodischen Oszillator angewendete exponentielle gleitende Durchschnitt (EMA) für den Zeitraum ul;
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden gültigen Wertes (>1) des exponentiellen gleitenden Durchschnitts des ergodischen Oszillators sein.

3.1.2.2. Ergodic_MDI(price,r,s,u,ul) - Ergodischer MDI-Oszillator. Beschreibung

  • Dateiname: Blau_Ergodic_MDI.mq5
  • Bezeichnung: Ergodischer MDI-Oszillator (auf der Grundlage des Indikators der mittleren Abweichung) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - Ergodischer Oszillator (Indikator der mittleren Trendabweichung):
      • r - Zeitraum des ersten EMA, angewendet auf den Kurs (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten EMA, angewendet auf die mittlere Abweichung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • grafische Darstellung #1 - die Signallinie:
      • ul - EMA-Zeitraum der Signallinie, angewendet auf den erdogischen Oszillator (Voreinstellung: ul = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • r>1;
    • s>0, u>0. Sind s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung;
    • ul>0. Ist ul = 1, stimmt die Signallinie mit der des ergodischen Oszillators überein;
    • der Mindestumfang des Kursdatenfeldes ist gleich (r+s+u+ul-4+1).

 

3.1.3. Der Programmcode des ergodischen Oszillators

Am Beispiel des Indikators Ergodic_MDI(price,r,s,u,ul) sehen wir:

1) Die Verbindung zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations; not used for plotting
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);     // price array
   SetIndexBuffer(3,EMA_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (price)
   SetIndexBuffer(4,MDBuffer,INDICATOR_CALCULATIONS);        // среднее отклонение
   SetIndexBuffer(5,DEMA_MDBuffer,INDICATOR_CALCULATIONS);   // s-period 2nd EMA

2) Den Algorithmus zur Berechnung der mittleren Abweichung:

//--- calculation of the mean deviation
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // starting from 0
      for(i=0;i<pos;i++)       // pos data
         MDBuffer[i]=0.0;      // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // r-period 1st EMA: calculation of EMA_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA_PriceBuffer);
   // calculation of MDBuffer[]
   for(i=pos;i<rates_total;i++)
      MDBuffer[i]=PriceBuffer[i]-EMA_PriceBuffer[i];


3.2. Auf der Konvergenz/Divergenz der gleitenden Durchschnittswerte beruhende Indikatoren

Abb. 3.2. Auf der Konvergenz/Divergenz der gleitenden Durchschnittswerte beruhende Indikatoren William Blaus

Abb. 3.2. Auf der Konvergenz/Divergenz der gleitenden Durchschnittswerte beruhende Indikatoren William Blaus

 

3.2.1. Der Indikator der Konvergenz/Divergenz der gleitenden Durchschnittswerte

Die Konvergenz/Divergenz der gleitenden Durchschnittswerte (Moving Average Convergence/Divergence, MACD) gibt den Unterschied (die Divergenz) zwischen zwei exponentiellen gleitenden Durchschnittswerten (EMA) an: dem schnellen EMA für den Zeitraum s und dem langsamen EMA für den Zeitraum r, wobei beide EMA auf den [Schluss-] Kurs angewendet werden.

DasMACD-Symbol gibt die Lage des schnellen EMA(s) relativ zum langsameren EMA(r) wieder: ein MACD mit positivem Vorzeichen bedeutet, dass der EMA(s) oberhalb des EMA(r) liegt, ein negatives MACD-Vorzeichen heißt, dass der EMA(s) niedriger ist als der EMA(r). Änderung des absoluten Wertes des MACD: ein Ansteigen des |MACD| weist auf das Auseinanderlaufen (die Divergenz) der gleitenden Durchschnittswerte hin, während eine Abnahme des |MACD| für deren Annäherung (Konvergenz) spricht.

Die Formel für die Konvergenz/Divergenz des gleitenden Durchschnittswerts (MA):

macd(price,r,s) = EMA(price,s) - EMA(price,r)
s < r

mit:

  • price - Kurs bei [Schließung] des aktuellen Zeitraums;
  • EMA(price,r) - langsamer EMA(r), angewendet auf den Kurs;
  • EMA(price,s) - schneller EMA(s), angewendet auf den Kurs.

Der MACD-Indikator zeigt das Verhältnis zwischen dem schnellen und dem langsameren exponentiellen gleitenden Durchschnittswert (die geglättete Konvergenz/Divergenz der gleitenden Durchschnittswerte).

Die Formel für den MACD-Indikator:

MACD(price,r,s,u) = EMA( macd(price,r,s) ,u) = EMA( EMA(price,s)-EMA(price,r) ,u)
s < r

mit:

  • price - [Schluss-] Kurs - Kursbasis des Kursdiagramms;
  • EMA(price,r) - erste Glättung - auf den Kurs angewendeter langsamer EMA für den Zeitraum r;
  • EMA(price,s) - zweite Glättung - auf den Kurs angewendeter schneller EMA für den Zeitraum s;
  • macd(r,s)=EMA(price,s)-EMA(price,r) - MACD von EMA(price,s) und EMA(price,r);
  • EMA(macd(r,s),u) - dritte Glättung - auf die MACD des schnellen EMA(price,s) und des langsameren EMA(price,r) angewendeter EMA für den Zeitraum u.

3.2.1.1. MACD(price,r,s,u) - Indikator für die Konvergenz/Divergenz der gleitenden Durchschnittswerte (Moving Average Convergence/Divergence). Beschreibung

  • Dateiname: Blau_MACD.mq5
  • Bezeichnung: Indikator für die Konvergenz/Divergenz der gleitenden Durchschnittswerte (MACD; geglätteter MACD) nach William Blau.
  • Eingangsparameter:
    • r - Zeitraum des ersten, langsameren EMA, angewendet auf den Kurs (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten, schnellen EMA, angewendet auf die mittlere Abweichung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf die Konvergenz/Divergenz der gleitenden Durchschnittswerte (MACD) (Voreinstellung: u = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • r > 1, s > 1;
    • s < r (theoretisch begründete Beschränkung, wird auf Programmebene nicht geprüft);
    • u > 0. Keine Glättung, wenn u = 1;
    • der Mindestumfang des Kursdatenfeldes ist gleich ([max(r,s)]+u-2+1).

 

3.2.2. Ergodischer MACD-Oszillator

Definition des ergodischen MACD-Oszillators:
Ergodic_MACD(price,r,s,u) = MACD(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MACD(price,r,s,u) ,ul)

mit:

  • Ergodic_MACD() - Ergodischer Oszillator - Indikator für die Konvergenz/Divergenz der gleitenden Durchschnittswerte MACD(price,r,s,u);
  • SignalLine() - Signallinie - der auf den ergodischen Oszillator angewendete exponentielle gleitende Durchschnitt (EMA) für den Zeitraum ul;
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden gültigen Wertes (>1) des exponentiellen gleitenden Durchschnitts des ergodischen Oszillators sein.

Das „Benutzerhandbuch für die MetaTrader-Instanz auf dem Ausgabegerät (Terminal)“ bietet in dem Abschnitt Analyse/Technische Indikatoren/Oszillatoren/MACD eine Beschreibung des in die Instanz von MetaTrader 5 auf dem Ausgabegerät (Terminal) integrierten technischen Indikators Konvergenz/Divergenz der gleitenden Durchschnittswerte (MACD) sowie der Arten seiner Verwendung bei der technischen Analyse (siehe auch iMACD.)

Statt der „gewöhnlichen“ auf dem Ausgabegerät (Terminal) vorinstallierten MACD verwendet William Blau zum Empfang der Signallinie als Glättungsverfahren den exponentiellen gleitenden Durchschnittswert (wogegen bei der „gewöhnlichen“ MACD der einfache gleitende Durchschnitt zum Einsatz kommt).

3.2.2.1. Ergodic_MACD(price,r,s,u,ul) - Ergodischer MACD-Oszillator. Beschreibung

  • Dateiname: Blau_Ergodic_MACD.mq5
  • Bezeichnung: Ergodischer MACD-Oszillator (auf der Grundlage des Indikators für die Konvergenz/Divergenz der gleitenden Durchschnittswerte) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - der ergodische Oszillator (Konvergenz/Divergenz der gleitenden Durchschnittswerte):
      • r - Zeitraum des ersten, langsameren EMA, angewendet auf den Kurs (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten, schnellen EMA, angewendet auf die mittlere Abweichung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf die Konvergenz/Divergenz der gleitenden Durchschnittswerte (MACD) (Voreinstellung: u = 3);
    • grafische Darstellung #1 - die Signallinie:
      • ul - EMA-Zeitraum der Signallinie, angewendet auf den erdogischen Oszillator (Voreinstellung: ul = 3);
    • AppliedPrice - Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • r > 1, s > 1;
    • s < r (theoretisch begründete Beschränkung, wird auf Programmebene nicht geprüft);
    • u > 0. Keine Glättung, wenn u = 1;
    • ul > 0. Bei ul = 1 deckt sich die Signallinie mit der des ergodischen Oszillators;
    • der Mindestumfang des Kursdatenfeldes ist gleich ([max(r,s)]+u+ul-3+1).

 

3.2.3. Der Programmcode des ergodischen MACD-Oszillators

Am Beispiel des Indikators Ergodic_MACD (price,r,s,u,ul) sehen wir:

1) Die Verbindung zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: ul-period EMA, applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,EMA1_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (slow), applied to price
   SetIndexBuffer(4,EMA2_PriceBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (fast), applied to price
   SetIndexBuffer(5,MACDBuffer,INDICATOR_CALCULATIONS);       // moving averages convergence/divergence

2) Den Algorithmus zur Berechnung der Konvergenz/Divergenz der gleitenden Durchschnittswerte:

//--- calculation of moving average convergence/divergence
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // 
      for(i=0;i<pos;i++)       // pos
         MACDBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // r-period 1st EMA: calculation of EMA1_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA1_PriceBuffer);
   // s-period 2nd EMA: calculation of EMA2_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,s,PriceBuffer,EMA2_PriceBuffer);
   // calculation of MACDBuffer[]
   for(i=pos;i<rates_total;i++)
      MACDBuffer[i]=EMA2_PriceBuffer[i]-EMA1_PriceBuffer[i];

3.3. Ergänzung

Bei der Berechnung der ergodischen MDI- und MACD-Oszillatoren verzichtet William Blau auf die Normalisierung (s. Punkt 1.2.1 und 1.3.1). Deshalb können weder der ergodische MDI- noch der MACD-Oszillator zur Ermittlung der Grenzen für den Überkauf oder Überverkauf des Marktes verwendet werden.

Folglich sind die in dem „Benutzerhandbuch für die MetaTrader-Instanz auf dem Ausgabegerät (Terminal)“ im Abschnitt Analyse/Technische Indikatoren/Oszillatoren/MACD gegebenen Empfehlungen:

„Die Konvergenz/Divergenz der gleitenden Durchschnittswerte (MACD) ist auch als Indikator für den Überkauf/Überverkauf sehr wertvoll. Wenn der kürzere gleitende Durchschnittswert wesentlich höher steigt als der längere (d.h. die MACD wird größer), bedeutet das, dass der Kurs des betreffenden Instrumentes aller Wahrscheinlichkeit nach überhöht ist und bald auf ein realistischeres Niveau zurückkehren wird.“

in diesem Fall aus Sicht der technischen Analyse unrichtig.

4. Das Kerzenmomentum (Candlestick Momentum)

Die betrachteten Indikatoren (s. Anhang) sind in zwei Gruppen unterteilt:

  1. Blau_CMtm.mq5 - Geschwindigkeitsindikator für Kerzen (das Kerzenmomentum für den Zeitraum q; das geglättete Kerzenmomentum für den Zeitraum q);
  2. Die Indices (das normalisierte geglättete Kerzenmomentum für den Zeitraum q):
    • Blau_CMI.mq5 - Index des Kerzenmomentums (Candlestick Momentum Index, CMI) (Normalisierung anhand des absoluten Wertes des Kerzenmomentums für den Zeitraum q);
    • Blau_CSI.mq5 - Kerzenindex (Candlestick Index, CSI) (Normalisierung anhand der Länge der Kerze für den Zeitraum q);
  3. Die ergodischen Kerzenoszillatoren:
    • Blau_Ergodic_CMI.mq5 - Ergodischer CMI-Oszillator (auf der Grundlage des Index des Kerzenmomentums);
    • Blau_Ergodic_CSI.mq5 - Ergodischer CSI-Oszillator (auf der Grundlage des Kerzenindex);

Abb. 4.1. Auf dem Kerzenmomentum beruhende Indikatoren William Blaus (Normalisierung anhand des absoluten Wertes des Kerzenmomentums für den Zeitraum q)

Abb. 4.1. Auf dem Kerzenmomentum beruhende Indikatoren William Blaus (Normalisierung anhand des absoluten Wertes des Kerzenmomentums für den Zeitraum q)

 

Abb. 4.2. Auf dem Kerzenmomentum beruhende Indikatoren William Blaus (Normalisierung anhand der Länge der Kerze für den Zeitraum q)

Abb. 4.2. Auf dem Kerzenmomentum beruhende Indikatoren William Blaus (Normalisierung anhand der Länge der Kerze für den Zeitraum q)

 

4.1. Das Kerzenmomentum (Candlestick Momentum)

4.1.1. Definition für das Kerzenmomentum

Das Momentum (s. Punkt 1.1) ist die Differenz zwischen dem aktuellen Kurs (in der Regel dem Schlusskurs des aktuellen Tages) und dem vorhergehenden Kurs (für gewöhnlich dem Schlusskurs des jeweiligen Vortages). Das Momentum kann die Kursänderung für jeden Zeitraum des Kursdiagramms wiedergeben.

Das Kerzenmomentum (nach William Blau) ist die Differenz zwischen dem Schlusskurs und dem Eröffnungskurs innerhalb eines einzigen Zeitraums (innerhalb einer Kerze). Das Vorzeichen des Kerzenmomentums weist die Richtung der Kursänderung aus: ein positives Kerzenmomentum bedeutet, dass der Kurs in dem Zeitraum gestiegen ist; eine negatives heißt, er ist gefallen.

Die Formel für das Kerzenmomentum:

cmtm = close - open

mit:

  • close - Schlusskurs des [aktuellen] Zeitraums (der Kerze);
  • open - Eröffnungskurs des [aktuellen] Zeitraums (der Kerze).

Im Interesse der Allgemeingültigkeit erweitern wir die Definition des Kerzenmomentums:

  1. Das Kerzenmomentum kann die Kursänderung für jeden Zeitraum des Kursdiagramms wiedergeben;
  2. Die Kursbasis (Eröffnungskurs, Schlusskurs) kann beliebig sein.

Abb. 4.3. Bestimmung des Kerzenmomentums für den Zeitraum q

Abb. 4.3. Bestimmung des Kerzenmomentums für den Zeitraum q


Die Formel für das Kerzenmomentum für den Zeitraum q:

cmtm(price1,price2,q) = price1 - price2[q-1]

mit:

  • q - Anzahl der in die Berechnung des Kerzenmomentums einbezogenen Zeiträume des Kursdiagramms;
  • price1 - [Schluss-] Kurs am Ende des Zeitraums q;
  • price2[q-1] - [Eröffnungs-] Kurs zu Beginn des Zeitraums q.

Die Formel für das geglättete Kerzenmomentum für den Zeitraum q:

CMtm(price1,price2,q,r,s,u) = EMA(EMA(EMA( cmtm(price1,price2,q) ,r),s),u)

mit:

  • q - Anzahl der in die Berechnung des Kerzenmomentums für den Zeitraum q einbezogenen Zeiträume des Kursdiagramms;
  • price1 - [Schluss-] Kurs am Ende des Zeitraums q;
  • price2 - [Eröffnungs-] Kurs zu Beginn des Zeitraums q.
  • cmtm(price1,price2,q)=price1-price2[q-1] - Kerzenmomentum für den Zeitraum q;
  • EMA(cmtm(price1,price2,q),r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf das Kerzenmomentum für den Zeitraum q;
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA(EMA(EMA(...,r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

4.1.2. CMtm(price1,price2,q,r,s,u) - Indikator für das Kerzenmomentum. Beschreibung
  • Dateiname: Blau_CMtm.mq5
  • Bezeichnung: Indikator für das Kerzenmomentum (geglättetes Kerzenmomentum für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das Kerzenmomentum berechnet wird (Voreinstellung: q = 1);
    • r - Zeitraum des ersten EMA, angewendet auf das Kerzenmomentum für den Zeitraum q (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice1 - [Schluss-] Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - [Eröffnungs-] Kursart (Voreinstellung: AppliedPrice = PRICE_OPEN).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

4.2. Normalisiertes Kerzenmomentum

4.2.1. Index des Kerzenmomentums

Der Index des Kerzenmomentums (Candlestick Momentum Index, CMI) ist ein Indikator für das normalisierte Kerzenmomentum für den Zeitraum q (das normalisierte geglättete Kerzenmomentum für den Zeitraum q).

Die Werte des geglätteten Kerzenmomentums für den Zeitraum q werden in das Prozentformat übertragen (mit dem Abbildungsintervall [-100, 100]). Jeder Wert des geglätteten Kerzenmomentums für den Zeitraum q wird mit dem absoluten Wert des geglätteten Kerzenmomentums für den Zeitraum q normalisiert. Die Normalisierung ermöglicht die Interpretation des CMI-Wertes als Grenze für den Überkauf (bei einem positiven Wert) oder den Überverkauf (negativer Wert) des Marktes.

Die Formel für den Index des Kerzenmomentums:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)          100 * CMtm(price1,pric2,q,r,s,u)
CMI(price1,price2,q,r,s,u) = –––––––––––-------------––––––––-–––––––––––––––– = –––––––––––––––-------------–––-–––––––––––––
                               EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)     EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)
if EMA(EMA(EMA(|cmtm(price1,pric2,q)|,r),s),u)=0, then CMI(price1,price2,q,r,s,u)=0

mit:

  • q - Anzahl der an der Berechnung des Kerzenmomentums für den Zeitraum q beteiligten Zeiträume (Balken) des Kursdiagramms;
  • price1 - [Schluss-] Kurs am Ende des Zeitraums q;
  • price2 - [Eröffnungs-] Kurs zu Beginn des Zeitraums q.
  • cmtm(price1,price2,q)=price1-pric2[q-1] - Kerzenmomentum für den Zeitraum q;
  • |cmtm(price1,price2,q)| - absoluter Wert des Kerzenmomentums für den Zeitraum q;
  • CMtm (price,q,r,s,u) - dreifach geglättetes Kerzenmomentum für den Zeitraum q;
  • EMA(...,r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf:
    1) das Kerzenmomentum für den Zeitraum q;
    2) den absoluten Wert des Kerzenmomentums für den Zeitraum q;
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA(EMA(EMA(...,r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

4.2.1.1. CMI(price1,price2,q,r,s,u) - Index für das Kerzenmomentum. Beschreibung

  • Dateiname: Blau_CMI.mq5
  • Bezeichnung: Index für das Kerzenmomentum für den Zeitraum q (normalisiertes geglättetes Kerzenmomentum für den Zeitraum q; Normalisierung des Kerzenmomentums für den Zeitraum q mit dem absoluten Wert) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, anhand dessen das Kerzenmomentum berechnet wird (Voreinstellung: q = 1);
    • r - Zeitraum des ersten EMA, angewendet auf das Kerzenmomentum für den Zeitraum q (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice1 - [Schluss-] Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - [Eröffnungs-] Kursart (Voreinstellung: AppliedPrice = PRICE_OPEN).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • (nicht obligatorisch) zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

4.2.2. Der Kerzenindex

Der Kerzenindex (Candle Stochastic Index, CSI) ist ein Indikator für das normalisierte Kerzenmomentum für den Zeitraum q (das normalisierte geglättete Kerzenmomentum für den Zeitraum q). Die Werte des geglätteten Kerzenmomentums für den Zeitraum q werden in das Prozentformat übertragen (mit dem Abbildungsintervall [-100, 100]).

Jeder Wert des geglätteten Kerzenmomentums für den Zeitraum q wird mit dem Wert des Kursschwankungsbereichs für den Zeitraum q (oder mit der Länge der Kerze für den Zeitraum q) normalisiert. Die Normalisierung ermöglicht die Interpretation des CSI-Wertes als Grenze für den Überkauf (bei einem positiven Wert) oder den Überverkauf (negativer Wert) des Marktes.

Die Formel für den Kerzenindex:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)    100 * CMtm(price1,pric2,q,r,s,u)
CSI(price1,price2,q,r,s,u) = –––––––––––––––––––-–––-------------––––––––––––– = ––––––––––––––––--––-–––––––––––––
                                    EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)           EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then CSI(price1,price2,q,r,s,u)=0

mit:

  • q - Anzahl der in die Berechnung des Kerzenmomentums für den Zeitraum q einbezogenen Zeiträume des Kursdiagramms;
  • price1 - [Schluss-] Kurs am Ende des Zeitraums q;
  • price2 - [Eröffnungs-] Kurs zu Beginn des Zeitraums q.
  • cmtm(price1,price2,q)=price1-price2[q-1] - Kerzenmomentum für den Zeitraum q;
  • LL(q) - Niedrigster Wert des Kurses in den q vorausgehenden Zeiträumen als Untergrenze für den Zeitraum q;
  • HH(q) - Höchster Wert des Kurses in den q vorausgehenden Zeiträumen als Obergrenze für den Zeitraum q;
  • HH(q)-LL(q) - Kursschwankungsbereich für den Zeitraum q (Länge der Kerze für den Zeitraum q);
  • CMtm(price1,price2,q,r,s,u) - dreifach geglättetes Kerzenmomentum für den Zeitraum q;
  • EMA(...,r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf:
    1) das Kerzenmomentum für den Zeitraum q;
    2) den Kursschwankungsbereich für den Zeitraum q (oder die Länge der Kerze für den Zeitraum q)
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA (EMA (EMA (..., r), s), u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung, den EMA(s).

4.2.2.1. CSI(price1,price2,q,r,s,u) - Kerzenindex. Beschreibung

  • Dateiname: Blau_CSI.mq5
  • Bezeichnung: Kerzenindex für den Zeitraum q (normalisiertes geglättetes Kerzenmomentum für den Zeitraum q; Normalisierung mit der Länge der Kerze für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das Kerzenmomentum berechnet wird (Voreinstellung: q = 1);
    • r - Zeitraum des ersten EMA, angewendet auf das Kerzenmomentum für den Zeitraum q (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • AppliedPrice1 - [Schluss-] Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - [Eröffnungs-] Kursart (Voreinstellung: AppliedPrice = PRICE_OPEN).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • (nicht obligatorisch) zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

4.3. Die ergodischen Kerzen-Oszillatoren

4.3.1. Ergodischer CMI-Oszillator

Definition des ergodischen CMI-Oszillators:
Ergodic_CMI(price1,pric2,q,r,s,u) = CMI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CMI(price1,pric2,q,r,s,u) ,ul)

mit:

  • Ergodic_CMI() - Ergodischer Oszillator - Index für das Kerzenmomentum CMI(price1,price2,q,r,s,u);
  • SignalLine() - Signallinie - der auf den ergodischen Oszillator angewendete exponentielle gleitende Durchschnitt (EMA) für den Zeitraum ul;
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden gültigen Wertes (>1) des exponentiellen gleitenden Durchschnitts des ergodischen Oszillators sein.

Ergodic_CMI(price1,price2,q,r,s,u,ul) - ergodischer CMI-Oszillator. Beschreibung

  • Dateiname: Blau_Ergodic_CMI.mq5
  • Bezeichnung: Ergodischer CMI-Oszillator (auf der Grundlage des Index für das Kerzenmomentum) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - Ergodischer Oszillator (Index für das Kerzenmomentum):
      • q - Zeitraum, für den das Kerzenmomentum berechnet wird (Voreinstellung: q = 1);
      • r - Zeitraum des ersten EMA, angewendet auf das Kerzenmomentum für den Zeitraum q (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • grafische Darstellung #1 - die Signallinie:
      • ul - EMA-Zeitraum der Signallinie, angewendet auf den erdogischen Oszillator (Voreinstellung: ul = 3);
    • AppliedPrice1 - [Schluss-] Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - [Eröffnungs-] Kursart (Voreinstellung: AppliedPrice = PRICE_OPEN).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes, der Beschreibung der Grenze; Ändern der grafischen Abbildung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • ul > 0. Bei ul = 1 deckt sich die Signallinie mit der des ergodischen Oszillators;
    • der Mindestumfang des Kursdatenfeldes ist gleich = (q-1 + r + s + u + ul-4 +1).

Der Programmcode des ergodischen CMI-Oszillators


Am Beispiel des Indikators Ergodic_CMI(price1,price2,r,s,u,ul) sehen wir:

1) Die Verbindung zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                  // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                // Signal Line: EMA(ul), applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);        // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);        // price array [open]
   SetIndexBuffer(4,CMtmBuffer,INDICATOR_CALCULATIONS);          // q-period Candlestick Momentum
   SetIndexBuffer(5,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsCMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum (absolute value)
   SetIndexBuffer(9,EMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute value)
   SetIndexBuffer(10,DEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(11,TEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

2) Den Algorithmus zur Berechnung von cmtm und |cmtm|:

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // applied price [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and |cmtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         AbsCMtmBuffer[i]=0.0; //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[] and AbsCMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      AbsCMtmBuffer[i]=MathAbs(CMtmBuffer[i]);
     }

4.3.2. Ergodischer CSI-Oszillator

Der ergodische CSI-Oszillator hat folgende Definition:

Ergodic_CSI(price1,pric2,q,r,s,u) = CSI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CSI(price1,pric2,q,r,s,u) ,ul)

mit:

  • Ergodic_CSI() - Ergodischer Oszillator - Kerzenindex CSI(price1,price2,q,r,s,u);
  • SignalLine() - Signallinie - der auf den ergodischen Oszillator angewendete exponentielle gleitende Durchschnitt (EMA) für den Zeitraum ul;
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden gültigen Wertes (>1) des exponentiellen gleitenden Durchschnitts des ergodischen Oszillators sein.

4.3.2.1. Ergodic_CSI(price1,pric2,q,r,s,u,ul) - ergodischer CSI-Oszillator. Beschreibung

  • Dateiname: Blau_Ergodic_CSI.mq5
  • Bezeichnung: Ergodischer CSI-Oszillator (auf der Grundlage des Kerzenindex) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - Ergodischer Oszillator (Kerzenindex):
      • q - Zeitraum, für den das Kerzenmomentum berechnet wird (Voreinstellung: q = 1);
      • r - Zeitraum des ersten EMA, angewendet auf das Kerzenmomentum für den Zeitraum q (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • grafische Darstellung #1 - die Signallinie:
      • ul - EMA-Zeitraum der Signallinie, angewendet auf den erdogischen Oszillator (Voreinstellung: ul = 3);
    • AppliedPrice1 - [Schluss-] Kursart (Voreinstellung: AppliedPrice = PRICE_CLOSE).
    • AppliedPrice2 - [Eröffnungs-] Kursart (Voreinstellung: AppliedPrice = PRICE_OPEN).
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes, der Beschreibung der Grenze; Ändern der grafischen Abbildung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • ul > 0. Bei ul = 1 deckt sich die Signallinie mit der des ergodischen Oszillators;
    • der Mindestumfang des Kursdatenfeldes ist gleich = (q-1 + r + s + u + ul-4 +1).

4.3.2.2. Der Programmcode des ergodischen CSI-Oszillators


Am Beispiel des Indikators Ergodic_CSI(price1,price2,r,s,u,ul) sehen wir:

1) Die Verbindung zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);     // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);     // price arrya [open]
   SetIndexBuffer(4,LLBuffer,INDICATOR_CALCULATIONS);         // lowest prices (q bars)
   SetIndexBuffer(5,HHBuffer,INDICATOR_CALCULATIONS);         // highest prices (q bars)
   SetIndexBuffer(6,CMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum
   SetIndexBuffer(7,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA
   SetIndexBuffer(8,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // s-period 2nd EMA
   SetIndexBuffer(9,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // u-period 3rd EMA
   SetIndexBuffer(10,HHLLBuffer,INDICATOR_CALCULATIONS);      // price range (q bars)
   SetIndexBuffer(11,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (price range)
   SetIndexBuffer(12,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (price range)
   SetIndexBuffer(13,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (price range)

2) Den Algorithmus zur Berechnung des cmtm und des Bereichs der Kursschwankungen im Zeitraum q; 

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // price type [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and price range (q bars)
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         HHLLBuffer[i]=0.0;    //
         LLBuffer[i]=0.0;      //
         HHBuffer[i]=0.0;      //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // CMtmBuffer[] - q-period Candlestick Momentum
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      // LLBuffer[] - search for the lowest price (q bars)
      // HHBuffer[] - search for the highest price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // HHLLBuffer[] - Price Range (q bars)
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }

5. Die Trendrichtung

Betrachtete Indikatoren (s. Anhang):

  1. Blau_HLM.mq5 - Indikator für die virtuelle Schließung (aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q; geglättetes aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q);
  2. Blau_DTI.mq5 - Trendrichtungsindex (normalisiertes geglättetes aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q);
  3. Blau_Ergodic_DTI.mq5 - Ergodischer DTI-Oszillator (auf der Grundlage des Trendrichtungsindex, DTI).

Abb. 5.1. Auf dem aus den Höchst- und Tiefstwerten zusammengesetzten Momentum beruhende Trendrichtungsindikatoren

Abb. 5.1. Auf dem aus den Höchst- und Tiefstwerten zusammengesetzten Momentum beruhende Trendrichtungsindikatoren

 

5.1. Aus den Höchst- und Tiefstwerten zusammengesetztes Momentum

5.1.1. Definition des Aufwärtstrend-Momentums und des Abwärtstrend-Momentums

Eine der Trendbestimmungen. Nehmen die Werte der Höchstkurse zu, haben wir einen Aufwärtstrend. Wenn dagegen die Werte der Tiefstkurse fallen, liegt ein Abwärtstrend vor.

Ein Teil der unter Punkt 1 behandelten Geschwindigkeitsindikatoren (Momentum) ermöglichen die Berechnung Momentums anhand der Höchstwerte des Kurses:

Mtm( price=High, q, r, s, u )
TSI( price=High, q, r, s, u )
Ergodic( price=High, q, r, s, u )

ein anderer tut die s anhand der Tiefstwerte:

Mtm( price=Low, q, r, s, u )
TSI( price=Low, q, r, s, u )
Ergodic( price=Low, q, r, s, u )

Das Aufwärtstrend-Momentum oder das Momentum steigender Höchstwerte (High Momentum Up, HMU) ist jeweils die positive Differenz zwischen dem Höchstkurs des aktuellen Zeitraums und dem Höchstkurs zu Beginn des Kursschwankungsbereichs für den Zeitraum q. DerWert des Aufwärtstrend-Momentums für den Zeitraum q gibt die relative Geschwindigkeit der Zunahme des Höchstkurses des aktuellen Zeitraums verglichen mit dem Höchstkurs zu Beginn des Kursschwankungsbereichs für den Zeitraum q wieder.

Die Formel für das Aufwärtstrend-Momentum für den Zeitraum q:

HMU(q) = High - High[q-1], if High - High[q-1] > 0
HMU(q) = 0, if High - High[q-1] <= 0

mit:

  • q - Anzahl der an der Berechnung des Aufwärtstrend-Momentums beteiligten Zeiträume (Balken) des Kursdiagramms;
  • High - Höchstkurs des aktuellen Zeitraums;
  • High[q–1] - Höchstkurs vor (q-1) Zeiträumen.

Das Abwärtstrend-Momentum oder das Momentum fallender Tiefstwerte (Low Momentum Down, LMD) ist jeweils die positive Differenz zwischen dem Tiefstkurs des aktuellen Zeitraums und dem Tiefstkurs zu Beginn des Kursschwankungsbereichs für den Zeitraum q. DerWert des Abwärtstrend-Momentums für den Zeitraum q zeigt die relative Geschwindigkeit der Abnahme des Tiefstkurses des aktuellen Zeitraums verglichen mit dem Tiefstkurs zu Beginn des Kursschwankungsbereichs für den Zeitraum q an.

Die Formel für das Abwärtstrend-Momentum für den Zeitraum q:

LMD(q) = -(Low - Low[q-1]), if Low - Low[q-1] < 0
LMD(q) = 0, if Low - Low[q-1] >= 0

mit:

  • q - Anzahl der an der Berechnung des Abwärtstrend-Momentums beteiligten Zeiträume (Balken) des Kursdiagramms;
  • Low - Tiefstkurs des aktuellen Zeitraums;
  • Low[q–1] - Tiefstkurs vor (q-1) Zeiträumen.

Das aus den Höchst- und Tiefstwerten zusammengesetzte Momentum (High-Low Momentum, HLM) ist die Differenz zwischen dem Aufwärtstrend-Momentum und dem Abwärtstrend-Momentum jeweils für den Zeitraum q. Das Vorzeichen des zusammengesetzten Höchst-Tiefst-Momentums zeigt die Richtung der Kursänderung an: ein positives HLM steht für einen Kursanstieg (Aufwärtstrend), ein negatives folglich für einen Kursrückgang (Abwärtstrend).

Die Formel lautet:

HLM(q) = HMU(q) - LMD(q)

mit:

  • q - Anzahl der an der Berechnung des Aufwärtstrend-Momentums und des Abwärtstrend-Momentums beteiligten Zeiträume (Balken) des Kursdiagramms;
  • HMU(q) - Aufwärtstrend-Momentum für den Zeitraum q;
  • LMD(q) - Abwärtstrend-Momentum für den Zeitraum q;

Die Formel für das geglättete aus den Höchst- und Tiefstwerten zusammengesetzte Momentum für den Zeitraum q (Virtuelle Schließung):

HLM(q,r,s,u) = EMA(EMA(EMA( HLM(q) ,r),s),u) = EMA(EMA(EMA( HMU(q)-HMD(q) ,r),s),u)

mit:

  • q - Anzahl der an der Berechnung des Aufwärtstrend-Momentums und des Abwärtstrend-Momentums beteiligten Zeiträume (Balken) des Kursdiagramms;
  • HMU(q) - Aufwärtstrend-Momentum für den Zeitraum q;
  • LMD(q) - Abwärtstrend-Momentum für den Zeitraum q;
  • HLM(q)=HMU(q)-LMD(q) - aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q;
  • EMA(HLM(q),r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf das aus den Höchst- und Tiefstwerten zusammengesetzte Momentum (HLM) für den Zeitraum q;
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA(EMA(EMA(...,r),s),u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung.

Die Kurve der akkumulierten Summe der aus den Höchst- und Tiefstwerten zusammengesetzten Momenti wird als virtuelle Schließung bezeichnet.

5.1.2. HLM(q,r,s,u) - Indikator für die virtuelle Schließung. Beschreibung
  • Dateiname: Blau_HLM.mq5
  • Bezeichnung: Indikator für die virtuelle Schließung (aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q; geglättetes aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das HLM berechnet wird (Voreinstellung: q = 2);
    • r - Zeitraum des ersten EMA, angewendet auf das HLM (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

5.2. Der Trendrichtungsindex

5.2.1. Definition des Trendrichtungsindex

Bei dem Trendrichtungsindex (Directional Trend Index, DTI) handelt es sich um einen Indikator für das normalisierte aus den Höchst- und Tiefstwerten zusammengesetzte Momentum für den Zeitraum (das normalisierte geglättete HLM). Die Werte des geglätteten HLM werden in das Prozentformat übertragen (mit dem Abbildungsintervall [-100, 100]).

Jeder Wert des geglätteten HLM wird mit dem absoluten Wert des geglätteten HLM normalisiert. Die Normalisierung ermöglicht die Interpretation des DTI-Wertes als Grenze für den Überkauf (bei einem positiven Wert) oder den Überverkauf (negativer Wert) des Marktes.

Die Formel für den Trendrichtungsindex:

               100 * EMA(EMA(EMA( HLM(q) ,r),s),u)          100 * HLM(q,r,s,u)
DTI(q,r,s,u) = –––––––––––––––––––––––––---––––––– = ––––––––––––––--–––––––––––––––
                 EMA(EMA(EMA( |HLM(q)| ,r),s),u)     EMA(EMA(EMA( |HLM(q)| ,r),s),u)
if EMA(EMA(EMA(|HLM(q)|,r),s),u)=0, then DTI(price,q,r,s,u)=0

mit:

  • q - Anzahl der an der Berechnung des Aufwärtstrend-Momentums und des Abwärtstrend-Momentums beteiligten Zeiträume (Balken) des Kursdiagramms;
  • HLM(q)=HMU(q)-LMD(q) - aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q [HLM(q)];
  • |HLM(q)| - absoluter Wert des HLM(q);
  • HLM(q,r,s,u) - dreifach geglättetes HLM(q);
  • EMA(...,r) - erste Glättung - exponentieller gleitender Durchschnittswert (EMA) des Zeitraums r, angewendet auf:
    1) das HLM (q)
    2) den absoluten Wert des HLM(q);
  • EMA(EMA(...,r),s) - zweite Glättung - EMA des Zeitraums s, angewendet auf den EMA des Zeitraums r;
  • EMA (EMA (EMA (..., r), s), u) - dritte Glättung - EMA des Zeitraums u, angewendet auf das Ergebnis der zweiten Glättung, den EMA(s).
5.2.2. DTI(q,r,s,u) - Trendrichtungsindex. Beschreibung
  • Dateiname: Blau_DTI.mq5
  • Bezeichnung: Trendrichtungsindex (normalisiertes geglättetes zusammengesetztes Momentum für den Zeitraum q) nach William Blau.
  • Eingangsparameter:
    • q - Zeitraum, für den das HLM berechnet wird (Voreinstellung: q = 2);
    • r - Zeitraum des ersten EMA, angewendet auf das HLM (Voreinstellung: r = 20);
    • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
    • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • (nicht obligatorisch) zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes und der Beschreibung der Grenze; Ändern der Art der grafischen Darstellung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung.
    • der Mindestumfang des Kursdatenfeldes ist gleich (q -1 + r + s + u - 3 + 1).

 

5.3. Ergodischer DTI-Oszillator

5.3.1. Definition des ergodischen DTI-Oszillators:

Ergodic_DTI(q,r,s,u) = DTI(q,r,s,u)
SignalLine(q,r,s,u,ul) = EMA( Ergodic_DTI(q,r,s,u) ,ul)

mit:

  • Ergodic_DTI() - Ergodischer Oszillator - Trendrichtungsindex DTI(q,r,s,u);
  • SignalLine() - Signallinie - der auf den ergodischen Oszillator angewendete exponentielle gleitende Durchschnitt (EMA) für den Zeitraum ul;
  • ul - EMA-Zeitraum der Signallinie - nach William Blau muss der Wert von ul gleich dem Zeitraum des vorhergehenden gültigen Wertes (>1) des exponentiellen gleitenden Durchschnitts des ergodischen Oszillators sein.
5.3.2. Ergodic_DTI(q,r,s,u,ul) - Ergodischer DTI-Oszillator. Beschreibung
  • Dateiname: Blau_Ergodic_DTI.mq5
  • Bezeichnung: Ergodischer DTI-Oszillator (auf der Grundlage des Trendrichtungsindex) nach William Blau.
  • Eingangsparameter:
    • grafische Darstellung #0 - Ergodischer Oszillator (Trendrichtungsindex):
      • q - Zeitraum, für den das HLM berechnet wird (Voreinstellung: q = 2);
      • r - Zeitraum des ersten EMA, angewendet auf das HLM (Voreinstellung: r = 20);
      • s - Zeitraum des zweiten EMA, angewendet auf das Ergebnis der ersten Glättung (Voreinstellung: s = 5);
      • u - Zeitraum des dritten EMA, angewendet auf das Ergebnis der zweiten Glättung (Voreinstellung: u = 3);
    • grafische Darstellung #1 - die Signallinie:
      • ul - EMA-Zeitraum der Signallinie, angewendet auf den erdogischen Oszillator (Voreinstellung: ul = 3);
  • Ergänzend:
    • Ausgabe in einem eigenen Fenster;
    • Änderung der Art der grafischen Umsetzung: Farbe, Stärke und Art der Linien (Registerkarte „Farben“).
    • zwei Grenzen (voreingestellt auf -25 bzw. +25) - Grenze hinzufügen/entfernen; Ändern des Wertes, der Beschreibung der Grenze; Ändern der grafischen Abbildung der Grenzen (Registerkarte „Grenzen“);
    • Änderung der unteren (voreingestellt auf -100) und der oberen (voreingestellt auf + 100) Begrenzung des Maßstabs des separaten Indikatorfensters (Registerkarte „Maßstab“).
  • Beschränkungen:
    • q > 0;
    • r > 0, s > 0, u > 0. Sind r, s oder u gleich 1, erfolgt in dem entsprechenden EMA-Zeitraum keine Glättung
    • ul > 0. Bei ul = 1 deckt sich die Signallinie mit der des ergodischen Oszillators;
    • der Mindestumfang des Kursdatenfeldes ist gleich = (q-1 + r + s + u + ul-4 +1).


5.4. Programmcode des ergodischen DTI-Oszillators

Am Beispiel des Indikators Ergodic_DTI(q,r,s,u,ul) sehen wir:

1) Die Verbindung zwischen den Datenfeldern und Zwischenspeichern des Indikators sowie den grafischen Darstellungen:

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic Line
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,HMUBuffer,INDICATOR_CALCULATIONS);          // q-period Up Trend Momentum
   SetIndexBuffer(3,LMDBuffer,INDICATOR_CALCULATIONS);          // q-period Down Trend Momentum
   SetIndexBuffer(4,HLMBuffer,INDICATOR_CALCULATIONS);          // Composite q-period High/Low Momentum
   SetIndexBuffer(5,EMA_HLMBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsHLMBuffer,INDICATOR_CALCULATIONS);       // Composite q-period High/Low Momentum (absolute values)
   SetIndexBuffer(9,EMA_AbsHLMBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute values)
   SetIndexBuffer(10,DEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute values)
   SetIndexBuffer(11,TEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute values)

2) Den Algorithmus zur Berechnung von HLM und |HML|:

//--- calculation of HLM and |HLM|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         HLMBuffer[i]=0.0;     // zero values
         AbsHLMBuffer[i]=0.0;  //
         HMUBuffer[i]=0.0;     //
         LMDBuffer[i]=0.0;     //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      HMUBuffer[i]=High[i]-High[i-(q-1)];    HMUBuffer[i]=(HMUBuffer[i]>0)?HMUBuffer[i]:0;
      LMDBuffer[i]=-1*(Low[i]-Low[i-(q-1)]); LMDBuffer[i]=(LMDBuffer[i]>0)?LMDBuffer[i]:0;
      HLMBuffer[i]=HMUBuffer[i]-LMDBuffer[i];
      AbsHLMBuffer[i]=MathAbs(HLMBuffer[i]);
     }

Fazit

Der erste Teil des Beitrages „William Blaus Indikatoren und Handelssysteme in MQL5. Teil 1: Indikatoren“ liefert eine Darstellung der in MQL5 entwickelten Indikatoren und Oszillatoren aus dem Buch Momentum, Direction, and Divergence (nur englisch [dt. „Momentum, Richtung und Divergenz“] von William Blau.

Um den Einsatz dieser Indikatoren und Oszillatoren beim Fällen von Handelsentscheidungen geht es im zweiten des Beitrages „William Blaus Indikatoren und Handelssysteme in MQL5. Teil 2: Handelssysteme“.

 

Inhalt der gepackten Datei mit den Indikatoren (Blau_Indicators_MQL5_en.zip) im Anhang zu diesem Artikel:

Datei Beschreibung
Eingebettete Datei. Dateipfad: Dateiordner\MQL5\Include
 WilliamBlau.mqh  
Indikatoren. Dateipfad: Dateiordner\MQL5\Indicators
   Auf dem Indikator Momentum beruhende Indikatoren
 Blau_Mtm.mq5  Geschwindigkeitsindikator „Momentum“ (Momentum für den Zeitraum q, geglättetes Momentum für den Zeitraum q)
 Blau_TSI.mq5  Index der „wahren Stärke“, True Strength Index (normalisiertes geglättetes Momentum für den Zeitraum q)
 Blau_Ergodic.mq5  Ergodischer Oszillator (auf der Grundlage des True Strength Index)
   Auf der Stochastik beruhende Indikatoren
 Blau_TStoch.mq5  Stochastik(Stochastik-Indikator für den Zeitraum q; geglätteter Stochastik-Indikator für den Zeitraum q)
 Blau_TStochI.mq5  Stochastischer Index (normalisierter geglätteter Stochastik-Indikator für den Zeitraum q)
 Blau_TS_Stochastic.mq5  Stochastischer TS-Oszillator (auf der Grundlage des stochastischen Index)
   Auf dem stochastischen Momentum beruhende Indikatoren
 Blau_SM.mq5  Indikator der stochastischen Geschwindigkeit (Stochastisches Momentum für den Zeitraum q; geglättetes stochastisches Momentum für den Zeitraum q)
 Blau_SMI.mq5  Index der stochastischen Geschwindigkeit (normalisiertes geglättetes stochastisches Momentum für den Zeitraum q)
 Blau_SM_Stochastic.mq5  Stochastischer SM-Oszillator (auf der Grundlage des Index der stochastischen Geschwindigkeit)
   Auf der Abweichung vom Markttrend beruhende Indikatoren
 Blau_MDI.mq5  Indikator der mittleren Abweichung (Mittlere Abweichung, geglättete mittlere Abweichung)
 Blau_Ergodic_MDI.mq5  Ergodischer MDI-Oszillator (auf der Grundlage des Indikators der mittleren Abweichung)
   Auf der Konvergenz/Divergenz der gleitenden Durchschnittswerte beruhende Indikatoren
 Blau_MACD.mq5  Indikator der Konvergenz/Divergenz der gleitenden Durchschnittswerte (Konvergenz/Divergenz der gleitenden Durchschnittswerte [MACD]; geglättete MACD)
 Blau_Ergodic_MACD.mq5  Ergodischer MACD-Oszillator (auf der Grundlage des Indikators der Konvergenz/Divergenz der gleitenden Durchschnittswerte).
   Auf dem Kerzen- (Candlestick-) Momentum beruhende Indikatoren
 Blau_CMtm.mq5  Kerzengeschwindigkeitsindikator (Kerzenmomentum für den Zeitraum q, geglättetes Kerzenmomentum für den Zeitraum q)
 Blau_CMI.mq5  Index für das Kerzenmomentum (normalisiertes geglättetes Kerzenmomentum für den Zeitraum q; Normalisierung mit dem absoluten Wert des Kerzenmomentums für den Zeitraum q)
 Blau_CSI.mq5  Kerzenindex (normalisiertes geglättetes Kerzenmomentum für den Zeitraum q; Normalisierung mit der Länge der Kerze für den Zeitraum q)
 Blau_Ergodic_CMI.mq5  Ergodischer CMI-Oszillator (auf der Grundlage des Index für das Kerzenmomentum)
 Blau_Ergodic_CSI.mq5  Ergodischer CSI-Oszillator (auf der Grundlage des Kerzenindex)
   Auf dem Kerzenmomentum (Candlestick Momentum) beruhende Indikatoren
 Blau_HLM.mq5  Indikator für die virtuelle Schließung (aus den Höchst- und Tiefstwerten zusammengesetztes Momentum [HLM] für den Zeitraum q; geglättetes HLM für den Zeitraum q)
 Blau_DTI.mq5  Trendrichtungsindex (DTI) (normalisiertes geglättetes aus den Höchst- und Tiefstwerten zusammengesetztes Momentum für den Zeitraum q)
 Blau_Ergodic_DTI.mq5  Ergodischer DTI-Oszillator (auf der Grundlage des Trendrichtungsindex)

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/190

Beigefügte Dateien |
Einen interaktiven, halbautomatischen Drag-and-Drop Expert Advisor auf Grundlage vorab festgelegter Risiken und dem R/R-Verhältnis (relatives Risiko) bauen Einen interaktiven, halbautomatischen Drag-and-Drop Expert Advisor auf Grundlage vorab festgelegter Risiken und dem R/R-Verhältnis (relatives Risiko) bauen
Einige Händler führen all ihre Handel automatisch aus und einige arbeiten sowohl mit automatischen als auch manuellem Handeln auf Grundlage der Ergebnisse verschiedener Indikatoren. Da ich zur zweiten Gruppe gehöre, wollte ich ein interaktives Tool, mit dem ich Risiko- und Prämien-Levels direkt vom Chart aus dynamisch abschätzen kann. In diesem Beitrag wird erläutert, wie man einen interaktiven, halb-automatischen Expert Advisor mit vorab festgelegten Eigenkapitalrisiko und einem R/R-Verhältnis (relatives Risiko) implementiert. Das Expert Advisor Risiko sowie die Parameter für relativer Risiko und die Postengrößen können während der EA-Laufzeit in seinem Bedienfeld verändert werden.
Seil-Indikator von Erik Nayman Seil-Indikator von Erik Nayman
Der Beitrag erläutert die Erstellung des Seil-Indikators nach dem Buch von Erik L. Nayman The Small Encyclopedia of Trader. Dieser Indikator zeigt die Trendrichtung anhand berechneter Werte der Bären und Bullen für einen angegebenen Zeitraum. Im Artikel sind die Prinzipien der Erstellung und Berechnung des Indikators mit Code-Beispielen dargelegt. Auf Basis des Indikators wird ein Expert Advisor erstellt und alle äußeren Parameter werden optimiert.
Design und Implementierung neuer grafischer Benutzerschnittstellen-Widgets auf Grundlage der CChartObject Klasse Design und Implementierung neuer grafischer Benutzerschnittstellen-Widgets auf Grundlage der CChartObject Klasse
Nachdem ich den vorigen Beitrag über eine halb-automatischen Expert Advisor mit grafischer Benutzerschnittstelle verfasst hatte, hat sich herausgestellt, dass es durchaus wünschenswert ist, diese Schnittstelle noch mit einigen neuen Funktionalitäten für komplexere Indikatoren und Expert Advisors aufzupeppen. Nachdem ich mich mit den MQL5 Standard Library-Klassen vertraut gemacht hatte, habe ich neue Widgets implementiert. In diesem Beitrag geht es also um das Design und die Implementierung neuer MQL5 grafischer Benutzerschnittstellen-Widgets, die in Indikatoren und Expert Advisors verwendet werden können, und zwar: CChartObjectSpinner, CChartObjectProgressBar und CChartObjectEditTable.
Anlegen eines Spektrumanalysators Anlegen eines Spektrumanalysators
Der hier vorliegende Beitrag möchte seine Leser mit einer möglichen Variante der Verwendung der grafischen Objekte der Programmiersprache MQL5 vertraut machen. Es wird ein Indikator analysiert, der mithilfe grafischer Objekte ein Feld zur Steuerung eines einfachen Spektrumanalysators anlegt. Der Beitrag richtet sich an Leser mit Grundkenntnissen in MQL5.