Ein neuer Ansatz der Interpretation der klassischen und der versteckten Divergenz Teil II

21 Oktober 2019, 09:35
Alexander Lasygin
0
586

Einführung

Im ersten Artikel haben wir einen nicht standardisierten Ansatz für die Interpretation von Divergenz betrachtet. Wir analysierten die damit verbundenen grafischen Konstruktionen und berührten kurz die Divergenz selbst, die Qualität der Divergenzerkennung und deren Klassifizierung. Darüber hinaus behandelte der Artikel nicht das Filtern von gehandelten Deals basierend auf dem Muster. Was wir jedoch normalerweise als selbstverständlich hinzunehmen, ist nicht immer so klar. Ist die klassische Divergenzform noch effizient? Der Markt könnte sich so sehr verändert haben, dass dieser Ansatz nicht mehr relevant ist. In diesem Teil werfen wir einen tieferen Blick auf die klassische Version und ihre unübliche Interpretation. Wir werden versuchen, ein Urteil für diese Strategie abzugeben. Wenn das Ergebnis positiv ist, werden wir versuchen, seine Wirksamkeit zu erhöhen.

Bedingungen und Definitionen

Bevor ich zum Hauptteil komme, möchte ich ein wenig Vorgeschichte erwähnen, die als Grundlage für diese Forschung diente, sowie ihren "Nicht-Standard"-Charakter erklären. Ich arbeitete als technischer Analyst in einem Team von Gleichgesinnten, die versuchten, einen Handelsroboter basierend auf Divergenzprinzipien zu entwickeln. Meine Aufgabe war es, das Maximum an verwandten Daten zu sammeln, bestehende technische Analysewerkzeuge zu analysieren und die am besten geeignete Variante zu ermitteln.

Ich musste auch mögliche Entwicklungen von Ereignissen nach der Signalbildung berücksichtigen. Alle meine Recherchen und Analysen waren eine Verschwendung von Zeit und Mühe. Das gewünschte Ergebnis könnte erreicht werden, indem man denkt und nicht die Zeit von CPUs und Menschen verschwendet. Es gab jedoch positive Ergebnisse meiner Forschung. Es wurde ein anderer Indikator als der bestehende erstellt, einige Konzepte, die eine komplizierte technische Analyse erfordern, wurden geändert oder ausgeschlossen. Die Divergenz als Muster wurde jünger und wurde vereinfacht: ob sie existiert oder nicht, während Klassen wie A, B, C eliminiert wurden.

Die Divergenz als Signal erhielt ein neues Leben. Im Laufe dieser Arbeit wurde deutlich, dass jede Form der Mittelung, Glättung oder Neuberechnung nichts mit dem Marktverhalten zu tun hat. Dies ist ein Versuch, eine Tatsache in unsere Wahrnehmung zu integrieren. Wir haben nicht das Ziel, eine große Forschungsarbeit zu erstellen. Vorrangiges Ziel ist es, zu prüfen, ob dieses Muster für den Handel geeignet ist. Darauf werden wir später noch zurückkommen. Die Suche nach ähnlichen Daten ergab kein Ergebnis. Es schien, dass die Autoren die gleichen Quellen für den Erhalt grundlegender Informationen nutzten.

Die detaillierteste Beschreibung der auf diesem Prinzip basierenden Strategie lieferte Alexander Elder in seinem Buch "The Strongest Signal in Technical Analysis", das Divergenzen und Trendumkehrungen beschrieb. Nachdem ich dieses Buch gelesen hatte, hatte ich noch mehr Fragen. Der Autor hat eine obligatorische Bedingung gestellt: Der Indikator muss die Nulllinie überqueren, aber im Kapitel "Fehlen der rechten Schulter" beschreibt er die Momente, in denen dies eine optionale Bedingung ist.

Zu diesem Zeitpunkt hatte das MetaStock-Terminal noch nicht diesen Linien-MACD. Stattdessen wurden zwei MAs im Terminal-Subfenster ohne Nullbindung gezeichnet. Daher kann er nicht in der vom Autor beschriebenen Weise verwendet werden. Elder verwendet eine Version des MACD, die den Titel OsMA in den MetaTrader 4/5 Terminals trägt, aber im ganzen Buch heißt sie MACD. Es gibt keine Beschreibung der Konvergenz (umgekehrte Divergenz). Hier beschreibt der Begriff Konvergenz noch immer die Divergenz zwischen der Preisbewegung und dem Indikator. Darüber hinaus lehnt Elder die Analyse mit anderen Indikatoren ab, die keine Gleichgewichtslinie haben (Durchgang durch Null). Insbesondere wird die Stochastik erwähnt.

Für eine tiefere Analyse haben andere Autoren die Aufteilung des Hauptmusters in drei Untergruppen, A, B und C, hinzugefügt. Die Idee ist, dass je größer die Divergenz, desto größer das Signal, so dass die Konvergenz überhaupt nicht berücksichtigt werden sollte. Ist diese Idee wirklich gültig? Ich habe die entsprechende Verteilung als Beispiel im vorherigen Material gezeigt. Die Erklärung, warum ich mit dieser Abstufung nicht einverstanden war, ging über den Rahmen des ersten Teils hinaus, so dass beschlossen wurde, alles so zu lassen, wie es ist.

Die meisten dieser Begriffe werden nicht verwendet, während einige von ihnen nur zur Beschreibung des allgemeinen Bildes dessen, was geschieht, verwendet werden. Nachdem Sie dieses Material gelesen haben, können Sie die Vorstellung haben, dass Divergenz als Tatsache existiert, während die Divergenz-Konvergenz-Verteilung nur im Zusammenhang mit zusätzlichen grafischen Konstruktionen betrachtet wird, die im vorherigen Artikel beschrieben wurden. Die Divergenz selbst wird bedingungsmäßig in "Stopp" und "Umkehr" unterteilt. Warum ist die Aufteilung bedingt? Das Signal ist im Wesentlichen ein Stoppsignal. Dann kann das Bestätigungssignal zeigen, ob sich der Markt umkehren wird oder nicht.

Lassen Sie uns einige Beispiele betrachten.

Divergenz der Klasse A

Sie gilt als die Stärkste.

Bearish — das neue Kurshoch ist höher als das vorherige Hoch, während das neue Indikatorhoch niedriger ist als sein vorheriges Hoch.

Bullish — das neue Tief ist niedriger als das vorherige Tief, während das neue Tief des Indikators höher ist als sein vorheriges Tief.


Abb. 1

Eine solche Abweichung ist nach einer starken Preisbewegung (Momentum) zu beobachten. Meistens ist ein solcher Impuls ein Signal für die Entstehung eines neuen Trends, was bedeutet, dass die Divergenz der A-Klasse diese Regel durch ihre "Stärke" aufhebt, ebenso wie die Trägheit des Marktverhaltens und im Allgemeinen die gesamte Wellentheorie. Die rechte Hälfte der oberen Zahl kann Zweifel daran aufkommen lassen, ob das Muster richtig erkannt wird. Die folgenden Zahlen scheinen keinen Zweifel zu lassen.


Abb. 2

Ein solcher Anfang kann zu zwei, drei oder mehr Divergenzen führen. Je stärker die Dynamik, desto länger kann der Trend dauern. Dies widerspricht der Vorstellung, dass je größer die Divergenz, desto stärker das Signal.

Divergenz der Klasse B

Ein weniger signifikantes Marktsignal.

Bearish — Chart-Höchststände liegen auf dem gleichen Niveau, während der rechte Oszillator-Höchstwert niedriger ist als der linke.

Bullish — Die Höchstkurse liegen auf dem gleichen Niveau, während der rechte Indikatorwert höher ist als der linke.

Erinnert Sie das an etwas? Dies sind die klassischen Kerzenmuster Doppelspitze und Doppelboden. In der Quelle wird es als "Starkes Umkehrmuster des Marktes" beschrieben. Es ist also ein Umkehrmuster, kein stoppendes, das zu den fünf Hauptmustern gehört.


Abb. 3

Der letzte Subtyp.

Divergenz der Klasse C

Sie gilt als die schwächste. Es gibt die Meinung, dass dieses Muster ignoriert werden sollte.

Bearish — auf dem Kurs-Chart bildet sich ein neues Hoch, während die Indikator-Hochs auf dem gleichen Niveau liegen.

Bullish — der Preis bildet ein neues Tief, aber die Tiefs des Oszillators sind gleich.


Abb. 4

Ein solches Preisverhalten wird in der Regel bei starken Widerständen und Unterstützungsniveaus, während des sogenannten "falschen Zusammenbruchs" oder aktiver Aktionen von Market Makern beobachtet. Es ist mit der Trägheit des Indikators verbunden. Obwohl das Signal nicht als eindeutiger Einstiegspunkt behandelt werden kann, sollte es dennoch nicht ignoriert werden.

Es gibt viele andere Meinungsverschiedenheiten und Inkonsistenzen, aufgrund derer ich mich entschieden habe, diese Unterschiede genauer zu untersuchen. Wir werden keine globalen Begriffe und Konzepte ändern, um diejenigen, die mit ihnen vertraut sind, nicht irrezuführen und diejenigen, die weiterhin verwandte Materialien studieren werden.

Lassen Sie uns unsere Indikatoren analysieren.

MACD

Der MACD-Indikator wurde von Gerald Appel für die Aktienpreisanalyse erstellt. Der Indikator ist bei Händlern sehr beliebt. Diese Popularität ist darauf zurückzuführen, dass seine Wirksamkeit seit Jahren getestet wurde und somit viele zugehörige Materialien zur Verfügung stehen. Der Name "Moving Average Convergence/Divergence" deutet darauf hin, dass er so aussieht, als wäre er speziell für diesen Zweck entwickelt worden. Es gibt zwei Arten von Indikatoren: Linien-MACD und das MACD Histogramm. 

Linien-MACD:

  • MACD=EMAsn-EMAln
  • Signal=EMAmacd
  • MACD Histogram:
  • MACDn=Signal-MACD

wobei:

P ist der Preis, der in der Regel dem Schlusskurs der Periode entspricht, obwohl auch andere Optionen verfügbar sind (Open, High, Low, Close, Median Preis, Typical Preis etc.).

Die folgenden MACD-Einstellungen werden standardmäßig verwendet:

  • ЕМАs — (kurz) mit einem Zeitraum von 12 Tagen (zwei Wochen).
  • ЕМАl — (lang) mit einem Zeitraum von 26 Tagen (ein Monat).
  • EМАa — (Glättung der Differenz) mit einer Periodenlänge von 9 Werten. 

Beide Versionen werden in MetaTrader 5 vorgestellt, haben aber unterschiedliche Namen: MACD und OsMA. Es ist zu beachten, dass MACD im Terminal das lineare MACD ist, während das MACD-Histogramm durch OsMA dargestellt wird.

  

Abb. 5

Betrachten wir die Beiden.

