
MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 44): Technischer Indikator Average True Range (ATR)
Einführung
Die Average True Range (durchschnittliche, wahre Spanne) ist ein weit verbreiteter und beliebter Volatilitätsindikator, der für Forex-Händler wohl am ehesten mit den Volumendaten vergleichbar ist. Der Indikator wurde entwickelt, um die Preisspanne zwischen den Balken zu verfolgen, ohne dabei die Preisänderungen zwischen den Balken zu vernachlässigen, und hat sich in der Branche nicht nur als Filter für Einstiegssignale, sondern auch als Richtschnur für die Positionsgröße bewährt. Wir betrachten diesen Indikator, indem wir ihn in mögliche Muster zerlegen, wie wir es bei den vorherigen Artikeln über Indikatoren getan haben. Der Hauptunterschied besteht vielleicht darin, dass wir Muster außerhalb der nutzerdefinierten Signalklasse untersuchen, indem wir auch die nutzerdefinierte Geldmanagementklasse für assistentengestützte Expert Advisors berücksichtigen.
Bevor wir uns jedoch damit befassen, werden wir den Indikator abschließen, mit dem wir zuletzt begonnen haben, den ADX.
ADX-Umkehrung
Muster 6 für den ADX ist die Umkehrung, die durch einen Rückgang des Hauptpuffers des ADX am Ende eines herausragenden Trends gekennzeichnet ist. Um den ADX kurz zu rekapitulieren: Er misst die Stärke eines Trends, wobei Spitzen oder Anstiege im Hauptpuffer des Oszillators die Stärke des vorherrschenden Trends anzeigen. Darüber hinaus gibt es zwei zusätzliche Puffer, den DI+ und den DI-, die ebenfalls die Stärke von Preisanstiegen bzw. Preisrückgängen quantifizieren.
Ein Aufwärtssignal ist also gekennzeichnet durch einen starken Abwärtstrend, der seit einiger Zeit anhält, sowie durch einen Rückgang der Werte des Hauptoszillatorpuffers von über 50 auf unter 4 innerhalb von etwa 2-3 Kursbalken. Das Argument dahinter ist, dass der ADX die Trendstärke misst, der aktuelle Trend sich abschwächt und daher eine Trendumkehr, in diesem Fall ein Aufwärtstrend, bevorsteht. Umgekehrt ist ein Abwärtssignal durch einen starken Aufwärtstrend gekennzeichnet, der auch einen ähnlichen Rückgang des ADX-Hauptpuffers von einem hohen Wert auf unter 40 zeigt. Wir implementieren dies in der Signalklasse wie folgt:
//+------------------------------------------------------------------+ //| Check for Pattern 6. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_6(ENUM_POSITION_TYPE T) { if(Base(X()+3) >= 50 && Base(X()) <= 40) { if(T == POSITION_TYPE_BUY && Close(StartIndex()) > Close(StartIndex() + m_ma_period)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(StartIndex()) < Close(StartIndex() + m_ma_period)) { return(true); } } return(false); }
Und wenn man ausschließlich dieses Muster testet, indem man dem Eingabeparameter „Verwendete Muster“ den ganzzahligen Wert 64 zuweist, erhält man die folgenden Ergebnisse:
ADX und Durchbruch von Unterstützung/Widerstand
Muster 7, das achte und vorletzte der von uns betrachteten ADX-Muster, verbindet Ausschläge im ADX-Hauptpuffer mit Durchbrüchen entweder der Unterstützungs- oder der Widerstandsniveaus. Da die Interpretation von Unterstützungs- und Widerstandslinien im Code problematischer ist als im manuellen Handel, werden wir uns auf einen sekundären Indikator, die Bollinger Bänder, stützen, um diese besser zu definieren. Es gibt nuanciertere Lösungen, die ich in den jüngsten Artikeln über den RSI und die Bollinger-Bänder in Betracht gezogen habe, und der Leser kann sich diese gerne ansehen, um neu zu definieren, was wir hier verwenden wollen.
Unsere Unterstützungs- und Widerstandsausbrüche werden einfach dadurch markiert, dass wir die untere und obere Grenze des Bollinger-Band-Indikators durchstoßen. Ein Aufwärtssignal wird also durch einen Anstieg des ADX-Puffers über die 25er-Marke und einen Kursanstieg durch die oberen Bollinger-Bänder gekennzeichnet, während ein Abwärtssignal durch einen ähnlichen Anstieg des ADX und einen Kursrückgang unter das untere Band der Bänder gekennzeichnet ist. Wir setzen dies in MQL5 wie folgt um:
//+------------------------------------------------------------------+ //| Check for Pattern 7. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_7(ENUM_POSITION_TYPE T) { if(Base(X()+2) < 25 && Base(X()) > 25) { if(T == POSITION_TYPE_BUY && Close(StartIndex()) >= Upper(StartIndex())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(StartIndex()) <= Lower(StartIndex())) { return(true); } } return(false); }
Das Testen des mit dem Assistenten zusammengestellten Expert Advisor, der nur dieses Muster verwendet, indem der Eingabeparameter für verwendete Muster auf 128 gesetzt wird, führt zu den folgenden Ergebnissen:
ADX mit RSI-Bestätigung
Unser letztes Muster, 8, kombiniert den ADX mit einem Indikator, den wir bereits betrachtet haben, dem RSI. Da der ADX ein Trendmessindikator ist und der RSI häufig zur Markierung von überkauften und überverkauften Punkten verwendet wird, muss die Kombination dieser beiden Indikatoren aus Sicht des ADX steigende oder größere Trends berücksichtigen, nicht deren Ende. Bis zu diesem Punkt konzentrieren wir uns auf das Überschreiten der 50er-Marke durch den RSI und nicht auf das Erreichen der 70/30er-Schwellen.
Das Aufwärtssignal wird also durch ein Überschreiten des RSI von unter 50 auf über 50 zusammen mit einem Anstieg des ADX-Hauptpuffers von unter 25 auf über 25 gekennzeichnet. Umgekehrt wird das Abwärtssignal durch einen Rückgang des RSI von über 50 auf unter 50 angezeigt, wobei der ADX-Wert wieder über die 25-Marke steigt. Wir setzen dies in MQL5 wie folgt um:
//+------------------------------------------------------------------+ //| Check for Pattern 8. | //+------------------------------------------------------------------+ bool CSignalADX::IsPattern_8(ENUM_POSITION_TYPE T) { if(Base(X()+1) < 25 && Base(X()) > 25) { if(T == POSITION_TYPE_BUY && RSI(StartIndex()) > 50 && RSI(StartIndex() + 1) < 50) { return(true); } else if(T == POSITION_TYPE_SELL && RSI(StartIndex()) < 50 && RSI(StartIndex() + 1) > 50) { return(true); } } return(false); }
Wenn man nur dieses Muster testet, indem man die ganze Zahl der verwendeten Muster auf 256 setzt, erhält man die folgenden Ergebnisse:
Optimierung für ideale ADX-Muster
Unser von einem Assistenten erstellten Expert Advisor, für den es hier und hier Anleitungen gibt, wie man dies mit dem am Ende dieses Artikels beigefügten Code verwendet, kann auch unter Verwendung aller bisher betrachteten ADX-Muster genutzt werden, wenn auch mit unterschiedlicher Gewichtung. Wie ich bereits erwähnt habe, ist dies nicht unbedingt ideal, da man dazu neigt, verschiedene Muster zu haben, die sich gegenseitig aufheben, was bedeutet, dass man bei Optimierungsläufen tendenziell Ergebnisse erhält, die an die Kurve angepasst sind, und oft Schwierigkeiten hat, ihre Leistung bei Daten außerhalb der Stichprobe zu wiederholen. Nachfolgend finden Sie einige Testergebnisse, die sich aus der Kombination aller neun bisher betrachteten ADX-Muster ergeben.
Der ATR
Der Average True Range Oszillator misst, wie oben bereits erwähnt, die Volatilität, was für Devisenhändler angesichts des Mangels an Volumendaten von entscheidender Bedeutung ist. Sehen wir uns daher auch die Muster an, von denen einige auch außerhalb unserer typischen nutzerdefinierten Signalklasse anwendbar sind.
Signal eines Volatilitätsausbruchs
Wenn der aktuelle ATR-Wert deutlich über seinen jüngsten Durchschnitt ansteigt, kann dies auf einen Volatilitätsausbruch hindeuten. Dies wiederum impliziert eine Handelsstrategie, bei der der Einstieg in einen Handel in Richtung des Ausbruchs, wenn die ATR signifikant ansteigt, signalisiert, dass der Markt wahrscheinlich große Kursbewegungen in diese Richtung erleben wird. Zusätzliche Indikatoren wie der gleitende Durchschnitt, MACD usw. können ebenfalls die Richtung des Handels bestimmen. Wir setzen dies in MQL5 wie folgt um:
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ bool CSignalATR::IsPattern_0(ENUM_POSITION_TYPE T) { if(ATR(X()) > ATR(X() + 1) && ATR(X() + 1) > ATR(X() + 2) && ATR(X() + 2) > ATR(X() + 3)) { if(T == POSITION_TYPE_BUY && Close(X()) > Close(X() + 1) && Close(X() + 1) > Close(X() + 2) && Close(X() + 2) > Close(X() + 3)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < Close(X() + 1) && Close(X() + 1) < Close(X() + 2) && Close(X() + 2) < Close(X() + 3)) { return(true); } } return(false); }
Das Testen dieses speziellen Solomusters, bei dem die Eingabe für „Used Patterns“ auf 1 gesetzt ist, liefert uns die folgenden Berichte als eines der vielen positiven Ergebnisse nach einer kurzen Optimierungsphase. Wir optimieren für das Paar EURUSD für das Jahr 2022 auf dem stündlichen Zeitrahmen.
ATR-Schwelle für Ausbruchsbestätigung
Ausbruchsbestätigungen mit ATR sind wichtig, da ATR ein Volatilitätsmaß ist. Indem ein Wert für die durchschnittliche Spanne (Höchst- minus Tiefstwerte) über einen bestimmten Zeitraum festgelegt wird, können Händler feststellen, um wie viel sich der Preis bei jedem neuen Balken normalerweise bewegt. Ein Ausbruch erfolgt, wenn der Kurs eine bestimmte Unterstützungs- oder Widerstandslinien überschreitet. Die ATR kann daher als Filter für falsche Ausbrüche dienen, indem sie Volatilitätsschwellen zur Bestätigung der Bewegung verwendet.
Ein häufiges Problem bei Ausbrüchen ist, dass die Kurse ein Niveau kurzzeitig durchbrechen können, um dann wieder zurückzugehen. Der ATR-Schwellenwert, wenn er zu diesen Breeches hinzugefügt wird, hilft, dies zu filtern, indem er den Ausbruch bestätigt, wenn sich der Kurs um einen bestimmten Prozentsatz über/unter dem Schlüsselniveau bewegt, relativ zum ATR-Wert. Wenn die ATR beispielsweise 20 Pips beträgt, könnte ein Ausbruch als gültig angesehen werden, wenn sich der Kurs um mindestens das 1,5-fache oder 2-fache der 20 Pips über ein Unterstützungs-/Widerstandsniveau hinaus bewegt, was auf eine echte Verschiebung des Momentums und nicht auf Rauschen hinweist. Diese ATR-Werte sind daher zwangsläufig sehr empfindlich, weshalb für schnellere Märkte oder kurzfristige Strategien eine niedrigere ATR-Periode (z. B. 7 oder 10 im Gegensatz zum typischen Wert von 14) gewählt werden kann, die eine bessere Anpassungsfähigkeit an die Volatilität ermöglicht. Beim Swing Trading, hingegen glättet eine längere ATR-Periode (z. B. 14 oder 20) das Rauschen und liefert ein stabileres Ausbruchsbestätigungssignal.
Unsere Implementierung in MQL5 verwendet jedoch einen etwas anderen Ansatz, indem wir Kursschwankungen gegen einen absoluten ATR-Wert verfolgen. Wenn Kursänderungen in eine bestimmte Richtung mit einer angemessenen ATR-Bewegung, die über einem optimierten Schwellenwert liegt, einhergehen, wird ein neues Signal in Richtung des Preistrends ausgelöst. Dies kodieren wir wie folgt:
//+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ bool CSignalATR::IsPattern_1(ENUM_POSITION_TYPE T) { if(ATR(X()) >= m_threshold_points*m_symbol.Point()) { if(T == POSITION_TYPE_BUY && Close(X()) > Close(X() + 1) && Close(X() + 1) > Close(X() + 2) && Close(X() + 2) > Close(X() + 3)) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < Close(X() + 1) && Close(X() + 1) < Close(X() + 2) && Close(X() + 2) < Close(X() + 3)) { return(true); } } return(false); }
Ein Testlauf von Optimierungen mit nur diesem Muster liefert folgende Ergebnisse:
ATR als Ausstiegssignal
Da der ATR die Marktvolatilität misst, ist sie ein effektives Instrument zur Bestimmung dynamischer Ausstiegspunkte auf der Grundlage der aktuellen Marktbedingungen. Im Gegensatz zu fixen Pip- oder Point-Exit-Strategien passen sich ATR-basierte Exits an die Volatilität des Marktes an und stellen sicher, dass Exits bei sinnvollen Niveaus und nicht bei willkürlichen Schwellenwerten erfolgen. Ein plötzlicher Anstieg der ATR-Werte könnte auf ein wichtiges Marktereignis (Fed-Protokoll usw.) oder eine potenzielle Umkehrung hinweisen. Händler könnten daher beschließen, eine Position zu schließen, wenn die ATR über einen bestimmten Schwellenwert hinausgeht, was eine erhöhte Volatilität signalisiert, die zu einer Trenderschöpfung oder Umkehrung führen könnte. Diese bevorstehende Umkehrung ist also ein Signal.
Swing-Trader können die ATR außerdem nutzen, um Positionen bei wichtigen bekannten/identifizierten Kursniveaus zu verlassen, indem sie ein Vielfaches der ATR zu den letzten Swing-Hochs oder -Tiefs addieren oder subtrahieren. Auf diese Weise können sie die durchschnittliche Kursbewegung berücksichtigen und in der Nähe wichtiger Umkehrpunkte aussteigen. Diese Form des Ausstiegs auf der Grundlage von ATR-Niveaus durch Swing-Trader verringert das Risiko von ungünstigen Ausschlägen oder ungerechtfertigten Drawdowns, insbesondere in Zeiten erhöhter Volatilität, die eine bevorstehende Umkehr oder Konsolidierungsphase signalisieren kann.
Wenn der ATR also plötzlich ansteigt, kann dies auf einen potenziellen Ausbruch oder eine erhöhte Volatilität hindeuten. Händler könnten diesen Anstieg als Ausstiegssignal nutzen, wenn sie innerhalb der Spanne positioniert sind. Die Kardinalregel lautet hier, dass das konsequente Vermeiden von Ausstiegen bei niedriger Volatilität den Händlern hilft, nicht in unruhigen Seitwärtsmärkten gefangen zu sein und so ein günstiges Risiko-Ertrags-Profil für ihre Geschäfte zu erhalten. Unsere Implementierung in MQL5 ist jedoch etwas vereinfacht, da wir eine nutzerdefinierte Signalklasse erstellen und nach einem Eintrag suchen. So kodieren wir Muster 2:
//+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ bool CSignalATR::IsPattern_2(ENUM_POSITION_TYPE T) { if(ATR(X()) >= 2.0 * m_threshold_points*m_symbol.Point()) { if(T == POSITION_TYPE_SELL && Close(X()) > Close(X() + 1) && Close(X() + 1) > Close(X() + 2) && Close(X() + 2) > Close(X() + 3)) { return(true); } else if(T == POSITION_TYPE_BUY && Close(X()) < Close(X() + 1) && Close(X() + 1) < Close(X() + 2) && Close(X() + 2) < Close(X() + 3)) { return(true); } } return(false); }
Unser Ansatz sieht im Wesentlichen eine Trendumkehr vor, wenn die ATR-Werte zu hoch werden, also mehr als das Doppelte eines optimierten Schwellenwerts betragen. Dies ist sicherlich nicht der beste Ansatz, um dies auszunutzen, wie die Leser vielleicht schon bemerkt haben, dass wir weiter oben „interessantere“ Möglichkeiten zur Nutzung von Ausstiegsmöglichkeiten erwähnt haben. Wie immer kann der beigefügte Quellcode jedoch geändert werden, um einen alternativen Ansatz zu verfolgen. Ein Testlauf aus einer kurzen Optimierungsphase für das Paar EURCHF für das Jahr 2022 auf dem 1-Stunden-Zeitrahmen liefert uns den folgenden Bericht:
Signal einer Volatilitätskontraktion
Die ATR-Kontraktion kann auch als Signal zur Vorbereitung auf eine Volatilitätsexpansion dienen, die Ruhe vor dem Sturm. Zeiten geringer Volatilität gehen in der Regel einem Kursanstieg oder einem Ausbruch von Volatilität voraus. Manche Händler beobachten die ATR-Kontraktion, um zu erkennen, wann ein Ausbruch wahrscheinlich ist, und sich für die bevorstehende Bewegung zu positionieren. Ein plötzlicher Anstieg der ATR nach einem solchen Zeitraum ist oft eine deutliche Bestätigung dafür, dass ein Ausbruch stattgefunden hat. Händler können daher die ATR-Kontraktion nutzen, um in den Handel einzusteigen, sobald die Volatilität wieder zunimmt, und sich so dem Trend anpassen.
Ein weiterer Vorteil der ATR-Kontraktionen sind die zeitlich begrenzten Ausstiege. Einige Händler verlassen ihre Positionen nach einer bestimmten Zeitspanne. Daher kann die Verwendung der ATR als Richtschnur für die Schließung von Positionen, die stagnieren, sehr hilfreich sein. Wenn die ATR niedrig ist oder im Laufe der Zeit abnimmt, könnte dies ein Zeichen für eine nachlassende Dynamik sein, was einen Ausstieg sinnvoll macht, da das Halten der Position keine nennenswerte Bewegung bringt. Bei Trendfolgestrategien kann die ATR-Kontraktion ebenfalls von Nutzen sein. Wenn in einem starken Trend eine Kontraktion einsetzt, könnte dies ein Zeichen dafür sein, dass der Trend an Schwung verliert und in eine Konsolidierung übergeht. Dies kann Trendbeobachtern die Möglichkeit bieten, sich entweder auf mögliche Umkehrungen vorzubereiten oder Gewinnmitnahmen zu tätigen. Für Trendfolger kann ein vorübergehender Ausstieg sinnvoll sein.
Für Swing-Trader kann eine Kontraktion des ATR signalisieren, dass sich der Kurs in einer Konsolidierungsphase befindet, was darauf hindeutet, dass es an der Zeit ist, Positionen zu verlassen und zu vermeiden, dass man in eine Seitwärtsbewegung gerät. Umgekehrt können Swing-Trader nach dem Ende der Kontraktion nach Einstiegspunkten Ausschau halten, wenn die Volatilität wieder zu steigen beginnt. Alternativ können Swing-Trader die ATR-Kontraktion nutzen, um Märkte zu identifizieren, die sich in einer Handelsspanne befinden, indem sie bei Unterstützung kaufen und bei Widerstand verkaufen, bis ein Ausbruch oder Durchbruch erfolgt.
Besonders bei undurchsichtigen Forex-Märkten ist außerdem zu beachten, dass ein Rückgang der ATR häufig mit einem Rückgang der Handelsvolumina einhergeht, was in der Regel bedeutet, dass die Marktteilnehmer unentschlossen sind. Wenn das Volumen zunimmt und die ATR ansteigt, könnte dies auf einen potenziellen Ausbruch hindeuten, da neue Liquidität auf den Markt kommt. Die Kombination einer ATR-Kontraktion mit einem anschließenden Volumenanstieg ist eine nützliche Bestätigung für Ausbruchshändler, die während eines Volatilitätsanstiegs einsteigen wollen. In diesem Artikel wird ein Rückgang der Volatilität als Einstiegssignal verwendet, um Umkehrungen zu erkennen. Diese anstehenden Umkehrungen bestimmen dann unsere voraussichtliche Kursrichtung. Wenn sich die ATR nach einem Abwärtstrend verjüngt, gehen wir von einem Pullback aus und haben somit ein Aufwärtssignal. Wenn dieser Rückgang der ATR jedoch gegen Ende einer Aufwärtstrends erfolgt, würden wir dies als ein Abwärtssignal werten. Unser Code zu diesem Zweck ist unten angegeben:
//+------------------------------------------------------------------+ //| Check for Pattern 3. | //+------------------------------------------------------------------+ bool CSignalATR::IsPattern_3(ENUM_POSITION_TYPE T) { if(ATR(X()) < ATR(X() + 1) && ATR(X() + 1) < ATR(X() + 2) && ATR(X() + 2) < ATR(X() + 3)) { if(T == POSITION_TYPE_SELL && Close(X() + 3) > Close(X() + 4) && Close(X() + 4) > Close(X() + 5) && Close(X() + 5) > Close(X() + 6)) { return(true); } else if(T == POSITION_TYPE_BUY && Close(X() + 3) < Close(X() + 4) && Close(X() + 4) < Close(X() + 5) && Close(X() + 5) < Close(X() + 6)) { return(true); } } return(false); }
Ein Testlauf mit einigen der Optimierungsergebnisse, die nur das Muster 3 verwenden, indem der Eingabeparameter für die verwendeten Muster auf 8 gesetzt wird, führt zu den folgenden Ergebnissen:
ATR-Kanal (ATR-Bänder)
ATR-Kanäle (auch als ATR-Bänder bekannt) sind dynamische, volatilitätsbasierte Bänder, die über und unter dem Preis unter Verwendung eines Vielfachen der Average True Range (ATR) eingezeichnet werden können. Genau wie die Bollinger-Bänder helfen sie, einen Kanal um den Preis herum zu bilden, was in diesem speziellen Fall hilfreich sein kann, um die Marktvolatilität widerzuspiegeln.
Und genau wie die Bänder erweitern und schrumpfen diese auf der Grundlage der Preisvolatilität und geben Händlern ein Gefühl dafür, wie stark sich der Preis innerhalb eines bestimmten Zeitrahmens von seinem Mittelwert entfernt. Außerdem fungieren die oberen und unteren Bänder als dynamische Unterstützungs- bzw. Widerstandsniveaus, sodass bei Kursschwankungen innerhalb dieser Bänder und beim Berühren oder Durchbrechen dieser „Niveaus“ Signale für potenzielle Umkehrungen oder Fortsetzungen erzeugt werden können. Im Gegensatz zu statischen Unterstützungs-/Widerstandsniveaus sind diese dynamischer und reagieren somit besser auf die vorherrschenden Marktbedingungen.
Die Signale dieser Bänder sind also, wenn der Kurs über das obere ATR-Band ausbricht, ein Hinweis auf einen Aufwärtstrend oder erhöhten Kaufdruck, während ein Ausbruch unter das untere Band einen Abwärtstrend oder Verkaufsdruck anzeigen kann. Für einen manuellen Händler muss ein nutzerdefinierter Indikator implementiert werden, der diese Bänder physisch darstellt, aber in unserem Fall, da wir von einem Assistenten zusammengestellte Expert Advisors verwenden (mit Anleitungen hier und hier für neue Leser), müssen wir uns damit nicht befassen. Da wir unseren Handelsprozess automatisieren, können wir die beiden separaten Indikatorwerte des gleitenden Durchschnitts und der ATR nehmen und sie zusammenzählen, um diese Bänder für jeden neuen Balken zu definieren. Wir implementieren das Muster in MQL5 wie folgt:
//+------------------------------------------------------------------+ //| Check for Pattern 4. | //+------------------------------------------------------------------+ bool CSignalATR::IsPattern_4(ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && Close(X()) > MA(X()) + 2.0 * ATR(X())) { return(true); } else if(T == POSITION_TYPE_SELL && Close(X()) < MA(X()) - 2.0 * ATR(X())) { return(true); } return(false); }
Solche Bänder können zusätzliche Funktionen übernehmen, wie z. B. das Herausfiltern falscher Ausbrüche, wenn sie mit anderen Indikatoren wie den Bollinger Bändern oder Keltner-Kanälen verwendet werden, indem sie bestätigen, dass der Ausbruch signifikant genug ist. Andere Anwendungen für den ATR-Kanal überschneiden sich ein wenig mit dem, was wir oben erwähnt haben, sind aber dennoch erwähnenswert. ATR-Kanäle können helfen, die Stärke und Richtung eines Trends zu erkennen. Wenn sich der Kurs beständig in der Nähe des oberen ATR-Bandes bewegt, deutet dies auf einen starken Aufwärtstrend hin. Ähnlich verhält es sich, wenn sich der Kurs entlang der unteren Spanne bewegt, was auf einen starken Abwärtstrend hindeutet. Dieses Trendspotting kann in einigen Märkten, die auf großen Zeitskalen wie eine Seitwärtsbewegung erscheinen, sehr nützlich sein. Umgekehrt könnte ein Kurs, der sich schwer tut, aus den ATR-Bändern auszubrechen, oder der die Bänder häufig berührt, ohne dass es zu einem Durchbruch kommt, auf eine Erschöpfung des Trends oder eine nachlassende Dynamik hindeuten.
Händler nutzen die ATR-Bänder auch, um Möglichkeiten der Mittelwertumkehr zu erkennen, insbesondere bei Märkten, die sich in einer Bandbreite bewegen. Wenn der Kurs das obere oder untere Band berührt, kann dies ein Zeichen dafür sein, dass der Vermögenswert überkauft oder überverkauft ist und eine Umkehr zum Mittelwert (Durchschnittspreis) wahrscheinlich ist. Wenn der Kurs also am oberen oder unteren ATR-Band abprallt, ohne es zu durchbrechen, kann dies je nach dem betrachteten Zeitrahmen ein Signal für Händler sein, Gewinne mitzunehmen oder ihre Positionen umzukehren.
Bei der Verwendung von volatilitätsbasierten Take-Profits können diese Bänder dynamische Niveaus auf Basis der Volatilität liefern. Eine Gewinnmitnahme, die knapp außerhalb des ATR-Bandes platziert wird, kann dazu beitragen, den Handel vor normalen Rauschen im Markt zu schützen, die Geld auf dem Tisch liegen lassen würden, indem sie Raum für Kursschwankungen innerhalb des Bandes lässt. Dies wurde in unserer Pattern-4-Implementierung nicht berücksichtigt, da es sich um eine nutzerdefinierte Signalklasse handelt, die jedoch in einer nutzerdefinierten Nachlaufklasse eines anderen, mit einem Assistenten ausgestatteten Expert Advisor enthalten sein kann. Die Testläufe einer Optimierungsphase mit ähnlichen Einstellungen, wie wir sie oben verwendet haben (EURCHF, stündlicher Zeitrahmen, Jahr 2022), sehen wie folgt aus:
Wir führen dann eine Optimierung über alle diese Signale durch, wenn sie zu einem kombiniert werden, mit verschiedenen Gewichtungen, erhalten wir die folgenden Testläufe von einem der günstigen Optimierungsläufe.
Die Klasse TrailingATR
Wir haben uns überlegt, wie der ATR zur Generierung von Ein- und Ausstiegssignalen für einen Expert Advisor verwendet werden kann, auch wenn dies nicht immer der primäre Zweck oder die primäre Verwendung ist. In erster Linie wird ATR bei der Platzierung von Stops oder allenfalls bei der Positionsgrößenbestimmung verwendet; daher sehen wir uns diese innerhalb von nutzerdefinierten Klassen an, die innerhalb eines Expert Advisors über den MQL5-Assistenten noch zusammengestellt werden können.
Wir halten unsere Implementierung hier einfach, wobei wir, um ein Trailing-Stop zu definieren, einfach eine Benchmark um ein Vielfaches der ATR inkrementieren. Unser Benchmark kann für unsere Zwecke 3 Formen annehmen. Rohpreis, gleitender Durchschnittspreis und SAR-Indikator-Preisniveau. Jedes dieser Muster liefert uns ein eigenes Muster, das wir mit 0, 1 und 2 indizieren und wie folgt kodieren:
//+------------------------------------------------------------------+ //| Check for Pattern 0. | //+------------------------------------------------------------------+ void CTrailingATR::IsPattern_0(double &Price, ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY) { Price -= (m_stop_level * ATR(StartIndex())); } else if(T == POSITION_TYPE_SELL) { Price += (m_stop_level * ATR(StartIndex())); } } //+------------------------------------------------------------------+ //| Check for Pattern 1. | //+------------------------------------------------------------------+ void CTrailingATR::IsPattern_1(double &Price, ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY) { Price = (MA(StartIndex()) - (m_stop_level * ATR(StartIndex()))); } else if(T == POSITION_TYPE_SELL) { Price = (MA(StartIndex()) + (m_stop_level * ATR(StartIndex()))); } } //+------------------------------------------------------------------+ //| Check for Pattern 2. | //+------------------------------------------------------------------+ void CTrailingATR::IsPattern_2(double &Price, ENUM_POSITION_TYPE T) { if(T == POSITION_TYPE_BUY && SAR(StartIndex()) < Low(StartIndex())) { Price = (SAR(StartIndex()) - (m_stop_level * ATR(StartIndex()))); } else if(T == POSITION_TYPE_SELL && SAR(StartIndex()) > High(StartIndex())) { Price = (SAR(StartIndex()) + (m_stop_level * ATR(StartIndex()))); } }
Optimierungs- und Testläufe können für jedes einzelne Muster durchgeführt werden, wie wir es oben getan haben. Der Kürze halber werden wir jedoch nur einen einzigen Lauf durchführen, bei dem die Verwendung aller Muster mit unterschiedlichen Gewichten optimiert wird. Die Ergebnisse dieser Untersuchungen werden im Folgenden vorgestellt:
ATR in der Geldverwaltung
Stop-Loss-Lücken können bei der Festlegung der Positionsgröße nützlich sein. Denn, so das Argument, wenn man eine offene Position hat, dann ist der Stop-Loss das, was den maximalen Verlust in der Position begrenzen würde, sollte der Handel gegen sie gehen. Daher kann man durch Messung des Tick-Wertes einer Stop-Loss-Lücke einen fiktiven Wert einer Positionsgröße in Lots ermitteln, der nicht mehr als den festgelegten Prozentsatz der freien Marge zu diesem Zeitpunkt auslösen würde.
Sobald wir mit einem Stop-Loss-Niveau und einem maximalen Risikoprozentsatz ausgestattet sind, können wir die Losgrößen erhalten, die theoretisch unsere Verluste begrenzen würden. Theoretisch ist dies der Fall, da die Stopps keine Preisgarantie bieten. Sie werden nur ausgelöst, wenn dieser Preis verfügbar ist, weshalb der Januar 2015 für die Händler des CHF verheerend war. Was ist dann die beste Versicherung? Minimale und verantwortungsvolle Positionsbestimmung. Wenn wir dieselben 3 verschiedenen möglichen Stop-Loss-Methoden anwenden, die wir oben mit dem Trailing-Stop hatten, würden wir auf diese Weise 3 parallele Muster für eine nutzerdefinierte Money-Management-Klasse implementieren:
//+------------------------------------------------------------------+ //| Getting lot size for open long position. | //+------------------------------------------------------------------+ double CMoneyATR::CheckOpenLong(double price, double sl) { if(m_symbol == NULL) return(0.0); //--- select lot size double lot; if(price == 0.0) lot = m_account.MaxLotCheck(m_symbol.Name(), ORDER_TYPE_BUY, m_symbol.Ask(), m_percent); else lot = m_account.MaxLotCheck(m_symbol.Name(), ORDER_TYPE_BUY, price, m_percent); //--- double result = 0.0, results = 0.0; price =m_symbol.Bid(); //--- if the model 0 is used and "ATR-Based Stop Loss" if(((m_patterns_usage & 0x01) != 0)) { IsPattern_0(price, POSITION_TYPE_BUY); result += m_pattern_0 * price; results += m_pattern_0; } //--- if the model 1 is used and "ATR-MA-Channel Stop Loss" if(((m_patterns_usage & 0x02) != 0)) { IsPattern_1(price, POSITION_TYPE_BUY); result += m_pattern_1 * price; results += m_pattern_1; } //--- if the model 2 is used and "ATR-SAR-Channel Stop Loss" if(((m_patterns_usage & 0x04) != 0)) { IsPattern_2(price, POSITION_TYPE_BUY); result += m_pattern_2 * price; results += m_pattern_2; } //--- if(results > 0) { result /= results; double _risk = (fabs(m_symbol.Bid()-result)/m_symbol.Point())*(m_symbol.TickSize()/m_symbol.Point())*m_symbol.TickValue(); _risk /= m_account.FreeMargin(); _risk *= 100.0; double _risk_lots = m_percent/_risk;// where m_percent is also max risk lot = fmin(2.0*lot, fmax(_risk_lots, m_symbol.LotsMin())); } //--- return trading volume return(Optimize(lot)); } //+------------------------------------------------------------------+ //| Getting lot size for open short position. | //+------------------------------------------------------------------+ double CMoneyATR::CheckOpenShort(double price, double sl) { if(m_symbol == NULL) return(0.0); //--- select lot size double lot; //--- if(price == 0.0) lot = m_account.MaxLotCheck(m_symbol.Name(), ORDER_TYPE_SELL, m_symbol.Bid(), m_percent); else lot = m_account.MaxLotCheck(m_symbol.Name(), ORDER_TYPE_SELL, price, m_percent); //--- double result = 0.0, results = 0.0; price =m_symbol.Ask(); //--- if the model 0 is used and "ATR-Based Stop Loss" if(((m_patterns_usage & 0x01) != 0)) { IsPattern_0(price, POSITION_TYPE_SELL); result += m_pattern_0 * price; results += m_pattern_0; } //--- if the model 1 is used and "ATR-MA-Channel Stop Loss" if(((m_patterns_usage & 0x02) != 0)) { IsPattern_1(price, POSITION_TYPE_SELL); result += m_pattern_1 * price; results += m_pattern_1; } //--- if the model 2 is used and "ATR-SAR-Channel Stop Loss" if(((m_patterns_usage & 0x04) != 0)) { IsPattern_2(price, POSITION_TYPE_SELL); result += m_pattern_2 * price; results += m_pattern_2; } //--- if(results > 0) { result /= results; double _risk = (fabs(result-m_symbol.Ask())/m_symbol.Point())*(m_symbol.TickSize()/m_symbol.Point())*m_symbol.TickValue(); _risk /= m_account.FreeMargin(); _risk *= 100.0; double _risk_lots = m_percent/_risk;// where m_percent is also max risk lot = fmin(2.0*lot, fmax(_risk_lots, m_symbol.LotsMin())); } //--- return trading volume return(Optimize(lot)); }
Dieser Ansatz hat nicht nur die Schwäche, dass er zu sehr von der Verfügbarkeit des Stop-Loss-Kurses abhängt, sondern birgt auch die Gefahr, dass in Fällen, in denen die Stop-Loss-Lücke sehr klein ist, zu große Losgrößen zugewiesen werden. Deshalb normalisieren wir die Losgrößen so, dass sie das Doppelte der Lose nicht überschreiten, die wir bei einem prozentualen Ausfallrisiko der freien Gewinnspanne erhalten würden. Dieser Risikoprozentsatz (m_percent) dient also zwei Zwecken: Zum einen definiert er die Obergrenze unserer Losgrößen, wenn wir Losgrößen kaufen, wobei er als Prozentsatz der freien Marge fungiert, und zum anderen definiert er auch den fiktiven maximalen Prozentsatz der freien Marge, den wir verlieren würden, wenn unser Stop-Loss auf einem bestimmten Niveau liegt.
Testläufe mit einigen der besten Optimierungsergebnisse, wiederum mit ähnlichen Einstellungen wie oben, ergeben die folgenden Ergebnisse:
Auch hier haben wir keine Testläufe auf Basis einzelner Muster durchgeführt, sondern unseren Expert Advisor einfach so optimiert, dass er alle Muster verwendet, wenn auch mit unterschiedlicher Gewichtung, wie es oben bei den Trailing Stops der Fall war.
Schlussfolgerung
Wir haben unseren Blick auf den ADX-Indikator, den wir im letzten Artikel betrachtet hatten, abgeschlossen und haben auch den ATR-Indikator begonnen und abgeschlossen. In diesem Artikel werden verschiedene Ideen und Implementierungen des ATR vorgestellt, die jedoch der Kürze halber nicht kodiert oder getestet wurden. Der Leser ist daher herzlich eingeladen, sie durch eigene Implementierungen und Tests weiterzuentwickeln, idealerweise mit einer noch größeren Vielfalt von Symbolen und mit mehr historischen Daten, um ein besseres Verständnis dafür zu bekommen, was für seine Umstände geeignet ist.
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/16213





- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.