Der MACD des MetaTrader 5 wird als Trendindikator dargestellt, daher wird erwartet, dass die klassische Abweichung das Trendende genau widerspiegeln muss. Allerdings ist es nicht so einfach. Dies ergibt sich nicht nur aus unterschiedlichen Interpretationsregeln für Indikatoren, sondern auch aus der Vielfalt der Mustertypen. Im ersten Teil habe ich erklärt, dass der Nulldurchgang ein klares Zeichen für das allgemeine Trendende ist. Das ist nicht ganz richtig. Es gibt die andere Meinung, dass ein leichter Nullausstieg ein stärkeres Signal für eine Umkehrung gibt.


Abb. 6

In diesem Fall ist das Kreuzen der Null eine obligatorische Bedingung. Insbesondere Alexander Elder teilt diese Ansicht. Und das ist nicht die allgemeinste aller Meinungsverschiedenheiten. Beide Regeln können verwendet werden, während die Anwendung jeder einzelnen von ihnen in einem Rahmen betrachtet werden sollte, wenn eine bestimmte Marktsituation vorliegt.

Das Hauptproblem tritt jedoch bei der Definition des Musters auf. Unser Oszillator basiert auf den Schlusskursen der Kerzen, warum suchen wir dann nach neuen Höhen und Tiefen?

  

Abb. 7

  

Abb. 8

  

Abb. 9

Welche ist die richtige Methode? Was ist wichtiger, der Preis oder der Indikatorwert? Ein weiterer Nachteil des Indikators ist der lange Berechnungszeitraum 26-12, der ihn für unbedeutende Preisbewegungen ungeeignet macht. Gemäß der klassischen Divergenzbedeutung sollte ein Fraktalpaar in Indikatorwerten gefunden und mit einer Preisbewegung verglichen werden. Das Fraktal bildet sich jedoch nicht in geringen Preisschwankungen aus. Aus Gründen der Übersichtlichkeit sollten wir die Standardversion verbessern. Wir werden die Balken in verschiedenen Farben zeichnen, je nach Bewegungsrichtung. Das ist nicht schwierig. Ändern wir den Standard-Code. Die Zeile

#property indicator_buffers 4

4 bis 5

#property indicator_buffers 5

Zeile

#property indicator_type1   DRAW_HISTOGRAM

ändert sich auf

#property indicator_type1   DRAW_COLOR_HISTOGRAM

und

#property indicator_color1  Silver

ändert sich auf

#property indicator_color1  Green,Red,Gold

Ein weiterer Puffer wird bei den Variablen deklariert

double                   Color_buff[];

und der Initialisierungsblock schaut nun wie folgt aus

   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,Color_buff,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);

Hier kann 

   SetIndexBuffer(1,Color_buff,INDICATOR_COLOR_INDEX);

nicht am Ende hinzugefügt werden, da es den Index 1 haben muss, da dies sonst nicht funktioniert.

Nun, um das Fraktal zu identifizieren, brauchen wir mindestens 3 Kerzen, also lassen Sie uns entsprechende Änderungen am Block vornehmen, die sich auf die Anzahl der Balken beziehen.

if(prev_calculated==0)
      limit=2;
   else limit=prev_calculated-1;

Mehrere Zeilen werden im Hauptteil hinzugefügt

//--- calculate MACD
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
      //--- calculate Color Macd
      if(ExtMacdBuffer[i]>ExtMacdBuffer[i-1])
         Color_buff[i]=0.0; // set color Green
      else
         Color_buff[i]=1.0; // set color Red
     }
//---

Abschließend fügen wir einen Block hinzu, in dem das MACD-Extremum bestimmt wird. Um ein erneutes Zeichnen zu vermeiden, erfolgt dies nach dem Schließen des aktuellen Balkens. Dazu wird die Berechnung um einen Balken verschoben.

for(i=limit;i<rates_total-1 && !IsStopped();i++)
     {
      if((ExtMacdBuffer[i-1]<0 && ExtMacdBuffer[i]>ExtMacdBuffer[i-1] && ExtMacdBuffer[i-1]<ExtMacdBuffer[i-2]) || 
         (ExtMacdBuffer[i-1]>0 && ExtMacdBuffer[i]<ExtMacdBuffer[i-1] && ExtMacdBuffer[i-1]>ExtMacdBuffer[i-2]))
         Color_buff[i-1]=2.0; // set color Gold
     }

Diese Variante impliziert, dass, wenn die MACD-Linie über Null liegt, wir nur UP-Fraktale (Hochs) identifizieren; und wenn MACD unter Null liegt, werden nur DNs (Tiefs) erkannt. Das ist falsch. Weiterhin verwenden wir die Variante, bei der der fraktale Typ (UP oder DN) nicht davon abhängt, wie die Hauptindikatorlinie relativ zu Null positioniert ist.

Die Automatisierung einiger Momente der Musterexistenz ist schwer zu realisieren, und so kann nur eine visuelle Beobachtung zu einem positiven Ergebnis führen.

  

Abb. 10

Ein Versuch, diesen Mangel zu kompensieren, wurde in der Klasse Expert/Signal/SignalMACD durchgeführt. Die Dokumentation enthält Folgendes:

  • Divergenz ist, wenn die erste analysierte Untertasse (trough) des Oszillators flacher ist als der vorherige, und der entsprechenden Kurs-Untertasse tiefer ist als der vorherige.
  • Doppelte Divergenz ist, wenn der Oszillator drei aufeinanderfolgende Untertassen (troughs) gebildet hat, von denen jede flacher ist als die vorherige; und der Preis drei entsprechende Untertassen gebildet hat, und jede von ihnen ist tiefer als die vorherige.


 Abb. 11

Auch hier bringt uns die Beschreibung, dass "die erste analysierte Untertasse des Oszillators flacher ist als die vorherige, und die entsprechende Untertasse tiefer ist als die vorherige", zurück zur Hühner- oder Ei-Frage. Was kommt zuerst, die Preisbewegung oder der Indikatorwert? Wie können die Indikatorwerte, die sich aus den Preiswerten ergeben, wichtiger sein als die Preisreihen? Darüber hinaus enthält die Beschreibung keine spezifischen Informationen. Wie viele Balken sollten für die Berechnung verwendet werden: drei, fünf oder die gesamte Historie? Diese Methode kann auf Nicht-Standard-Methoden zurückgeführt werden, aber ihre Implementierung in der klassischen Version hat mehr Nachteile als Vorteile. Man sollte sie jedoch nicht ganz ablehnen. In Einzelfällen ist nur dieser Indikator anwendbar.

Als eine der Automatisierungsvarianten können wir den gleichzeitigen Einsatz von MACD+OsMA betrachten. Der OsMA-Indikator wurde ähnlich wie beim MACD verbessert.


Abb. 12

Wie wir wissen, ist der OsMA gleich dem MACD, er wird nur als Histogramm der Differenz zwischen dem Signal und der MACD-Hauptleitung dargestellt. OsMA ist empfindlicher als MACD, obwohl es nicht immer ausreichend ist und der Indikator daher Signale verpassen kann. Manchmal ist er jedoch zu empfindlich und bedarf daher einer zusätzlichen Bestätigung.

  

Abb. 13

Wenn zwei Indikatoren verwendet werden, muss man bestimmen, welcher von ihnen als führend, welcher als ergänzend angesehen werden soll, d.h. die Abweichung, welcher der Indikatoren als obligatorisch anzusehen ist, während der andere optional ist. 

Außerdem denke ich, dass ein weiterer Nachteil mit der Möglichkeit verbunden ist, Indikatorparameter auszuwählen. Wenn die RSI-Berechnungsperiode nur die Linienamplitude beeinflusst, ändert sie in MACD, OsMA, Stochastic das Aussehen. Man kann sagen, dass sich die Marktbedingungen ändern und diese Möglichkeit ist notwendig, während der Indikator für die Börse erstellt wird und seine Parameter für den einstündigen Zeitraum gewählt wurden". Aber ich würde sagen, dass diese Möglichkeit nicht in einer Anpassung, aber es ist im Zusammenhang mit der Anpassung.

Natürlich kann in einem Anfangszustand eine Reihe von Parametern für das spezifische Symbol und die Diagrammperiode erforderlich sein, aber wenn der Indikator später ineffizient wird, sollten Sie besser aufhören, alles zusammen zu verwenden. Aber das ist rein meine persönliche Meinung. Das Fehlen der Möglichkeit einer "Überanpassung" wurde einer der Gründe für die Verwendung des AC-Indikators (Accelerator/Decelerator) im ersten Teil des Materials. Dies ist nicht der einzige mögliche Indikator. Alle Indikatoren haben ihre spezifischen Vorteile. Alle Regeln, die zuvor für AC beschrieben wurden, gelten für alle anderen Indikatoren. Wir haben das oben Gesagte im Kontext der klassischen Divergenz analysiert, aber es gilt auch für die umgekehrten/versteckten Divergenzregeln. Wie Sie sehen können, sind nicht alle klassischen Ideen eindeutig. Kann dieses Werkzeug in seiner traditionellen Form also als hochwertiges Signal verwendet werden?

Bevor wir diese Frage beantworten, lassen Sie uns einen Blick auf andere Indikatoren werfen, die traditionell zur Lösung der oben genannten Aufgabe verwendet werden.

Stochastic

Der Oszillator Stoсhastiс ist ein technischer Indikator, der die Preisdynamik als Prozentsatz misst. "Der Begriff Stochastik bezieht sich auf die Abweichung zwischen dem Schlusskurs der aktuellen Periode und seiner Preisspanne über einen bestimmten Zeitraum." Der Indikator wurde von George Lane im März 2007 erstellt.

Er besteht aus zwei Linien:

  • %K Periode — schnelle Stochastik (durchgezogene Linie). Die Anzahl der Balken, bei denen die niedrig-hochwertigen Werte gesucht werden sollen.
  • %D Periode — langsamer Stochastik (gestrichelte Linie). Die SMA-Periodenlänge für %K.
  • Slowing — (Verlangsamung) dieser Parameter bezieht sich auf %K. Er stellt die Glättung ein.
  • %K=((CLOSEn-LOWn)/(HIGHn-LOWn))*100

wobei:

  • CLOSEn — Schlusskurs der Vorperiode:
  • LOWn — der niedrigste Preis der letzten n Perioden
  • HIGHn — der höchste Preis der letzten n Perioden
  • %D         — gleitender Durchschnitt von %K. Für die Linie können verschiedene Mittelungsverfahren verwendet werden: einfache MA, exponentielle MA, geglättete oder lineare gewichtete Mittelung. Es ist auch möglich, die Preisreihen High/Low oder Close/Close zu ändern.

Die Definition enthält das Wort "Divergenz". Wenn die Idee mit MACD klar ist, ist sie mit normalisierten Oszillatoren etwas schwieriger zu verstehen. Das Konzept des "normalisierten Oszillators" kann definiert werden als das, das seine Werte in einem starren Rahmen verändert. In unserem Fall liegt der Wert zwischen 0 und 100. Die Funktion setzt spezifische Bedingungen. Auf der Werteskala sind drei Zonen markiert. Dies sind die überkaufte Zone (80%), die überverkaufte Zone (20%) und die Hauptbewegung. Die Berechnungsspezifika schaffen Bedingungen, unter denen die Indikatorlinie die Extrembereiche über einen längeren Zeitraum nicht verlässt und nicht in sie eintritt.


Abb. 14

Es mag den Anschein haben, dass die Fähigkeit, zwei verschiedene Preisklassen zu verwenden, die MACD-Frage löst, welche man verwenden soll. Hier tritt ein weiteres Problem auf. Aus Abbildung 14 ist ersichtlich, dass die Close-basierte Stochastic die Extrempositionen "100 - 0" häufiger einnimmt als die auf High/Low basierende. Dies ist mit der Formel für die Indikatorberechnung verbunden. Wir beobachten auch viele Hochs und Tiefs.


Abb. 15 

Für diese Fälle gibt es keine klare Regelung. Infolgedessen sind die Divergenzen zwischen den Punkten 100-100 und 92.31-92, 22, schwer zu automatisieren. In der typischen Version der Berechnung werden zwei nächstgelegene Fraktale verwendet. In unserem Fall sind dies alles andere als die engsten Fraktale. Es gibt jedoch "zu jeder Regel eine Ausnahme". So können wir den Nachteil in einen Vorteil verwandeln. Durch die Änderung der Einstellungen entsprechend dem Berechnungszeitraum können wir die Änderungen des M15-Diagramms auf dem M5-Diagramm darstellen.


Abb. 16

Der Vorteil dieser Option besteht darin, dass wir die Divergenzerkennung in globalen (erweiterten) Marktsegmenten leicht automatisieren können und ohne Verzögerung ein frühzeitiges Eintrittssignal erhalten, verbunden mit der Notwendigkeit, auf das Schließen der Kerzen des höheren Zeitrahmens zu warten. Diese Segmente sind in den Abbildungen 16-17 durch rote Linien dargestellt. In einigen Fällen kann dies entscheidend sein.


Abb. 17

Aus der obigen Abbildung können wir deutlich erkennen, dass, wenn wir auf der Grundlage von MTF-Signalen eingestiegen wären, unser Geschäft verloren gegangen wäre, während die Alternative es uns ermöglicht hätte, Geld zu verdienen. Ein ähnlicher Ansatz gilt für MACD.


Abb. 18

Neben einer scheinbaren Reduzierung der Anzahl der Signale ermöglicht diese Lösung eine deutliche Erhöhung der Wahrscheinlichkeit eines profitablen Geschäfts und damit eine Steigerung der Gesamtrentabilität. Wir haben uns ein Beispiel für М5-М15 angesehen. Was ist, wenn wir M5-H1 verwenden?


Abb. 19

Die Verwendung der schnellen und langsamen Stochastik löst nur einen Teil der Probleme. Bei der Erstellung von Expert Advisors auf der Grundlage solcher Prinzipien haben wir die gleichen Probleme, wie bei der Verwendung von schnellen und langsamen MACD (MACD + OsMA). Wie soll man priorisieren? Dies löst nicht das Hauptproblem, wie man die Fülle der stochastischen Zeilenumbrüche beim Erstellen des Divergenzindikators filtert. Wir können es uns nicht leisten, jeden Liniendurchbruch zu überprüfen. Das würde zu viel Rauschen erzeugen, und deshalb sind wir gezwungen, dies auf zwei, selten drei Sequenzen zu beschränken.

Wir werden später auf das Problem der Signalfilterung zurückkommen. Konzentrieren wir uns nun auf die Regeln, die bei der Suche nach Divergenzen zu beachten sind. Später wird erklärt, warum wir kein klares NEIN setzen.

1) Logischerweise verstehen wir, dass der Preis vor einer Divergenz (Konvergenz) einen kritischen Wert erreichen muss. Dementsprechend muss auch die Indikatorlinie ein kritisches Niveau erreichen. In unserem Fall muss der Indikator in die Zone überkauft/überkauft eintreten. Ein neues Hoch/Tief auf dem Markt zu haben, ist in diesem Fall eine optionale Bedingung. In unserem Fall muss sich der zweite Punkt (links) vom aktuellen Balken in dieser Zone befinden, wenn wir nach einer klassischen Abweichung suchen. Für eine versteckte (umgekehrte) Divergenz sollte der erste Punkt dagegen auf einem kritischen Niveau liegen.


Abb. 20

2) Wenn Sie nach einem Signal suchen (manuell oder durch einen Algorithmus), suchen Sie es im nächsten Extrem mit den Sequenzen, die Fälle aus Abbildung 20 ausschließen. Die maximale Anzahl solcher Sequenzen beträgt drei.

Abb. 21

Auch wenn es den Anschein hat, dass Abbildung 15 der Regel 1 entspricht, in der sich die linke Spitze in der überkauften Zone befindet, hebt das Vorhandensein von mehr als drei Indikatorpunkten das Signal auf.

 

RSI 

Es ist ein weiterer Indikator, der in unserer Untersuchung verwendet werden kann. Wie Sie vielleicht bemerkt haben, wird die Aufgabe mit jedem Schritt schwieriger.

Der RSI (Relative Strength Index) ist der Indikator, der von J. Welles Wilder im Juni 1978 eingeführt wurde.

RSI=100-100/(1+U/D)

wobei: 

  • U ist der durchschnittliche Preisänderungswert im positiven Bereich (CLOSEn>CLOSEn-1). 
  • D ist der durchschnittliche Preisänderungswert im negativen Bereich (CLOSEn<CLOSEn-1). 
Wir verwenden die obige Formel, die sich von der ursprünglichen unterscheidet, wie unten gezeigt:
  • RSI=(SMMAn) von U(SMMAn) von D
  • n - SMMA Berechnungszeitraum.

Es wird auch im Bereich von 0-100 normiert. Im Gegensatz zur Stochastik enthält sie jedoch keine Optionen zur Linienglättung. Dies erschwert die Analyse. Die übermäßige Empfindlichkeit führt zu vielen Liniendurchbrüchen. Wie in der folgenden Abbildung zu sehen ist, hält der Indikator nur bei sequentieller unidirektionaler Preisbewegung eine direkte lineare Bewegung aufrecht. In anderen Fällen handelt es sich um eine sägeartige Linie.

  

Abb. 22

Umso wichtiger ist in diesem Fall die Notwendigkeit, Indikatorwerte zu filtern. Lassen Sie uns nun eine der Problemlösungsoptionen betrachten.

Wir haben bereits die Frage angesprochen, welche, wenn die beiden primär sind: die Preisreihen oder die Indikatorwerte. In diesem Fall müssen wir eine Antwort finden. Es gibt nicht viele Tools, die bei der Analyse des Preisverhaltens helfen können. Dazu gehören verschiedene Arten von MAs, Fraktalen und ZigZag.

Fraktale (von Bill Williams)

Die Standardvariante beinhaltet eine Fünf-Fraktale Variante. Dieses Fraktal löst jedoch nicht das Filterproblem. Im Gegenteil, manchmal fügt es mehr Rauschen hinzu, da die Signale von der Hauptanzeige abweichen.


Abb. 23

Ähnlich wie beim RSI gibt es viele Signale in Seitwärtsbewegungen, die gefiltert werden müssen. Ein weiterer Nachteil ist die Verzögerung bei der Bildung einer Struktur von fünf Balken. Die Verzögerung entspricht mindestens eine Kerze, was völlig unerwünscht ist.

Der MA ist ein hervorragendes Glättungsinstrument. Aber es hat viele Variationen. Die MAs unterscheiden sich in den Glättungsoptionen: SMA (einfache Mittelung), EMA (exponentielle Mittelung), SMMA (geglättete Mittelung), LWMA (lineare gewichtete Mittelung); im verwendeten Preis: Schließen, Öffnen, Hoch, Niedrig, Median ((high+low)/2), Typisch ((high+low+close)/3), Gewichtet ((high+low+low+close+close)/4); und im Berechnungszeitraum, der von 1 bis ∞ variieren kann. Dies betrifft den klassischen MA (Moving Average). Zusätzlich gibt es einen doppelten exponentiellen gleitenden Durchschnitt. Außerhalb des Standardpakets MetaTrader 5 gibt es noch weitere Typen. Wir stellen uns nicht die Aufgabe, "alle möglichen Optionen für alle Divergenz-Suchalgorithmen zu analysieren, um eine optimale Version zu finden". 

ZigZag ist ein "Indikator zur Bestimmung extremer Preise bei Preisschwankungen, wobei Amplitude und Periode entsprechend der Filterabweichung" eingestellt sind.

Basierend auf der Definition ist dies das, was wir brauchen. Das gleiche Problem tritt hier auf. Der RSI basiert auf Schlusskursen, ZigZag hingegen auf Hoch/Tief.


Abb. 24

Diese Nachteile können teilweise durch das Erstellen eines RSI auf Basis des Medianpreises ((high+low)/2) ausgeglichen werden.


Abb. 25

Wie aus Abbildung 24 ersichtlich ist, beträgt die Abweichung in der Position von Indikatorfraktalen und Preisfraktalen nicht mehr als zwei Balken und kann daher mit Hilfe von Software leicht kompensiert werden. Bitte beachten Sie, dass wir in unserem Fall nur an der Form des Signals und nicht an seinen Werten interessiert sind. Das heißt, der Basisindikator wird nur zur Erkennung von Divergenzen verwendet und nicht für einzelne Handelssignale.

Daher können wir mit den Einstellungen für unsere divergenzspezifische Nutzung "spielen". Wenn man weiß, dass die RSI-Berechnungsperiode die Signalform nicht beeinflusst und nur die Amplitude, während die ZigZag-Einstellungen die Position der Extremwerte nicht verändern, kann man ein beeindruckendes Ergebnis erzielen.

Gemäß der für die Stochastik geltenden Regel: "Vor der Bildung des Divergenzmusters müssen die Indikatorwerte kritische Überkaufs-/Überverkaufswerte erreichen". In unserem Fall sind dies Zonen unter 30 und über 70. Hier können wir durch die Änderung der ZZ-Parameter sowohl kurzfristige Signale als auch deren globale Werte erhalten. Diese Parameter können sich gegenseitig kompensieren, und so ermöglicht die Kombination von 2+1 (zwei Filter + ein Basisfilter) die Verfolgung des Gesamtbildes. Die Anzahl der Filter ist nicht auf zwei beschränkt und kann gleich drei oder mehr sein. Darüber hinaus werden wir bei der Betrachtung der Zielgrößen feststellen, dass wir durch die Aufteilung der Signale in Gruppen in der Lage sein werden, den größten Teil der Marktbewegung durch den Handel mit spezifischen Signalen zu erfassen.


Abb. 26

In Abbildung 26 ist der RSI im ersten Signal nicht in die überverkaufte Zone eingedrungen. Wir können einfach die Berechnungsperiode ändern und dadurch die Amplitude erhöhen — in diesem Fall erscheint der RSI in der entsprechenden Zone.

CCI

Der Commodity Channel Index gehört zu den Oszillatoren. Es wurde 1980 von Donald Lambert entwickelt.  

CCIn=(1/0.015)*((TypicalPrice-SMA)/MedianDeviation)

Einer der Vorteile dieses Indikators ist sein Momentumscharakter. Auf diese Weise kann nicht nur der Zustand des überkauften/überverkauften Marktes, sondern auch die anfängliche Marktdynamik bestimmt werden. In unserem Fall kann dieser Vorteil als Nachteil angesehen werden. Obwohl seine klassische Version nach dem Typischen Preis berechnet wird, zeigt seine Linie immer noch eine Sägezahnform, ähnlich der des RSI. Daher gelten die RSI-Anwendungsspezifikationen auch für diese CCI. Die Preisreihen müssen nicht nur nach Typ (High, Low, Close, etc.), sondern auch nach der Erkennung von Preisextremen gefiltert werden.


Abb. 27

Aufgrund dieses Verhaltens müssen wir den Algorithmus ändern, wenn wir bei der Suche nach Divergenzen mehrere Liniendurchbrüche verwenden.


Abb. 28

Eine ähnliche Situation tritt bei anderen Indikatoren selten auf, aber bei CCI ist sie es recht häufig.

Aufgrund des spezifischen Verhaltens gilt der Indikator als eines der besten Werkzeuge für Operationen, die auf dem im ersten Artikel beschriebenen Prinzip basieren. Das Prinzip ist wie folgt: "Linien, die sich von den letzten umgekehrten Divergenzen (zuletzt Bullish und Bearish) erstrecken und auf dem Preisdiagramm dargestellt werden, dienen als Unterstützungs-/Widerstandslinien der Preise (Abb. 29) oder Unterstützungs-/Widerstandslinien für die Indikatorlinie bei klassischen Indikatoren, die in einem Oszillatorfenster dargestellt werden (Abb. 30)".


Abb. 29


Abb. 30

Momentum 

Momentum spiegelt die Preisänderungsrate wider. Ein weiterer Name für den Indikator ist RoC (Rate of Change). Der Unterschied zwischen ihnen ist folgender: Die Gleichgewichtslinie des RoC ist 0, während sie im Momentum 100 ist. Der Indikator wurde von John Murphy in seinem Buch "Technical Analysis of Futures Markets" beschrieben.

Momentum=Pn-Pn-1

wobei Momentum der Impuls über n Perioden wie zum Zeitpunkt t (aktuelle Periode) ist.

Diese Variante ist nicht sehr komfortabel, da sie Daten aus dem Anlagenpreis liefert. Daher wurde die Formel ergänzt.

  • Pt — aktueller Preis
  • Pt-n — Preis n Perioden zuvor
  • RoCtn=(Momentum/Pt-n)*100

Jetzt ist der reguläre Momentum der RoC, aber der RoC ist der übliche Momentum-100. Das Prinzip der Indikatorberechnung besteht in der Bewertung von Impulsbewegungen. Daher hat es die gleichen Probleme, wie CCI und RSI: eine Sägezahnlinie. Hier erzeugt diese Bewegung noch mehr Signale.


Abb. 31

Es ist nicht klar, was man mit einer solchen Fülle von Signalen anfangen soll. Auch die automatisierte Version kann fehlerhaft funktionieren, wie in Abbildung 31 dargestellt. Nach den vorliegenden Informationen zu diesem Indikator wurde er nicht im Zusammenhang mit der Identifizierung von Abweichungen verwendet. Es wird die Meinung vertreten, dass es je nach Berechnungszeitraum die Anforderungen des kurzfristigen Handels (Periode 6-14) erfüllen kann, während es bei einer Periode über 20 als Trendindikator dient, anhand dessen das Trendende eindeutig identifiziert werden kann. Wenn wir davon ausgehen, dass die Vorstellung, dass ein Trend aus drei aufeinanderfolgenden Momentums besteht, wahr ist (Wave Market Theory), dann können die Momentum-Prinzipien wirklich helfen, das Trendende zu identifizieren. Vielleicht ist eine umfassendere Analyse der Funktionsweise des Indikators erforderlich. 

ADX

Die Idee des Directional Movement Index (DMI) wurde 1978 von Wells Wilder in seinem Buch "New Concepts in Technical Trading Systems" vorgeschlagen. Das war die Idee hinter der Entwicklung dieses Instruments.

Der ADX wird auf der Grundlage von zwei weiteren Indizes mit einer positiven Richtung (+DI) und einer negativen Richtung (- DI) unter Berücksichtigung des Average True Range (ATR) berechnet.

ADX=(MAn(+DI - -DI)/(+DI + -DI))*100

wobei: 

  • +DI — positiver Richtungsindex 
  • -DI — negativer Richtungsindex
  • MASMA (gleitender Durchschnitt)
  • n — MA Berechnungszeitraum 

Die Formel wird in vereinfachter Form dargestellt. Eine detaillierte Beschreibung ist hier verfügbar.

Der Indikator hat viele Linien, während die ADX-Hauptlinie nicht die Trendrichtung anzeigt. Daher mag es den Anschein haben, dass der Indikator für uns nicht geeignet ist.

  

Abb. 32

Das ist eine falsche Annahme. Der Indikator kann auf verschiedene Weise verwendet werden. Als Erstes: die Definition der Divergenz zwischen der Preisrichtung und der Marktaktivität. Wenn also der Preis weiter sinkt, während ADX sinkt, deutet dies auf eine Divergenz hin.


Abb. 33

Diese Methode könnte unserer Kollektion hinzugefügt werden. Die Komplexität dieser Methode ist mit der Richtungsbestimmung verbunden. Eine der Lösungen beinhaltet die erste Bewertung der Bewegung der Preisreihen. D.h. wir analysieren die Abfolge der absteigenden Untertassen oder der steigenden Spitzen. Ein Problem kann auftreten, wenn die nächstgelegene Spitze unter dem vorherigen liegt, während der nächstgelegene Tiefpunkt über dem vorherigen liegt oder umgekehrt, d.h. die so genannten internen und externen Balken (Begriffe im Zusammenhang mit Preisaktionen).

  

Abb. 34

Der zweite Weg ist die Verwendung der Linien +DI und -DI. Vergessen Sie nicht, dass -DI-Spitzen immer einem Tief im Preisdiagramm entspricht. In einem Aufwärtstrend (+DI liegt über -DI) nutzen wir die +DI-Linie, um Spitzen zu untersuchen, um klassische Abwärts-Divergenzen zu finden, oder -DI-Spitzen, um versteckte Aufwärts-Divergenzen zu finden. In einem Abwärtstrend (+DI liegt unter -DI) analysieren wir -DI-Spitzen, um klassische Abwärts-Divergenzen zu finden, und +DI-Spitzen, um versteckte Abwärts-Divergenzen zu finden.


Abb. 35

Die dritte Methode, die meiner Meinung nach die effektivste ist, besteht darin, beide oben genannten Methoden anzuwenden. Diese Option löst viele Probleme. Es ermöglicht das Auffinden von Divergenzen auf der ADX-Leitung ohne Verzögerung, verbunden mit dem Warten auf eine Umkehrung. Die Signale sollten je nach Typ in Abhängigkeit vom allgemeinen Trend ohne den Einsatz zusätzlicher Instrumente gefiltert werden.

An dieser Stelle möchte ich den Teil über klassische Oszillatoren abschließen. Warum haben wir AO, AC, TRIX, WPR und andere ähnliche Indikatoren nicht berücksichtigt?

Es wurden Indikatoren mit ursprünglicher Berechnungsformel zur Analyse ausgewählt.

WPR(10) ist gleich der Stochastik(10.1.1 (Low/High)) mit einer invertierten Skala. Die Stochastik arbeitet im Bereich von 0-100, während der Bereich des WPR 100-0 beträgt.


Abb. 36

Der Awesome Oscillator (AO) ist ähnlich wie MACD(5.35.1 Median). Der einzige Unterschied besteht darin, dass AO mit SMA (Simple Averaging) geglättet wird, während EMA (Exponential Averaging) bei MACD verwendet wird, was etwas schneller ist. Wie aus der folgenden Abbildung ersichtlich ist, ergeben sich hieraus keine wesentlichen Änderungen in der Signalform.


Abb. 37

Der Accelerator ist ähnlich wie OsMA (5.34.5 Median) mit dem gleichen Unterschied wie bei MACD und AO.


Abb. 38

Der TRIX basiert auf gleitenden Durchschnitten und das gleiche Ergebnis kann durch die Auswahl der MACD-Parameter erreicht werden.

  

Abb. 39

 

Volumina 

Es gibt eine Vielzahl von Strategien zur technischen Analyse. Eine separate Gruppe enthält Strategien, die Volumina verwenden. Es ist eine kleine Gruppe. Meiner Meinung nach werden Volumina im Forex-Markt nicht so oft genutzt, wie sie sollten. Auch wenn es keine realen Volumina im Forex-Markt gibt (nur Tick-Volumina). Es wird ein separates Material zu den Bänden geben. Betrachten wir sie nun im Zusammenhang mit der Divergenz.

Es gibt nur sehr wenige Indikatoren, die das Volumen in ihrem Algorithmus verwenden und die im MetaTrader 5 Terminal-Standardpaket enthalten sind. Dazu gehören Accumulation/Distribution (Mark Chaikin), Money Flow Index (er kann als Volume RSI bezeichnet werden, da die Formeln ähnlich sind), On Balance Volume (Joseph Granville), Market Facilitation Index (Bill Williams) und Volume. Der Forex Index von Alexander Elder gehört ebenfalls zu dieser Gruppe, obwohl er im Abschnitt Oszillatoren enthalten ist. Es gibt nur sehr wenige Instrumente dieser Art, weshalb wir bei der Analyse von Volumenabweichungen oft auf das folgende Bild stoßen:

  

Abb. 40

Wie aus der obigen Abbildung ersichtlich ist, funktioniert diese Methode gut bei der Analyse des Marktes mit historischen Daten, aber die Erstellung von automatisierten Tools ist schwierig. Diese Methode hat viele Nachteile. Dazu gehören die unterschiedlichen Handelsvolumina in den verschiedenen Sitzungen und die damit verbundenen Verzerrungen. Wir wissen, dass das Volumen der asiatischen Sitzungen geringer ist als das der europäischen und amerikanischen Sitzungen. Spikes treten sowohl zu Beginn des Trends als auch beim Abschluss von Geschäften auf. Im letzteren Fall kann das Volumen noch größer sein.

  

Abb. 41

Spikes von Volumina können bei Pressemitteilungen auftreten.

  

Abb. 42

Diese Aufgabe kann teilweise gelöst werden, indem man einen beliebigen anderen Indikator verwendet, der anstelle der Volumina eine Saldenlinie verwendet. Dies kann SMA von Volumen über einen bestimmten Zeitraum sein. Auf diese Weise können Sie kleine Werte herausfiltern. Einer dieser Indikatoren ist BetterVolume.


Abb. 43

Eine weitere Möglichkeit, das Problem zu lösen, besteht darin, die Preisspanne und den Volumenindikator zu kombinieren. Definieren wir das Volumen der Kerze, die ein neues Hoch (Tief) bildeten, und vergleichen wir die Volumina. Lassen Sie uns die klassische Variante nach unserem Algorithmus bearbeiten.

Das Histogramm hat fünf Farben statt zwei.

#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  Green,Red,Blue,Magenta,Gray
  1. Grün - fpr low[i]>low[i-1] und high[i]>high[i-1].
  2. Rot     - wenn low[i]<low[i-1] und high[i]<high[i-1].
  3. Blau   - für einen Außen-Aufwärtsbalken
  4. Magenta - für einen Außen-Abwärtsbalken
  5. Grau - nichts vom oben Gesagten 

Der Hauptberechnungsblock unterscheidet sich nicht vom Standardvolumenindikator. Zusätzlich enthält die Funktion CalculateVolume für die Einfärbung von Histogrammbalken.

void CalculateVolume(const int nPosition,
                     const int nRatesCount,
                     const long &SrcBuffer[],
                     const double &h[],
                     const double &l[],
                     const double &o[],
                     const double &c[])
  {
   ExtVolumesBuffer[0]=(double)SrcBuffer[0];
   ExtColorsBuffer[0]=0.0;
//---
   for(int i=nPosition;i<nRatesCount && !IsStopped();i++)
     {
      //--- calculate indicator color
      ExtVolumesBuffer[i]=(double)SrcBuffer[i];
      ExtColorsBuffer[i]=4.0;
      //--- uptrend, UP bar ----
      if(h[i]>h[i-1] && l[i]>l[i-1]&& o[i]<c[i])ExtColorsBuffer[i]=0.0;
      //--- uptrend, DN bar ----
      if(h[i]>h[i-1] && l[i]>l[i-1]&& o[i]>c[i])ExtColorsBuffer[i]=3.0;
      //--- downtrend, DN bar ----
      if(h[i]<h[i-1] && l[i]<l[i-1]&& o[i]>c[i])ExtColorsBuffer[i]=1.0;
      //--- downtrend, UP bar ----
      if(h[i]<h[i-1] && l[i]<l[i-1]&& o[i]<c[i])ExtColorsBuffer[i]=2.0;
      //--- outside UP bar ----
      if(h[i]>h[i-1] && l[i]<l[i-1] && o[i]<c[i])ExtColorsBuffer[i]=2.0;
      //--- outside DN bar ----
      if(h[i]>h[i-1] && l[i]<l[i-1] && o[i]>c[i])ExtColorsBuffer[i]=3.0;
      //--- inside bar ----
      if(h[i]<h[i-1] && l[i]>l[i-1])ExtColorsBuffer[i]=4.0;
     }
//---
  }
//+------------------------------------------------------------------+


Abb. 44 

Diese Variante vereinfacht die Analyse, ist aber nicht perfekt. Es können einige weitere Optionen angeboten werden, bis hin zur globalen Änderung des Berechnungsprinzips. Aber vergiss nicht, dass manchmal die alten Wege die besten sind. Wenn sich frühere Ideen nicht verbreitet haben, dann werden wir sie nicht berücksichtigen. Und Zweifel an irgendetwas kann uns helfen, die Divergenzerkennung mit diesem Indikator zu automatisieren. Konzentrieren wir uns stattdessen auf gängigen Ideen.

Money Flow Index 

Er wurde bereits früher erwähnt, die Berechnung ist ähnlich dem RSI.

Price=(high+low+close)/3

MF=Price*Volume

MR=positiveMF/negativeMF

MFI=100-100/(1+MR)

Meiner Meinung nach ist er besser geeignet, überkaufte/überverkaufte Zonen zu identifizieren als der RSI, denn die Idee des überverkauften/überkauften Zustandes bezieht sich nicht auf die Größe der Preisänderung über den Berechnungszeitraum, sondern die Anzahl der Akteure, die an diesem Prozess teilgenommen haben. Das ist genau das, was MFI tut. Dadurch spiegelt er einen kausalen Zusammenhang besser wider. Er hat aber auch die gleichen Nachteile.


Abb. 45

  On Balance Volume

(Joseph Granville)

Wenn der aktuelle Schlusskurs höher ist als der Vorherige:

OBVn=OBVn-1-Volumen

Wenn der aktuelle Schlusskurs niedriger ist als der Vorherige:

OBVn=OBVn-1-Volumen

Wenn der aktuelle Schlusskurs gleich dem Vorherigen:

OBVn=OBVn-1

Wobei:

  • OBVn — Indikatorwert für Balance Volume in der aktuellen Periode;
  • OBVn-1 — Indikatorwert für Balance Volume in der Vorperiode;
  • Volumen — aktuelles Balkenvolumen.

Referenzen geben nur sehr wenige Informationen über diesen Indikator. Sie liefern jedoch die Kernidee: OBV-Änderungen gehen Preisänderungen voraus. So können wir die Divergenz zwischen der Preisbewegung und den Volumina nutzen.


Abb. 46

Eine der Divergenz in der obigen Abbildung ist mit einem Fragezeichen gekennzeichnet. Die Marktbewegung war unbedeutend und der Hauptfaktor ist der Übergang zu einem neuen Tag, während im asiatischen Markt keine signifikante Volatilität zu erwarten ist. Später werden die Zielwerte zeigen, dass diese Volatilität wirksam war.

Force Index

(Alexander Elder).

Force Index=Volumen*(CLOSEn-CLOSEn-1)

Die Formel des Originals unterscheidet sich von der im Terminal implementierten.

Force Index=Volumen*(MAn-MAn-1)

Der Grund dafür ist mir nicht ganz klar, aber es gibt keine signifikante Änderung der Signalform, was für unsere Zwecke durchaus akzeptabel ist.


Abb. 47 

Aspekte anderer Signale, die durch diesen Indikator erzeugt werden, und ihre Unterschiede gehen über den Rahmen dieses Artikels hinaus.

Wie bereits erwähnt, wurde dieser Indikator der Klasse der Oszillatoren zugeordnet, obwohl Alexander Elder in seinem Buch schreibt: "Ich halte es für das beste Instrument zur Volumenmessung in den Märkten"

Darüber hinaus nutzt Elder dieses Tool, um nach Divergenzen zu suchen.


Abb. 48

Einstieg und Ziele (Targets)

Die klassische Eingaberegel lautet wie folgt:

Nachdem die Diskrepanz identifiziert wurde, platzieren Sie eine Buy-Stop-Order auf dem Hoch der Kerze, der der letzte in der Musterbildung für die Aufwärts-Divergenz war; setzen Sie eine Sell-Stop-Order auf dem Tief der letzten Kerze bei einer Abwärts-Divergenz.


Abb. 49

Diese Option kann als optimal angesehen werden, wenn es darum geht, den maximal möglichen Gewinn zu erzielen. Innerhalb dieser Methode kann eine Position am oberen Rand von "Envelopes (26)" eingegeben werden (die Abweichung wird entsprechend der Marktvolatilität ausgewählt).


Abb. 50

Optional kann man an der Grenze eines äquidistanten Kanals eintreten, der auf der Grundlage von Divergenzbildungspunkten gebaut wurde, wobei der dritte Punkt das Hoch (Tief) zwischen dem ersten und dem zweiten Punkt ist.


Abb. 51

Der Stop-Loss wird unterhalb des Tiefs für einen Kauf oder oberhalb des Hochs für einen Verkauf gesetzt. Dieser "ideale" Ansatz eignet sich jedoch nur für ein ideales Muster, das alle Regeln und zusätzlichen Bestätigungsanforderungen erfüllt. Es eignet sich auch für große Zeiträume, in denen es möglich ist, zusätzlich die Marktlage zu analysieren und rechtzeitig auszusteigen.


Abb. 52

Dieser variable Take-Profit ist vor der Positionseröffnung schwer zu bestimmen. Der Level kann sich im Laufe der Zeit ändern. Einer der Mängel: Es ist sehr schwierig, das mögliche Ergebnis der Transaktion zu berechnen. In solchen Fällen kann eine zuverlässigere Variante verwendet werden. Lassen Sie uns eine Trendlinie erstellen. Der Deal wird nach dem Trendliniendurchbruch abgeschlossen, der als Trendänderungssignal und zusätzliche Bestätigung dient. In den meisten Fällen wird es fast dem klassischen Variantenlevel entsprechen, aber mehr Vertrauen schaffen.


Abb. 53

Wir können die Regeln aus dem ersten Teil mit einer korrekten Zeichnung der Linien verwenden. Manchmal müssen die durch ein Kennzeichen erzeugten Zeilen angepasst werden.

Bei solchen Positionen werden die Ziele auf Unterstützungs-/Widerstandsniveau gesetzt.


Abb. 54

Bei doppelten und dreifachen Divergenzen kann das Ziel am Ende der ersten Signalbildung eingestellt werden (oft der Fall). Seltener ist es möglich, ein Fraktal zwischen den ersten Divergenzbildungspunkten oder am Anfang zu verwenden.


Abb. 55

Ist es immer notwendig, Stopp-Levels festzulegen? Natürlich wählt jeder seinen eigenen Handelsstil und seine eigenen Regeln für das Money Management. Das Handeln ohne Stopp-Level oder mit den sehr weit entfernten Levels ist nur für sehr erfahrene Händler empfehlenswert. Ein solcher Händler muss sich auf entsprechende technische Analysen und Indikatoren verlassen können und in der Lage sein, seine Aktionen spontan anzupassen, z.B. ein Geschäft zu ändern oder ein verlorenes Geschäft manuell zu schließen, bis es außer Kontrolle gerät.

Erstellen eines Handels-Tools

Unser Ziel ist es nicht, bestehende Regeln zu kritisieren. Wir müssen die verfügbaren Informationen neu analysieren und anwendbare Schlussfolgerungen ziehen. Jeder Autor, der ein Trading-Tool erstellt, ist bestrebt, ein bestimmtes gewünschtes Ergebnis zu erzielen. Der Indikator wird in der Regel für einen bestimmten Markt angelegt. Manchmal ist die zugrunde liegende Idee nicht ganz klar. Oftmals versteht nur der Autor die Details der Signalinterpretation.

Händler könnten versuchen, diesen Indikator unter anderen Bedingungen anzuwenden und so die allgemeine Idee und die potenziellen Gewinne zu verlieren. Deshalb finden Händler oft stabil verlierende Handelsroboter. Was passiert, wenn wir die Handelsrichtung ändern? Wird sich daraus ein stabiler Gewinn ergeben?

Unser Ziel ist ähnlich: Was wäre wenn. Einige der Ergebnisse im Zusammenhang mit diesem Ansatz wurden im ersten Teil veröffentlicht. Jetzt müssen wir es in einem anderen Aspekt umsetzen. Lassen Sie uns das Instrument einsetzen, das seine Nachteile hat, aber unter bestimmten Bedingungen immer noch ein gutes Ergebnis liefert, und dieses Ergebnis kann mit anderen Instrumenten nicht erreicht werden. Dies ist der ADX-Indikator. Wir alle kennen seine Nachteile. Durch die doppelte Glättung kommt es zu einer Verzögerung. Die Richtung ihrer Hauptlinie, wie auch ihrer anderen Linien, stimmt nicht mit der Richtung der Marktbewegung überein. Dadurch ergeben sich Schwierigkeiten bei der Interpretation des Indikators. Der Autor wollte die Stärke zeigen, aber nicht die Richtung.


Abb. 56


Abb. 57

Aus diesem Grund scheint DI+ in Ordnung zu sein, während die DI- auf den Kopf gestellt wird. Hier fallen die Linienspitzen mit Untertassen zusammen.


Abb. 58

Ich kenne die Gründe nicht, warum J. Wells Wilder einen solchen Indikator im Rahmen des Parabolsystems geschaffen hat. Ich kann annehmen, dass es für die Börse geschaffen wurde, in der sich der Handel vom Forex-Markt unterscheidet. Aktien werden oft über einen längeren Zeitraum gekauft, um Dividenden zu erhalten oder zu Kapitalisierungszwecken.

Lassen Sie uns mit diesem speziellen Merkmal arbeiten. Wir müssen die besten Seiten nutzen und sie so effizient wie möglich nutzen. Sein bester Vorteil ist, dass er Spitzen und Untertassen entsprechend dem Markttrend (Marktstärke) durch die Trennung in die positiven und negativen Komponenten erkennen kann. Diese Lösung ermöglicht es Ihnen auch, zu verstehen, was auf dem Markt passiert. Ob es sich nun um den Druck der Käufer auf die Verkäufer in einem fallenden Markt oder um den Druck der Verkäufer in einem steigenden Markt handelt, ob es sich um einen Rückgang der Gesamtaktivität aufgrund eines Rückgangs der Teilnehmer handelt, oder ob die Händler einfach beschlossen haben, eine Pause einzulegen, um zu analysieren, was passiert. Wir werden noch weiter gehen. Wir können es leicht in eine vertraute Form eines Oszillators mit einer Nullausgleichslinie verwandeln, die auf der parabolischen Bewegung der Hauptindikatorlinie basiert. Dies kann durch Entfernen der Reduzierung des Hauptwertes auf einen absoluten Wert ( ADX) erreicht werden. Löschen Sie aus der folgenden Zeile:

         dTmp=100.0*MathAbs((ExtPDIBuffer[i]-ExtNDIBuffer[i])/dTmp);

die Funktion MathAbs.

Als Ergebnis erhalten wir den folgenden Indikator:


Abb. 59


Abb. 60

Wie aus der obigen Abbildung ersichtlich ist, zeigt unser ADX (nennen wir es ADX_Osc) eine gute Marktrichtung, auf deren Grundlage wir global nach Divergenzen suchen können. Die Linie ist noch etwas verzögert. Dieser Nachteil kann durch vorläufige Marktumkehrsignale kompensiert werden. Sie werden anhand von "DI-" und "DI+" ermittelt.


Abb. 61

Um besser zu verstehen, warum der Unterschied zwischen DI- (rote Linie) und dem Preis so bestimmt wird, lesen Sie bitte noch einmal den Teil zu ADX. Wir sehen es an der Abbildung: Der Druck der Käufer in einem Abwärtstrend hat begonnen, was zu einer weiteren Konsolidierung führt, und es gibt eine Bestätigung durch die Hauptlinie des Indikators. Aber wir brauchen einen ernsteren Grund, um zu kaufen. Aus Abb. 60 ist ersichtlich, dass der Markt seine Abwärtsbewegung fortgesetzt hat.

Was für die Entscheidungsfindung verwendet werden kann, ist die "unidirektionale" Linie von DI- und DI+. Warum "unidirektional", wenn der Preis gleichzeitig zu steigen und zu fallen scheint. Wir verstehen, dass dies nicht möglich ist. Das ist der Unterschied. Solche Momente entstehen, wenn eine so genannte "inside bar" erscheint.

Lassen Sie uns das überprüfen. Preisaktion: "Die "Inside Bar" (IB) ist ein Satz von Kerzen, die sich im Bereich der vorherigen Kerzen befinden, der den höchsten Tiefstwert und den niedrigsten Höchstwert aufweist, der größer ist als der vorherige. In hohen Zeitrahmen sieht das Setup oft wie ein Dreieck aus. Die Inside Bar zeigt Unsicherheit und Marktkonsolidierung an. Sie findet sich in der Regel im Trendmarkt, wo es auf eine Trendfortsetzung nach dem Zusammenbruch des Mutter-Kerze hinweist. Dies geschieht oft an den Hochs/Tiefs des Marktes, auf der Ebene der Hauptunterstützungs/-widerstandslevel und in den Seitwärtskanälen."

Unser Fall ist für diese Definition nicht ganz geeignet. Wie Sie sich wahrscheinlich erinnern, bestimmen wir die Stärke, aber nicht die Richtung. Deshalb sollte unsere Definition so lauten: "Bulls power des aktuellen Balkens ist geringer als die der vorherigen, während Bears power größer ist als die des vorherigen Balkens. Die Form des Balkens ist irrelevant."


Abb. 62

Hier behalten wir noch die Grundidee bei: Der Balken signalisiert Marktstopp oder -umkehr. Bei der Beurteilung seiner Qualität berücksichtigen wir die Haupttrendrichtung (Stärke), die durch die ADX_Osc-Linie ) repräsentiert wird. Wenn sich der Trend entwickelt, ist der ADX-Linienwert höher als der vorherige für den Aufwärtstrend und niedriger für den Abwärtstrend. Dies deutet auf eine Konsolidierung hin (Stop-Preis). Wenn sich der Trend abschwächt, die Hauptlinie im Aufwärtstrend abnimmt und im Aufwärtstrend steigt (Divergenz), dann können wir mit einer Marktumkehr rechnen. Das ist alles, was wir für die Erstellung unseres Indikators benötigen.

Natürlich kann ADX noch viel mehr. Aber unsere Aufgabe ist es nicht, alle seine Möglichkeiten zu nutzen.

Hier kommt ein kleiner Exkurs, bevor wir weitermachen. Vor einiger Zeit wurde mein Angebot, einen Artikel zu schreiben, abgelehnt. Mir wurde geraten, einen Blog zu starten. Aber ich hatte bereits vor dieser Veröffentlichung viel Arbeit geleistet. Der Artikel enthielt nur Auszüge, die mir wesentlich erschienen. Niemand erklärte damals, dass der Artikel Programmcode enthalten muss. Allerdings wurde ich entmutigt. Später kam ich auf die Idee zurück und wollte meine Forschungsergebnisse mitteilen. Wieder lag ich daneben. Eine einfache Präsentation der Idee überzeugte die Moderatoren nicht. Diesmal beschloss ich, alles zu schreiben, was dem Ergebnis vorausging. Natürlich enthält dieses Material nicht 100% der Details. Bevor wir zur Endphase unserer Forschung kommen, möchte ich kurz erwähnen, warum das erzielte Ergebnis wertlos erscheinen mag.

Im vorherigen Artikel haben wir kurz auf die Problematik der Indikatoren eingegangen, die auf grafischen Konstruktionen basieren. Solche Werkzeuge sind schwer weiter zu analysieren, da dies im Anpassungsmodus nicht möglich ist. Sie können nur visuell analysiert werden, was sehr zeitaufwendig ist. Die Indikatorsignale sind sehr schwer zu durchlaufen, so dass ihr Code dem Expert Advisor Code hinzugefügt werden muss. Es gibt auch Probleme mit der korrekten Zeichnung der Linien, was zu falschen Markteintrittssignalen führt. Dieses Problem kann gelöst werden, aber das ist nicht Thema dieses Artikels.

Wir sollten dieses Problem wahrscheinlich an die Entwickler von MQL-Sprachen richten: Warum ist es nicht möglich, grafische Objekte als Maschinencodebibliothek zu erstellen? Warum kann ein Puffer, dessen Daten wir übergeben müssen (als Plot oder als Daten), nicht separat zum Hauptdiagrammfenster und seinem Unterfenster gehören? Vielleicht schreibt jemand einen Artikel zu diesem Thema oder ich möchte es selbst tun. Basierend auf dem oben genannten, lassen Sie uns das vorläufige Ergebnis zusammenfassen. Meiner Meinung nach haben wir den am besten geeigneten Indikator für einen nicht standardisierten Ansatz ausgewählt, der in der Lage ist, unsere Hauptaufgabe zu erfüllen. Basierend auf der Analyse habe ich seine Verhaltensmomente bestimmt, die optimal für die Implementierung sind und den Bildschirm nicht überlasten. Wir werden nicht alle grafischen Konstruktionen im Indikator vermeiden, da die Hauptaufgabe nicht die Handelsautomatisierung ist, sondern die Möglichkeit, den Indikator im Handel anzuwenden. 

Bitte beachten Sie, dass wir kein spezifisches Gesamtkonzept erstellen. Dies ist ein "Testgelände" für die weitere Arbeit. Jeder kann dieses Tool als Grundlage für die Umsetzung spezifischer Wunschmerkmale nutzen. Aus diesem Grund implementieren wir den "Nicht-Standard-Ansatz" nur für den kurzfristigen Trend, während wir die klassische Lösung für globale Signale verwenden.  

Der Hauptcode des ADX bleibt ohne wesentliche Änderungen. Wir nehmen ein paar Änderungen vor, um ihn als Oszillator zu implementieren. Aus diesem Grund kann ADX nicht einfach über ein Handle aufgerufen werden. 

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_color1  LightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
#property indicator_type3   DRAW_LINE
#property indicator_color3  Red
#property indicator_style3  STYLE_DOT
#property indicator_width3  1
#property indicator_label1  "ADX"
#property indicator_label2  "+DI"
#property indicator_label3  "-DI"
//--- Eingabeparameter
input int InpPeriodADX=14; // Period
input int extremum=100; // Extremum (<1 Div= OFF)
input int Gep=4; // Point to Gep
input int Bars_Calculated=300;
//--- Globale Variablen
input bool   allLine=false;// All Line
int    ExtADXPeriod;
double PDI,NDI,pDI,nDI;
string short_name="";
int    wid=-1;
//---- Puffer
double    ExtADXBuffer[];
double    ExtPDIBuffer[];
double    ExtNDIBuffer[];
double    ExtPDBuffer[];
double    ExtNDBuffer[];
double    ExtTmpBuffer[];
double    ExtUpBuffer[];
double    ExtDnBuffer[];

Einige der Eingabeparameter benötigen eine Erklärung.

input int extremum=100; // Extremum (<1 Div= OFF)

Dies ist die Anzahl der Extremwerte der Indikatorlinien, die wir auf Abweichungen überprüfen lassen. Die Mindestanzahl ist "1". Ist sie kleiner, wird keine Berechnung durchgeführt. Später, nach dem Bestimmen der optimalen Zahl, ist es besser, sie zu einem globalen Parameter zu machen.

input bool   allLine=false;// All Line

Dieser Parameter ermöglicht es, auf dem Bildschirm die Linien aller Divergenzen anzuzeigen, die beim Laufen des Indikators festgestellt und durch den Parameter "extremum" definiert wurden. Speziell eingestellt, um die Indikatoranalyse zu vereinfachen und den Wert des obigen Parameters zu bestimmen.


Abb. 63


Abb. 64

input int Gep=4; // Point to Gep

Es wird für ästhetische Zwecke verwendet. Die durch diesen Parameter bestimmten Punkte mit einer Streuung von Werten werden als eine Linie angeordnet. Ich habe diesen Wert als eineinhalb bis zwei Spreads bestimmt. Es hat keinen Einfluss auf den Abstand. Wenn Sie den Offset benötigen, sollten Sie diesen Wert zusätzlich einstellen. Die Punkte werden später erläutert. Um die Funktion OnDeinit zu reduzieren, verwenden wir einen Befehl zum Löschen aller Daten mit einem Präfix, das dem Indikatornamen entspricht. Das MetaTrader 5 Terminal kann beim Löschen einer großen Anzahl von Objekten auf dem Hauptbildschirm eine gewisse Verlangsamung aufweisen. Um dies zu vermeiden, fügen wir ein erzwungenes Neuzeichnen des Bildschirms hinzu.

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,short_name);
   ChartRedraw(0);
  }
//+------------------------------------------------------------------+

Es stellte sich heraus, dass, wenn das Terminal über einen längeren Zeitraum nicht verbunden war, grafische Objekte im Subfenster ihre Bindung nicht an die Preis-/Zeitkoordinaten, sondern in Pixeln ihrer letzten Position behalten. Deshalb lassen Sie uns im Block, der die Anzahl der Balken für die erste Berechnung bestimmt, einen Befehl zum Löschen hinzufügen. Es könnte eine bessere Lösung dafür geben, aber ich habe dieses Problem wie folgt gelöst.

   if(prev_calculated>1) start=prev_calculated-1;
   else
     {
      OnDeinit(9);
      start=1;
      ExtPDIBuffer[0]=0.0;
      ExtNDIBuffer[0]=0.0;
      ExtADXBuffer[0]=0.0;
     }

Die Hauptberechnungsfunktion des Indikators wurde um einen Block erweitert, der die unidirektionale Bewegung der Linien von DI+ und DI- bestimmt.

//+------------------------------------------------------------------+
//|           Fast divergence calculation                            |
//+------------------------------------------------------------------+
   int bar=start;
   if(prev_calculated<2) bar=start+2;
   if(Bars_Calculated>0)bar=fmax(rates_total-Bars_Calculated,start);
//---
   for(int i=bar;i<rates_total-1 && !IsStopped();i++)
     {
      ExtUpBuffer[i-1]=EMPTY_VALUE;
      ExtDnBuffer[i-1]=EMPTY_VALUE;
      //---
      color clrUp=clrLime;
      color clrDn=clrDarkViolet;
      //---
      if((ExtPDIBuffer[i-1]<ExtPDIBuffer[i-2] && ExtNDIBuffer[i-1]<ExtNDIBuffer[i-2]) || 
         (ExtPDIBuffer[i-1]>ExtPDIBuffer[i-2] && ExtNDIBuffer[i-1]>ExtNDIBuffer[i-2]))
        {
         if(ExtPDIBuffer[i-1]>ExtNDIBuffer[i-1])
           {
            if(ExtADXBuffer[i-1]>ExtADXBuffer[i-2])
               ExtUpBuffer[i-1]=high[i-1];
            else
              {
               ExtUpBuffer[i-1]=EMPTY_VALUE;
               ExtDnBuffer[i-1]=low[i-1];
               clrDn=clrGold;
              }

            //---
            if(MathAbs(ExtUpBuffer[i-1]-ExtUpBuffer[i-2])<Gep*_Point)
               ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
            if(MathAbs(ExtDnBuffer[i-1]-ExtDnBuffer[i-2])<Gep*_Point)
               ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
            //---
           }
         if(ExtPDIBuffer[i-1]<ExtNDIBuffer[i-1])
           {
            if(ExtADXBuffer[i-1]<ExtADXBuffer[i-2])
               ExtDnBuffer[i-1]=low[i-1];
            else
              {
               ExtDnBuffer[i-1]=EMPTY_VALUE;
               ExtUpBuffer[i-1]=high[i-1];
               clrUp=clrBlue;
              }

            //---
            if(MathAbs(ExtDnBuffer[i-1]-ExtDnBuffer[i-2])<Gep*_Point)
               ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
            if(MathAbs(ExtUpBuffer[i-1]-ExtUpBuffer[i-2])<Gep*_Point)
               ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
            //---
           }
        }
      //---
      if(ExtUpBuffer[i-1]==EMPTY_VALUE)
         ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
      if(ExtDnBuffer[i-1]==EMPTY_VALUE)
         ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
      //---
      if(ExtUpBuffer[i-1]!=EMPTY_VALUE)
        {
         ArrowCreate(short_name+(string)time[i]+(string)Lime,time[i],ExtUpBuffer[i-1],ANCHOR_BOTTOM,clrUp);
         if(ExtUpBuffer[i-1]!=ExtUpBuffer[i-2])
            ArrowCreate(short_name+(string)time[i-1]+(string)Lime,time[i-1],ExtUpBuffer[i-1],ANCHOR_BOTTOM,clrUp);
        }
      else
         ArrowCreate(short_name+(string)time[i]+(string)Lime,time[i],ExtUpBuffer[i-2],ANCHOR_BOTTOM,clrUp);
      //---
      if(ExtDnBuffer[i-1]!=EMPTY_VALUE)
        {
         ArrowCreate(short_name+(string)time[i]+(string)Red,time[i],ExtDnBuffer[i-1],ANCHOR_TOP,clrDn);
         if(ExtDnBuffer[i-1]!=ExtDnBuffer[i-2])
            ArrowCreate(short_name+(string)time[i-1]+(string)Red,time[i-1],ExtDnBuffer[i-1],ANCHOR_TOP,clrDn);
        }
      else
         ArrowCreate(short_name+(string)time[i]+(string)Red,time[i],ExtDnBuffer[i-2],ANCHOR_TOP,clrDn);
     }

Außerdem wurde hier das Modul zum Starten der globalen Berechnungsfunktionen der Divergenz hinzugefügt.

//+-------------------- Finding a discrepancy ----------------------+
   bar=start;
   if(bar>rates_total-2)bar=rates_total-2;
   if(Bars_Calculated>0)bar=fmax(rates_total-Bars_Calculated,bar);
   for(int i=bar;i<rates_total-2 && !IsStopped() && extremum>0;i++)
     {
      UP(i,ExtADXBuffer,high,time);
      DN(i,ExtADXBuffer,low,time);
     }

Der Indikator aus Teil 1 wurde von MQL4 neu geschrieben. Diese Version wurde ursprünglich in MQL5 geschrieben, deshalb wurde die Divergenzsuche geändert.

Suchfunktion für eine Bearish-Divergenz.

//+----------- Ermitteln von Aufwärts-Divergenzen --------------------+
void UP(int l,const double &buf[],const double &high[],const datetime &time[])
  {
   if(Extremum(buf[l+1],buf[l],buf[l-1])<0)
     {
      int i=l;
      for(int j=0;j<extremum;j++)
        {
         int counted=LastPeak(i,buf);
         if(counted!=-1)
           {
            if(buf[l]<buf[counted] && high[l]>high[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]>buf[l]+k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],high[l],high[counted],Red,STYLE_SOLID);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Red,STYLE_SOLID);
                  break;
                 }
              }

            if(buf[l]>buf[counted] && high[l]<high[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]>buf[l]-k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],high[l],high[counted],Red,STYLE_DOT);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Red,STYLE_DOT);
                  break;
                 }
              }
           }
         i=counted;
        }
      //---
     }
  }

Suchfunktion für eine Bullish-Divergenz.

//+----------- Ermitteln von Abwärts-Divergenzen ---------------------+
void DN(int l,const double &buf[],const double &low[],const datetime &time[])
  {
   if(Extremum(buf[l+1],buf[l],buf[l-1])>0)
     {
      int i=l;
      //---
      for(int j=0;j<extremum;j++)
        {
         int counted=LastTrough(i,buf);
         if(counted!=-1)
           {
            if(buf[l]>buf[counted] && low[l]<low[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]<buf[l]-k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],low[l],low[counted],Green,STYLE_SOLID);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Green,STYLE_SOLID);
                  break;
                 }
              }
            if(buf[l]<buf[counted] && low[l]>low[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]<buf[l]+k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],low[l],low[counted],Green,STYLE_DOT);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Green,STYLE_DOT);
                  break;
                 }
              }
           }
         i=counted;
        }
      //---
     }
  }

Der Hauptunterschied liegt im zusätzlichen Filter. Ich habe herausgefunden, dass für die Fälle in den Abbildungen 20 und 28 das Signal einen positiven Trend von weniger als 30% aufweist. Deshalb wurden sie entfernt. Der Code des Filters ist hervorgehoben. Die Funktion zur Erkennung von Extremum hat sich ebenfalls geändert. Das Filtern nach positivem und negativem Wert der Position der Indikatorlinie wurde davon ausgenommen. In unserem Fall ist dies nutzlos und kann sogar schädlich sein. Da die Linie gleiche Werte auf dem aktuellen und vorherigen Balken annehmen kann, bieten wir die Möglichkeit, dass die Hauptdefinition gleich Null ist. 

Die Suchregeln können bei Bedarf nachträglich leicht geändert werden.

//+-- Search for extrema --------------------------------------------+
int Extremum(double a,double b,double c)
  {
   if((a-b)*(b-c)<=0)
     {
      if(c>b) return(1); //DN extremum
      if(c<b) return(-1);//UP extremum
     }
   return(0);
  }

Die Suche nach der linken Schulter ist nahezu unverändert.

//+----- Suchen des zweiten Aufwärts-Extremums ----------------------+
int LastPeak(int l,const double &buf[])
  {
   for(int i=l-2; i>4; i--)
     {
      int ext=Extremum(buf[i+1],buf[i],buf[i-1]);
      if(ext < 0)return (i);
     }
   return (-1);
  }
//+----- Suchen des zweiten Abwärts-Extremums -----------------------+
int LastTrough(int l,const double &buf[])
  {
   for(int i=l-2; i>4; i--)
     {
      int ext=Extremum(buf[i+1],buf[i],buf[i-1]);
      if(ext > 0)return (i);

     }
   return (-1);
  }

Die folgende Funktion erstellt die zuvor genannten Punkte. Die Punkte markieren kurzfristige Abweichungen.

//+-------------------- Creates an arrow -----------------------------+ 
bool ArrowCreate(string                  name,
                 datetime                time,
                 double                  price,
                 ENUM_ARROW_ANCHOR       anchor,
                 color                   clr)
  {
//--- reset the error value 
   ResetLastError();
//--- create an arrow 
   if(!ObjectCreate(0,name,OBJ_ARROW,0,time,price))
     {
      Print(__FUNCTION__,
            ": failed to create an arrow! Error code = ",GetLastError());
      return(false);
     }
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,167);
//--- set the binding type 
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
//--- successful implementation 
   return(true);
  }
//+------------------------------------------------------------------+ 

Die Hauptzeichenblöcke wurden ebenfalls geändert, um die Möglichkeit zu bieten, alle Divergenzlinien oder nur die letzte in dem durch den Parameter " extremum" angegebenen Intervall anzuzeigen.

Für das Hauptdiagrammfenster

//+------ Erstellen von Objekten auf dem Chart ----------------------+
void DrawPriceTrendLine(datetime T_0,datetime T_1,double P_0,double P_1,color color_0,int style)
  {
   string name_0=short_name+"Line_Sn"+ColorToString(color_0);
   string name_1="";
   if(allLine)
      name_1=short_name+DoubleToString(T_0,0);
   else
      name_1=short_name+DoubleToString(T_1,0);
//--- 
   ObjectDelete(0,name_1);
   drawLineS(name_1,T_0,T_1,P_0,P_1,color_0,style,0,true,false,0);
//+-----------+
   if(style==STYLE_DOT)
     {
      ObjectDelete(0,name_0);
      drawLineS(name_0,T_1,T_0,P_1,P_0,clrAqua,0,3,true,true,0);
     }
  }

und im Indikatorfenster

//+------ Erstellen von Objekten im Fenster des Indikators ----------+
void DrawIndicatorTrendLine(datetime T_0,datetime T_1,double P_0,double P_1,color color_0,int style)
  {

   int window=wid;
   string name_0=short_name+"Line_Pn"+ColorToString(color_0);
   string name_1="";
   if(allLine)
      name_1=short_name+DoubleToString(T_0+wid,0);
   else
      name_1=short_name+DoubleToString(T_1+wid,0);
//---
   ObjectDelete(0,name_1);
   drawLineS(name_1,T_0,T_1,P_0,P_1,color_0,style,0,false,false,window);
//---
   if(style==STYLE_SOLID)
     {
      ObjectDelete(0,name_0);
      drawLineS(name_0,T_1,T_0,P_1,P_0,clrMagenta,style,2,true,true,window);
     }
  }

Aus dem gleichen Grund wurde der Löschbefehl von der Funktion zur Konstruktion der Trendlinien in den Hauptblock verschoben.

//+------------------------------------------------------------------+
void drawLineS(string name,datetime T_0,datetime T_1,double P_0,double P_1,color clr,
               int style,int width,bool back,bool ray,int window)
  {
   ObjectCreate(0,name,OBJ_TREND,window,T_0,P_0,T_1,P_1,0,0);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(0,name,OBJPROP_STYLE,style);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,width);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_BACK,back);
  }

Jetzt sieht der Indikator so aus:


Abb. 65

Zusätzlich zu den üblichen Divergenzlinien sehen wir viele Punkte, die Konsolidierungszonen markieren und als Einstiegspunkte für Verkaufs- und Kauf-Positionen dienen. Diese Signale werden durch die ermittelten Regeln (unidirektionale Bewegung von DI+ und DI-) bestimmt. Grüne Punkte zeigen Kauf-Einstiegspunkte, Verkaufs-Einstiegspunkte sind violett. Das Auftreten blauer Punkte vor einem Hintergrund grüner Knöpfe oder gelber Punkte vor lila zeigt Trendunsicherheit und mögliche Veränderungen an. Nach dem Eröffnen einer Position können die Punkte als Level für Trailing-Stopps dienen. Bitte beachten Sie, dass es unerwünscht ist, dass Sie auf Basis der Punkte mit Pending-Orders zu arbeiten. Erstens identifizieren die Punkte kurzfristige Markttrends und können zu Fehlauslösungen führen. Ein Handelssignal tritt auf, wenn die Kerze über (unter) dieser Level schließt. Die Variable Gap wird zum Zeichnen verwendet. Der Algorithmus ist wie folgt: Nach dem Auftreten eines Verkaufssignals erscheint ein Punkt unterhalb des Tiefstwerts des Balkens, an dem das Signal gebildet wird. Bei Kaufsignalen wird ein Punkt über Hoch platziert. Der Abstand zu Hoch/Tief wird durch die Funktionen implementiert, die Ankerpunkte ANCHOR_BOTTOM und ANCHOR_TOP bestimmen. Danach werden alle Signale in einem Abstand von "+\- Gap" basierend auf dem ersten Punkt erzeugt.

Diese Version kann weiter geändert werden. Sie können beispielsweise versuchen, die Verzögerung der Hauptlinie zu reduzieren. Die einfachste Lösung besteht darin, die zweite Glättungsperiode zu reduzieren und in Variablen zu verschieben. Wir können auch den Teil über die klassische Signalerkennung löschen und den zuvor erwähnten Algorithmus in Bezug auf MACD hinzufügen. Nur die Einstiegslevel werden auf dem Chart angezeigt. So vermeiden wir unnötige Zeichnungen.

Wir können diese Ideen überprüfen, indem wir einen kleinen Roboter bauen. Wir sind nicht an der klassischen Variante und an der Hauptlinienrichtung interessiert. Dies ermöglicht es uns, den Standard-ADX vom Terminal aus zu verwenden. Der Filter wird nur angewendet, wenn der Ausbruchskerzen zu groß ist. In Fällen, in denen es keine Linie eines gegenüberliegenden bedingten Kanals gibt, in der Stopps gesetzt werden können, geben Sie den Abstand Stop Loss ein. Außerdem müssen wir im EA den Abstand von Hoch/Tief einstellen. Nachfolgend finden Sie die Testergebnisse für die wichtigsten Währungspaare: EUR/USD, GBP/USD, USD/JPY für den Zeitraum vom 01.01.2016 bis 01.06.2019 und den Zeitrahmen H1 und H4.

EURUSD Н1


EURUSD Н4


GBPUSD H1


GBPUSD H4


JPYUSD H1


JPYUSD H4


Natürlich sind die Ergebnisse nicht sehr gut. Aber das ist nicht das Ziel. Wichtiger ist, dass es eine positive Tendenz gibt.

Schlussfolgerungen

Was also ist der neue Ansatz für die bekannten Ideen? Ist es Zeitverschwendung oder Fortschritt? Sie sind ein erfolgreicher Händler. Sie haben eine großartige Arbeitsstrategie. Sollten Sie Ihre Strategie überarbeiten, um ein höheres Ergebnis zu erzielen? Oder alles so belassen? Sie sollten das selbst entscheiden. Vielleicht inspirieren die Ergebnisse meiner Forschung jemanden, seine Strategie anders zu betrachten oder sogar völlig neue technische Analysewerkzeuge zu entwickeln.

Ich bin ein Kenner des Selbststudiums, daher bin ich immer kritisch gegenüber öffentlich zugänglichen Materialien. Ich halte mich nicht an bestimmte Ideen von populären Autoren. In verschiedenen Foren lese ich eine ausführliche Beschreibung der Strategie-Nuancen, die von ihren Autoren zur Verfügung gestellt werden. Ich versuche immer, die effizientesten Lösungen im Rahmen eines Gewinnmaximierungskonzeptes zu finden. Ich hoffe, dass dieses Material den Lesern hilft und sie ermutigt, neue Ansätze zu nutzen, um ihre Strategien zu verbessern. Dieses Material enthält nur einen kleinen Teil dessen, was bei der Untersuchung von Abweichungen getan wurde. Einige der Probleme und Fragen, die sich während meiner Forschung ergaben, erforderten Sonderlösungen. Es ist schwierig, alles in einem Artikel zu beschreiben. Möglicherweise werde ich daher weitere Materialien veröffentlichen, die andere nicht standardisierte Lösungen beschreiben.

PS: Bitte fordern Sie keine Verbesserung des veröffentlichten Materials oder die Erstellung von Handelsrobotern. Bitte nutzen Sie dafür den Freelancer-Service. Programmierung ist für mich eher eine Notwendigkeit: Ich begann mich zu entwickeln, nur um die Sprachmöglichkeiten zu erlernen und meine Ideen zu überprüfen.

#      Name         Typ                           Beschreibung                      
1 ADX_Osc.mq5 Indikatoren  Indikator zur Divergenzanalyse 
2 TestADX.mql5 Expert Advisor  Ein Expert Advisor für das Testen der Ideen. 

Übersetzt aus dem Russischen von MetaQuotes Software Corp.
Originalartikel: https://www.mql5.com/ru/articles/5703

Beigefügte Dateien |
ADX.zip (149.51 KB)
Merrill-Muster Merrill-Muster

In diesem Artikel werden wir einen Blick auf das Modell der Merrill-Muster werfen und versuchen, deren aktuelle Relevanz zu bewerten. Zu diesem Zweck werden wir ein Werkzeug entwickeln, um die Muster zu testen und das Modell auf verschiedene Datentypen wie die Schluss-, Hoch- und Tiefstpreise sowie Oszillatorwerte anzuwenden.

Optimierungsmanagement (Teil II): Erstellen der Schlüsselobjekte und der Add-on-Logik Optimierungsmanagement (Teil II): Erstellen der Schlüsselobjekte und der Add-on-Logik

Dieser Artikel ist eine Fortsetzung der vorherigen Veröffentlichung über das Erstellen einer grafischen Oberfläche für das Optimierungsmanagement. Der Artikel berücksichtigt die Logik des Add-ons. Es wird ein Wrapper für das MetaTrader 5 Terminal erstellt, der es ermöglicht, das Add-on als verwalteten Prozess über C# auszuführen. Darüber hinaus wird in diesem Artikel der Betrieb mit Konfigurationsdateien und Setup-Dateien betrachtet. Die Anwendungslogik ist in zwei Teile gegliedert: Der erste Teil beschreibt die Methoden, die nach dem Drücken einer bestimmten Taste aufgerufen werden, während der zweite Teil den Start und die Verwaltung der Optimierung umfasst.

Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XV): Kollektion von Symbolobjekten Bibliothek für ein leichtes und schnelles Entwickeln vom Programmen für den MetaTrader (Teil XV): Kollektion von Symbolobjekten

In diesem Artikel werden wir die Erstellung einer Symbolsammlung auf der Grundlage des im vorherigen Artikel entwickelten abstrakten Symbolobjekts in Betracht ziehen. Die abstrakten, abgeleiteten Symbole sollen Symboldaten verdeutlichen und die Verfügbarkeit der grundlegenden Eigenschaften der Symbolobjekte in einem Programm definieren. Solche Symbolobjekte sind durch ihre Zugehörigkeit zu Gruppen zu unterscheiden.

Parsen von HTML mit curl Parsen von HTML mit curl

Der Artikel enthält die Beschreibung einer einfachen HTML-Code Parsing-Bibliothek mit Komponenten von Drittanbietern. Insbesondere werden die Möglichkeiten des Zugriffs auf Daten behandelt, die nicht über GET- und POST-Anfragen abgerufen werden können. Wir werden eine nicht zu umfangreiche Webseite auswählen und versuchen, interessante Daten von dieser Webseite zu laden.