Entwicklung eines Toolkits zur Preisaktionsanalyse (Teil 54): Filtern von Trends mit EMA und geglätteter Kursbewegung
Inhalt
- Einführung
- Strategie und Mechanik
- Umsetzung
- Aufschlüsselung der Kernfunktionen
- Leitfaden für den Einsatz
- Tests
- Schlussfolgerung
Einführung
Seit Jahrzehnten haben Händler nach Methoden gesucht, um das Rauschen des Marktes herauszufiltern und sich auf echte Kursbewegungen zu konzentrieren. Die Heikin-Ashi-Technik hat sich insbesondere durch ihre Fähigkeit ausgezeichnet, Kerzen zu glätten, wodurch Trends klarer werden und kurzfristige Volatilität weniger ablenkt. Einfach ausgedrückt, wirkt Heikin-Ashi wie ein klarer Fahrplan von Punkt A nach Punkt B und glättet die Kursstörungen, sodass die Gesamtrichtung leichter zu verfolgen ist. In einer früheren Arbeit habe ich ein Preisaktionsanalysesystem untersucht, das vollständig auf dem Indikator Heikin-Ashi basiert und saubere Eingänge und erkennbare Muster liefert. Die Erfahrung hat jedoch gezeigt, dass ein solcher singulärer Ansatz unter bestimmten Marktbedingungen anfällig sein kann, wenn starke Aufwärts- oder Abwärtskerzen den zugrunde liegenden Trend verfälschen.
Um dieser Einschränkung zu begegnen, habe ich exponentielle gleitende Durchschnitte (EMAs) integriert, um die Zuverlässigkeit der Signale zu erhöhen. Der EMA20 auf den Höchst- und Tiefstkursen hilft bei der Festlegung kurzfristiger Grenzen, während der EMA50 auf den Schlusskursen einen breiteren Richtungsfilter bietet. Wenn Heikin-Ashi-Signale mit diesen EMA-Maßstäben übereinstimmen, werden falsch-positive Signale stark reduziert und der Einstieg in den Handel wird disziplinierter. Diese Kombination bewahrt die visuelle Klarheit, die den Heikin-Ashi so attraktiv macht, und fügt gleichzeitig eine quantitative Struktur hinzu, wodurch eine ausgewogene Methodik entsteht, die die Entscheidungsfindung stärkt und die Trendrichtung bestätigt.
In den folgenden Abschnitten werden wir uns mit der Systemmechanik befassen, gefolgt von der Implementierung in MQL5, einer Aufschlüsselung der Kernfunktionen, einem Leitfaden für den Einsatz, Testverfahren und schließlich einer Schlussfolgerung.
Strategie und Mechanik
In volatilen Marktphasen oder in Übergangsphasen zeigen Kerzen-Charts oft große bullische oder bärische Balken, die eine starke Dynamik suggerieren, in Wirklichkeit aber das Ergebnis kurzfristiger Schwankungen sind. Diese irreführenden Signale treten häufig bei flachen Rücksetzern oder bei geringem Handelsvolumen auf, wenn sich der Kurs kurzzeitig über oder unter die jüngste Handelsspanne bewegt, ohne dass sich der zugrunde liegende Trend wirklich ändert. Darauf zu reagieren, kann bedeuten, am Ende einer Korrektur zu kaufen oder zu verkaufen, kurz bevor der Markt wieder ansteigt – Szenarien, die zu einem Hin und Her der Kurse führen und die Konsistenz des Handels untergraben können.
Dieses System wurde entwickelt, um solche Fehlalarme zu vermeiden. Es kombiniert die Heikin-Ashi-Glättung mit der Filterung des exponentiellen gleitenden Durchschnitts, sodass visuell starke Kerzen nur dann gehandelt werden, wenn sie mit einem messbaren Momentum übereinstimmen. Die Heikin-Ashi-Schicht berechnet jeden Balken anhand der gemittelten OHLC-Werte neu und erstellt ein Chart, in dem die Farben anhaltenden Trends folgen und sich nur bei echten Umkehrungen ändern. Dies bietet ein klareres Richtungsbild als herkömmliche Kerzen und erleichtert die Identifizierung der vorherrschenden Tendenz.
Zum Schutz vor Situationen, in denen Heikin-Ashi in die Irre führen kann, wie eine einzelne Aufwärtskerze inmitten eines Abwärtstrends, fügt die Strategie eine zweite Validierungsebene hinzu. Der auf Basis der Schlusskurse berechnete EMA50 definiert den breiten Richtungskontext, wobei seine Steigung ein schnelles, numerisches Maß für die Trendstärke darstellt. Zwei EMA20-Linien, die auf der Grundlage von Höchst- und Tiefstständen berechnet werden, umrahmen die jüngsten Kursextreme. Bevor ein Heikin-Ashi-Signal akzeptiert wird, muss es diese EMA20-Grenzen durchbrechen und mit der EMA50-Steigung übereinstimmen. Wenn eine der beiden Bedingungen fehlschlägt, wird die Einrichtung ignoriert.
Durch die Erzwingung der Übereinstimmung zwischen geglätteten visuellen Signalen und strukturellen Trendmetriken stellt die Mechanik sicher, dass Geschäfte getätigt werden, wenn das kurzfristige Momentum, die langfristige Tendenz und die Kerzenstruktur alle in dieselbe Richtung weisen. Auf diese Weise wird das Rauschen reduziert, die Klarheit, die Heikin-Ashi so attraktiv macht, bewahrt und eine disziplinierte quantitative Überprüfung in eine ansonsten visuelle Methode integriert.
Detaillierte Heikin-Ashi-Berechnung
Die Heikin-Ashi-Technik modifiziert die Standardkerzen aus OHLC, um geglättete Werte zu erzeugen, die kleine Schwankungen herausfiltern. Anstatt die rohen Eröffnungs-, Höchst-, Tiefst- und Schlusskurse jeder Periode darzustellen, verwendet das System gemittelte Werte.

Nachstehend finden Sie die Heikin-Ashi-Standardformel.
Heikin-Ashi-Schlusskurs![]()
![]()
![]()
![]()
- HA_Close: Ermittelt den Mittelwert aus dem Eröffnungs-, Hoch-, Tiefst- und Schlusskurs der realen Kerze, um einen durchschnittlichen Schlussstand für diesen Zeitraum zu erhalten.
- HA_Open: Verwendet den Durchschnitt des Eröffnungs- und Schlusskurses der vorherigen HA-Kerze und bindet jede neue Eröffnung an die geglätteten Werte des letzten Balkens.
- HA_High / HA_Low: Geben Sie den höchsten und niedrigsten Punkt zwischen dem geglätteten Eröffnungs-/Schlusskurs und dem tatsächlichen Höchst-/Tiefstkurs der echten Kerze wieder.
Farblogik (trendbezogen)
Bullische HA-Kerze: (HA Close > HA Open)- Abgebildet in grün (oder in der vom Händler bevorzugten bullischen Farbe).
- Abgebildet in Rot (oder der vom Händler bevorzugten bärischen Farbe).
Da sich jede neue Eröffnung auf die geglätteten Zahlen der vorherigen Kerze bezieht, haben abrupte Änderungen des Rohpreises weniger unmittelbare Auswirkungen, was zu längeren Läufen gleichfarbiger Kerzen während Trends und weniger erratischen Wechseln während kleinerer Konsolidierungen führt.
Diese Eigenschaft hilft den Händlern zwar, Trends mit größerer Zuversicht zu folgen, führt aber auch zu einer kleinen Verzögerung. Da die Werte jeder Kerze gemittelt werden, werden Umkehrungen in der Regel später bestätigt als in einem normalen Kerzenchart. Bei starken Trends ist diese Verzögerung von Vorteil, da die Händler länger in profitablen Positionen bleiben. In komplexen oder seitwärts tendierenden Märkten kann die Glättung jedoch frühe Anzeichen einer Veränderung verschleiern, was zu Ein- oder Ausstiegszeitpunkten führen kann, die zeitlich schlecht gewählt sind. An dieser Stelle wird eine zusätzliche analytische Ebene wichtig, die das, was das Heikin-Ashi-Chart zu suggerieren scheint, bestätigen oder in Frage stellen kann. Deshalb haben wir in diesem Fall mit exponentiellen gleitenden Durchschnitten fusioniert.
Einstellungen für die EMA-Berechnung
EMAs sind so konzipiert, dass sie den Durchschnittspreis über einen bestimmten Zeitraum erfassen, wobei den jüngsten Daten mehr Gewicht beigemessen wird, was zu einem reaktionsschnellen und dennoch stabilen Maß führt. Bei der Berechnung wird ein Multiplikator angewandt, der neuen Preisen Vorrang einräumt und eine Linie erzeugt, die das wechselnde Gleichgewicht zwischen kurzfristiger Dynamik und längerfristigen Trends nachzeichnen kann. Händler verwenden EMAs üblicherweise, um dynamische Unterstützungs- und Widerstandsniveaus zu definieren, die aktuelle Trendrichtung einzuschätzen und Punkte zu erkennen, an denen die Dynamik zunimmt oder nachlässt. Der Vergleich von EMAs verschiedener Perioden ermöglicht es, die Stärke und Stabilität eines Trends zu beurteilen: Ein steigender EMA der 50er-Periode signalisiert etwa eine anhaltende Aufwärtsbewegung, während ein fallender EMA das Gegenteil andeutet. Diese Strategie verwendet drei exponentiell gleitende Durchschnitte.
- EMA50 auf Schlusskursen: der langfristige Trendfilter
ema50 = iMA(_Symbol, WorkTF, 50, 0, MODE_EMA, PRICE_CLOSE);
Misst die Trendverzerrung anhand der Steigung im Zeitverlauf. Glatt genug, um kleine Schwankungen zu ignorieren, reaktionsschnell genug für tägliche/kurzfristige Trendwechsel. Anstatt sich nur darauf zu verlassen, dass der Preis den EMA50 durchquert, misst das System die Neigung (Richtungsänderung) zwischen dem letzten EMA50-Wert und dem EMA50-Wert der vorherigen Kerze.

trendBull = (ema50_current > ema50_previous); trendBear = (ema50_current < ema50_previous);
- 1) Wenn der aktuelle EMA50 > der vorherige EMA50 ist, steigt der Durchschnitt, und der Markt ist bullisch.
- 2) Wenn der aktuelle EMA50 < vorheriger EMA50 ist, fällt der Durchschnitt, die Markttendenz ist bärisch.
Überkreuzungen können in Seitwärtsmärkten auftreten, wenn der Kurs über den EMA driftet, ohne eine Dynamik zu entwickeln. Die Steigungsanalyse sorgt dafür, dass die Handelsrichtung mit der tatsächlichen Trendbeschleunigung oder -verlangsamung übereinstimmt, und filtert Signale bei flachen Durchschnittswerten heraus.
- EMA20 der Hochs: kurzfristiger oberer Widerstand.

ema20_high = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_HIGH);
Erfasst das gemittelte Hoch der letzten Balken; ein HA _close über diesem Wert deutet auf eine bemerkenswerte Aufwärtskraft hin.
- EMA20 der Tiefs: kurzfristige untere Unterstützung.

ema20_low = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_LOW);
Erfasst das gemittelte Extremtief; ein HA close darunter deutet auf eine bemerkenswerte Abwärtskraft hin.
Ein exponentieller gleitender 20-Perioden-Durchschnitt reagiert schnell auf kleine Schwankungen und erfasst die kurzfristigen Schwankungen des Marktes. Wenn die beiden Linien getrennt nach Höchst- und Tiefstkursen berechnet werden, bilden sie einen anpassungsfähigen Umschlag um den Preis, der die unmittelbare Handelsspanne definiert. Im Gegensatz dazu reagiert der 50-Perioden-EMA langsamer, filtert vorübergehende Störungen heraus und bietet eine stabilere Sicht auf die vorherrschende langfristige Richtung.
Signalregeln

Kaufsignale
1) Die geglättete Kerze schließt über dem EMA20 High
- (HA Close > EMA20 High): Der Kurs bricht über den kurzfristigen obere Widerstand aus.
2) HA-Kerze ist bullisch
- (HA Close > HA Open): Der Kerzenkörper ist aufwärtsgerichtet.
3) Geglätteter Schlusskurs ist über EMA50
- (HA Close > EMA50 Close): Der Kurs liegt über dem langfristigen Trendfilter.
4) EMA50 Steigung ist positiv
- (EMA50 aktuell > EMA50 vorher): Die langfristige Trendlinie steigt.
5) Der vorherige HA close lag unter dem EMA50: Dies bestätigt einen Ausbruchszusammenhang (der Kurs hat die Trendlinie von unten nach oben überschritten).
Verkaufssignale
1) Die geglättete Kerze schließt unter dem EMA20 Low- (HA Close < EMA20 Low): Der Kurs fällt unter die kurzfristige untere Unterstützung.
- (HA Close < HA Open): Der Kerzenkörper ist abwärtsgerichtet.
- (HA Close < EMA50 Close): Der Kurs befindet sich unter dem langfristigen Trendfilter.
- (EMA50 aktuell < EMA50 vorhergehend): Die langfristige Trendlinie fällt.
Akzeptierter Kauf
- Eine bullische Heikin-Ashi-Kerze schließt oberhalb des EMA20-Hochs, und der EMA50 steigt. Der vorangegangene HA-Schluss lag unter dem EMA50, während der aktuelle Balken nach oben ausgebrochen ist, was die Aufwärtsdynamik bestätigt.
Abgelehnter Kauf
- Eine bullische HA-Kerze schließt oberhalb des EMA20-Hochs, aber der EMA50 bewegt sich seitwärts oder fällt. Das Fehlen eines deutlichen Trends führt zu einer Ablehnung des Signals.
Akzeptierter Verkauf
- Eine bärische Heikin-Ashi-Kerze schließt unter dem EMA20-Tief, und der EMA50 fällt. Der vorangegangene HA close lag über dem EMA50, während der aktuelle Kursbalken nach unten ausgebrochen ist, was das Abwärtsmomentum bestätigt.
Abgelehnter Verkauf
- Eine bärische HA-Kerze schließt unter dem EMA20 Low, aber der EMA50 steigt. Da der übergeordnete Trend nach oben zeigt, wird das Signal verworfen.
Bildmaterial und Warnungen
Kaufpfeile werden in Grün (oder Limone) angezeigt und in einem durch ArrowOffsetPoints definierten Abstand unter dem Tief der Signalkerze eingezeichnet, während Verkaufspfeile in Rot dargestellt und mit dem gleichen Abstand über dem Hoch der Kerze platziert werden. Durch diese Platzierung werden Überschneidungen mit Preisbalken vermieden und die Übersichtlichkeit des Charts gewahrt. Jeder Pfeil wird mit einem bestimmten Präfix benannt, z. B. „EMA20HA_BUY_“, und enthält einen Zeitstempel, um sicherzustellen, dass doppelte Signale für dieselbe Kerze vermieden werden. Wenn ein gültiges Signal auftritt, generiert der EA eine Warnmeldung, die das Symbol und den Signaltyp enthält, mit der Option, die Benachrichtigungen je nach Präferenz des Händlers auf Push- oder E-Mail-Ausgaben auszuweiten.
Umsetzung
Der Expert Advisor ist so strukturiert, dass er sowohl im Live-Handel als auch im Strategietester zuverlässig läuft und die gleiche Logik in allen Umgebungen gewährleistet. Seine Architektur trennt die operativen Aufgaben in verschiedene Module: Initialisierung, Indikatormanagement, Signalanalyse und visuelle Ausgabe. Dieser modulare Aufbau vereinfacht das Debugging, erhöht die Übersichtlichkeit und ermöglicht eine dynamische Anpassung der Komponenten an die Laufzeitbedingungen.
Das nachstehende Diagramm veranschaulicht den Arbeitsablauf des EA, von der Initialisierung über die Heikin-Ashi-Berechnung, die EMA-Filterung und die Signalvalidierung bis zu den Pfeildarstellungen und Warnmeldungen.

Initialisierung des Indikators
Beim Start erhält das System Indikator-Handles für die drei in der Analyse verwendeten exponentiell gleitenden Durchschnitte. Jedes Handle wird überprüft, um sicherzustellen, dass es erfolgreich erstellt wurde, bevor die Ausführung fortgesetzt wird.
handleEMA50 = iMA(_Symbol, WorkTF, 50, 0, MODE_EMA, PRICE_CLOSE); handleEMA20H = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_HIGH); handleEMA20L = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_LOW);
Kontrollen der Griffe sind wichtig, um Teillasten zu vermeiden, die die Testergebnisse verfälschen könnten. Wenn ein Aufruf fehlschlägt, beendet sich der EA mit INIT_FAILED, sodass sichergestellt ist, dass Berechnungen nie auf unvollständigen Daten durchgeführt werden. Die gleichen Handles werden bei der Deinitialisierung von IndicatorRelease() freigegeben, um Systemressourcen freizugeben.
- Jede Kerze wird geprüft.
if(handleEMA50 == INVALID_HANDLE || handleEMA20H == INVALID_HANDLE || handleEMA20L == INVALID_HANDLE) return(INIT_FAILED);
- Die Handles werden beim Verlassen freigegeben.
IndicatorRelease(handleEMA50); IndicatorRelease(handleEMA20H); IndicatorRelease(handleEMA20L);
Dual-Mode-Kerzenhandling
Da der eingebaute Heikin-Ashi-Indikator in der Testumgebung nicht immer gezeichnet werden kann, enthält der EA einen redundanten Zeichenmechanismus. Wenn ein integrierter Aufruf erfolgreich ist, werden seine Puffer für den Datenabruf verwendet.
double haOpen = (prevHAopen + prevHAclose) / 2.0; double haClose = (open[i] + high[i] + low[i] + close[i]) / 4.0; double haHigh = MathMax(high[i], MathMax(haOpen, haClose)); double haLow = MathMin(low[i], MathMin(haOpen, haClose));
Schlägt dies fehl oder wird der Testermodus erkannt, konstruiert eine nutzerdefinierte Funktion jede Kerze manuell anhand von Heikin-Ashi-Formeln. Diese werden auf dem Chart durch rechteckige Objekte dargestellt, deren Farben dem Kerzentrend entsprechen. Dieser Dual-Mode-Ansatz garantiert, dass beide Umgebungen die gleichen visuellen Informationen und analytischen Ergebnisse anzeigen.
ObjectCreate(0, name, OBJ_RECTANGLE, 0, t1, haHigh, t2, haLow); ObjectSetInteger(0, name, OBJPROP_COLOR, (haClose > haOpen) ? clrLime : clrRed);
Verwaltung der Chart-Objekte
Alle Chart-Objekte – Pfeile, Rechtecke und Beschriftungen – folgen strengen Namenskonventionen. Jeder wird mit einem vordefinierten Präfix erstellt, das seine Rolle und seinen Signaltyp angibt.
string arrowName = "EMA20HA_BUY_" + IntegerToString(TimeCurrent());
Funktionen wie DeleteObjectsByPrefix() ermöglichen das gezielte Entfernen von abgelaufenen oder überflüssigen Objekten, ohne dass nicht verwandte Chart-Elemente berührt werden.
DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW);
Diese disziplinierte Haushaltsführung verhindert ein Durcheinander während längerer Testsitzungen und sorgt dafür, dass neue Signale deutlich sichtbar bleiben.
Signalkontrolle und De-Duplizierung
Die Engine nutzt eine Kontrolle der Zeitstempel, um zu vermeiden, dass für dieselbe Kerze wiederholte Warnmeldungen oder Zeichnungen generiert werden. Für jedes Signalereignis werden Zeitpunkt und Art des Ereignisses aufgezeichnet; nachfolgende Prüfungen vergleichen die aktuellen Bedingungen mit den gespeicherten Werten, bevor ein neuer Pfeil oder eine neue Warnung erzeugt wird.
if(lastSignalTime == Time[0] && lastSignalType == currentSignal) return; // skip duplicate
Wenn eine Übereinstimmung gefunden wird, wird der Vorgang übersprungen. Diese leichtgewichtige Steuerung verhindert eine übermäßige visuelle Ausgabe und verwirrt den Nutzer nicht bei schnelllebigen Märkten oder schnellen Aktualisierungen in der Simulation.
Validierungsroutine der Trends
Bei jedem Tick berechnet der EA den aktuellen und den vorherigen EMA50-Wert, um die Gesamtneigung zu bestimmen. Diese Bewertung wird vor allen kurzfristigen Prüfungen durchgeführt, sodass das Programm Signale, die dem vorherrschenden Trend entgegenstehen, zurückweisen kann. Die Reihenfolge folgt einer strengen Hierarchie:
- EMA50-Steilheit auswerten – Trendkontext definieren.
- Abrufen von HA- und EMA20-Daten – Bewertung des kurzfristigen Drucks.
- Kombinationsauslöser validieren oder Signal verwerfen.
bool trendBull = ema50_current > ema50_previous; bool trendBear = ema50_current < ema50_previous;
Diese mehrstufige Bewertung spiegelt die im Abschnitt Mechanik beschriebene Logik wider und gewährleistet sowohl Konsistenz als auch Recheneffizienz.
Verwaltung der Visualisierung
Nach Bestätigung eines gültigen Signals werden die grafischen Elemente genau einmal pro Kerze gezeichnet. Die Pfeile werden mit dem vordefinierten Offset platziert, sodass sie über oder unter dem Chart lesbar bleiben, und ihre Namen enthalten das Symbol und die Kerzenzeit, damit sie eindeutig sind.
double arrowPrice = High[0] + (ArrowOffsetPoints * _Point); ObjectCreate(0, arrowName, OBJ_ARROW, 0, Time[0], arrowPrice); ObjectSetInteger(0, arrowName, OBJPROP_COLOR, clrLime);
Manuelle Heikin-Ashi-Kerzen werden, sofern sie verwendet werden, nur bei neuen Balken aktualisiert, um die Prozessorlast zu begrenzen. Das Gleichgewicht zwischen Reaktionsfähigkeit und Effizienz sorgt für eine übersichtliche Oberfläche, auch wenn mehrere Instrumente gleichzeitig überwacht werden.
DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW);
Ressourcenhandhabung und Beendigungsroutine
Bei der Deinitialisierung werden alle Indikator-Handles freigegeben, und jedes Objekt, das die Namenspräfixe des EA trägt, wird gelöscht. Diese Maßnahmen verhindern einen allmählichen Speicherverbrauch, der sonst bei längerem Betrieb auftreten könnte. Die Design-Philosophie ist einfach: Indikatoren übernehmen die schwere Arbeit während der Laufzeit, und das Chart bleibt leicht, wenn das Programm entfernt wird.
IndicatorRelease(handleEMA50); IndicatorRelease(handleEMA20H); IndicatorRelease(handleEMA20L); DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW); DeleteObjectsByPrefix("EMA20HA_", OBJ_RECTANGLE);
Aufschlüsselung der Kernfunktionen

Das obige Diagramm skizziert den internen Prozessablauf des EA – von der Erkennung geschlossener Balken und der Pufferverarbeitung über die EMA-Trendvalidierung bis zum endgültigen Auslösen von Signalen, der Darstellung von Pfeilen und der Erzeugung von Alarmen.
OnInit() – Initialisierungsroutine
Die Initialisierungsfunktion ist für die Einrichtung der Hauptindikatoren und die Vorbereitung der Chart-Umgebung zuständig. Wenn der Expert Advisor geladen wird, erstellt er drei Indikator-Handles – einen für den EMA50, der auf Basis der Schlusskurse berechnet wird, und zwei für den EMA20, die separat auf Basis der Höchst- und Tiefstkurse berechnet werden. Jedes Handle wird dann validiert, um sicherzustellen, dass es erfolgreich erstellt wurde; ungültige Handles können zu Berechnungsfehlern oder Laufzeitausnahmen führen. Bevor die Funktion einen Erfolgsstatus zurückgibt, löscht sie auch alle verbleibenden Chart-Objekte, die sich auf frühere Läufe beziehen, um zu gewährleisten, dass Signale und visuelle Darstellungen neu beginnen.
int OnInit() { // Load EMA indicators handleEMA50 = iMA(_Symbol, WorkTF, 50, 0, MODE_EMA, PRICE_CLOSE); handleEMA20H = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_HIGH); handleEMA20L = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_LOW); // Check handles if(handleEMA50 == INVALID_HANDLE || handleEMA20H == INVALID_HANDLE || handleEMA20L == INVALID_HANDLE) { Print("Failed to create EMA handles"); return(INIT_FAILED); } // Remove any old objects from chart DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW); DeleteObjectsByPrefix("EMA20HA_", OBJ_RECTANGLE); return(INIT_SUCCEEDED); }
OnTick() – Hauptausführungsschleife
Diese Funktion wird bei jedem Markttick ausgeführt, verarbeitet Datenaktualisierungen, prüft Handelsbedingungen und erstellt Signalausgaben. Zunächst werden der aktuelle und der vorherige Wert des EMA50 sowie die letzten Werte des EMA20 High und des EMA20 Low abgerufen. Anhand dieser Datenpunkte wird dann die aktuelle Heikin-Ashi-Kerzenstruktur generiert und die vorherrschende Trendrichtung durch den Vergleich der Steigung des EMA50 bestimmt. Schließlich wertet es Kauf- und Verkaufssignale mithilfe spezieller Bedingungsfunktionen aus und löst visuelle Ausgaben aus, wenn die Bedingungen erfüllt sind.
void OnTick() { // Get latest indicator values double ema50_current = CopyBufferValue(handleEMA50, 0); double ema50_previous = CopyBufferValue(handleEMA50, 1); double ema20_high = CopyBufferValue(handleEMA20H, 0); double ema20_low = CopyBufferValue(handleEMA20L, 0); // Compute current Heikin-Ashi candle HA_Candle ha = GetHeikinAshiCandle(0); // Validate trends bool trendBull = ema50_current > ema50_previous; bool trendBear = ema50_current < ema50_previous; // Signal detection if(IsBuySignal(ha, ema20_high, ema50_current, trendBull)) PlaceSignalArrow(true); if(IsSellSignal(ha, ema20_low, ema50_current, trendBear)) PlaceSignalArrow(false); }
GetHeikinAshiCandle() – HA-Berechnungshilfsfunktion
Diese Hilfsfunktion erzeugt die geglätteten Kerzendaten für eine bestimmte Schicht in der Vergangenheit. Es berechnet den HA-Schluss als Durchschnitt der rohen OHLC-Werte und berechnet dann den HA-Open als Durchschnitt der vorherigen HA-Open und -Schluss. Die Höchst- und Tiefstwerte werden durch den Vergleich der geglätteten Werte mit den rohen Extremwerten ermittelt. Eine boolesche Flag zeigt an, ob die Kerze bullisch oder bärisch ist, basierend auf dem Verhältnis zwischen HA close und HA open.
HA_Candle GetHeikinAshiCandle(int shift) { HA_Candle ha; ha.close = (Open[shift] + High[shift] + Low[shift] + Close[shift]) / 4.0; double prev_ha_open = (Open[shift+1] + Close[shift+1]) / 2.0; ha.open = (prev_ha_open + ha.close) / 2.0; ha.high = MathMax(High[shift], MathMax(ha.open, ha.close)); ha.low = MathMin(Low[shift], MathMin(ha.open, ha.close)); ha.isBull = ha.close > ha.open; return(ha); }
IsBuySignal() – Kaufbedingungsprüfung
Die Kaufsignalfunktion prüft, ob die aktuelle HA-Kerze alle Kriterien für einen Long-Handel erfüllt. Sie prüft auf eine Aufwärtskerze, einen Schlusskurs über dem EMA20-Hoch, einen Schlusskurs über dem EMA50 und einen positiven Trend des EMA50. Wenn eine dieser Bedingungen nicht erfüllt ist, gibt die Funktion den Wert „false“ zurück; andernfalls gibt sie den Wert „true“ zurück, um anzuzeigen, dass ein gültiges Kaufangebot vorliegt.
bool IsBuySignal(HA_Candle ha, double ema20_high, double ema50, bool trendBull) { if(!ha.isBull) return(false); if(ha.close <= ema20_high) return(false); if(ha.close <= ema50) return(false); if(!trendBull) return(false); return(true); }
PlaceSignalArrow() – Visuelle Ausgabe
Diese Funktion dient der Visualisierung von Charts für gültige Handelssignale. Sie berechnet den Platzierungsabstand eines Pfeils unterhalb des Tiefs für Käufe oder oberhalb des Hochs für Verkäufe, weist je nach Handelstyp eine Farbe zu, erstellt das Objekt und gewährleistet die Einzigartigkeit, indem sie den Zeitstempel in den Namen des Pfeils einbettet.
void PlaceSignalArrow(bool isBuy) { double price = isBuy ? (High[0] + ArrowOffsetPoints * _Point) : (Low[0] - ArrowOffsetPoints * _Point); string name = isBuy ? "EMA20HA_BUY_" + IntegerToString(Time[0]) : "EMA20HA_SELL_" + IntegerToString(Time[0]); int color = isBuy ? clrLime : clrRed; ObjectCreate(0, name, OBJ_ARROW, 0, Time[0], price); ObjectSetInteger(0, name, OBJPROP_COLOR, color); }
DeleteObjectsByPrefix() – Säubern des Charts
Um Unordnung zu vermeiden und Ressourcen zu verwalten, entfernt diese Funktion alle Chart-Objekte, die mit einem bestimmten Präfix beginnen und dem angegebenen Typ entsprechen. Sie wird während der Initialisierung und Deinitialisierung aufgerufen, um einen sauberen Arbeitsbereich zu erhalten.
void DeleteObjectsByPrefix(string prefix, ENUM_OBJECT type) { for(int i = ObjectsTotal()-1; i >= 0; i--) { string name = ObjectName(i); if(StringFind(name, prefix) == 0 && ObjectType(name) == type) ObjectDelete(0, name); } }
Leitfaden für den Einsatz
Um die Strategie zu implementieren, kopieren Sie die .mq5-Quelldatei in den Experts-Ordner des Terminals und kompilieren Sie sie in MetaEditor mit F7. Sobald die Kompilierung erfolgreich abgeschlossen ist, öffnen Sie ein Chart mit dem gewünschten Symbol und Zeitrahmen und ziehen Sie den EA aus dem Bereich „Navigator – Expert Advisors“ auf das Chart. Vergewissern Sie sich, dass der Algo-Handel aktiviert ist, damit Signale bei neuen Bars verarbeitet werden können.
Das folgende Bild zeigt die Erstellung des EA in MetaEditor und die erfolgreiche Kompilierung zur Verwendung in MetaTrader.

Vergewissern Sie sich vor der Ausführung, dass Ihr Terminal über historische Daten für den gewählten Zeitrahmen verfügt; Heikin-Ashi- und EMA-Berechnungen erfordern vollständige Datenreihen. Überprüfen Sie nach dem Anschließen die Registerkarte Experten; eine erfolgreiche Initialisierungsmeldung bestätigt die Bereitschaft.
Typische Parameter sind
input ENUM_TIMEFRAMES WorkTF = PERIOD_M15; input int ArrowOffsetPoints = 50; input bool EnableAlerts = true;
Diese steuern die Auswahl des Zeitrahmens, den Versatz der Pfeilplatzierung und das Verhalten der Warnmeldungen. Passen Sie sie nach Bedarf an, um die Volatilität und die Lesbarkeit des Charts zu verbessern. Um die Zuverlässigkeit zu gewährleisten, sollten Sie den EA im visuellen Modus des Strategietesters testen, bevor Sie zum Echtbetrieb übergehen. Sobald die Leistung und das Erscheinungsbild überprüft sind, wenden Sie die gleichen Einstellungen auf ein Demo- oder Live-Konto an.
Nachdem Sie den EA kompiliert und angehängt haben, können Sie ihn in Live-Charts oder im Strategietester testen. Wenn Sie normalerweise den in MetaTrader eingebauten Heikin-Ashi-Indikator verwenden, müssen Sie ihn bei einem Backtest nicht anhängen. Der EA berechnet und zeichnet seine eigenen HA-geglätteten Kerzen direkt auf dem Chart während des Tests. Dadurch wird sichergestellt, dass Sie dieselbe HA-Struktur sehen, egal ob der eingebaute Indikator ein- oder ausgeschaltet ist. Um Klarheit zu schaffen, können Sie zwei kurze visuelle Tests durchführen.
- Wenn Sie einen Backtest mit deaktiviertem HA durchführen, sehen Sie immer noch vom EA erzeugte HA-Kerzen.
input bool UseBuiltInHA = false;
- Bei einem Backtest mit aktiviertem integrierten HA zeigt der Chart beide Versionen an, aber die Version des EA wird für die Signale verwendet.
input bool UseBuiltInHA = true;
Dies hilft zu bestätigen, dass die visuelle Ausgabe von den internen Berechnungen des EA stammt und nicht von dem Standardindikator der Plattform.
Tests
Erste Backtests sowie Beobachtungen in Demo- und Live-Umgebungen deuten darauf hin, dass sich der Ansatz „Heikin-Ashi EMA Fusion“ unter verschiedenen Marktbedingungen konsistent verhält. Das mehrstufige Filterdesign erzeugte selektivere Signale, die im Allgemeinen eher mit anhaltenden Kursbewegungen als mit kurzfristigen Schwankungen übereinstimmten. Dank der visuellen Ausgabe lassen sich die Signalbedingungen leicht auf dem Chart überprüfen.
Live-Chart-Ergebnisse auf dem Demo-Konto.

Im visuellen Backtest-Modus zeichnet CandleSmoothing EMA Engine.mq5 seine eigenen Heikin-Ashi-geglätteten Kerzen direkt auf dem Chart. Er stützt sich nicht auf den integrierten Heikin-Ashi-Indikator der Plattform. Diese Kerzen werden zusammen mit den Höchst- und Tiefstständen des EMA20 und der EMA50-Trendfilterlinie angezeigt. Dies erleichtert es, die gesamte Marktstruktur auf einen Blick zu erfassen.
Wenn ein Handelsaufbau bestätigt wird, zeigt der Indikator einen Pfeil auf dem Chart an. Grüne Pfeile markieren Kaufsignale, während rote Pfeile Verkaufssignale darstellen. Die Pfeile sind leicht über oder unter der Kerze positioniert, damit sie gut zu sehen sind. Jedes Signal wird auch auf der Registerkarte „Experten“ gespeichert, einschließlich Symbol, Zeitpunkt und Handelsrichtung. So können Händler die Chart-Signale mit der tatsächlichen Berechnungslogik vergleichen. Dieses H1-Backtest-Beispiel zeigt, wie der Multi-Layer-Filter viele falsche Signale entfernt. Das Ergebnis sind weniger Abschlüsse, dafür aber zuverlässigere und besser auf die aktuelle Marktdynamik abgestimmte Einstiegsmöglichkeiten.

Sowohl bei den Backtests als auch bei den Live-Durchläufen passte der EA seine Signalfrequenz an die veränderten Marktbedingungen an. Bei starken Trends wurden nur dann Signale generiert, wenn der Preis aus dem kurzfristigen EMA20-Kanal ausbrach und der EMA50-Anstieg die Richtung bestätigte. Auf diese Weise konnten Trades während schwacher Rücksetzer in der Gegenbewegung vermieden werden. Warnungen wurden unmittelbar nach dem Schließen eines Balkens gedruckt, und Pfeile wurden nur einmal pro Signal gezeichnet, ohne Duplikate. Dies bestätigt, dass die Logik der Verarbeitung des geschlossenen Balkens und die lastSignalType-Sicherung wie vorgesehen funktionieren. Insgesamt zeigen die Tests, dass der Expert Advisor bei Rohstoffen, synthetischen Indizes und Devisenpaaren zuverlässig funktioniert.
Schlussfolgerung
Die Entwicklung und frühe Erprobung des Candle Smoothing EMA Signal EA deuten darauf hin, dass die Verwendung mehrerer Filter dazu beiträgt, viele der Schwächen zu beheben, die bei reinen Heikin-Ashi-Strategien auftreten. In meinen Tests führte die Kombination der EMA20-Hoch- und Tiefstwerte mit einem EMA50-Trendcheck zu weniger und klareren Signalen, die besser mit der allgemeinen Marktrichtung übereinstimmten.
Sowohl Backtests als auch Demo- oder Live-Läufe zeigen, dass der EA rauschbedingte Umkehrungen und Fehlsignale reduziert. Die Tests wurden über mehrere Instrumente und Zeiträume hinweg durchgeführt. Alle Details, einschließlich der Symbole, Zeitrahmen, Datumsbereiche, Tick-Modelle und Spread-Einstellungen, werden im Abschnitt Backtesting bereitgestellt, um die Reproduzierbarkeit zu unterstützen.
Mit klaren Chart-Pfeilen, EMA-Overlays und Alarmen, die beim Schließen der Bars generiert werden, ist der EA als praktisches, rein signalorientiertes Tool gedacht, das den Arbeitsablauf eines Händlers bestätigt. Es handelt sich nicht um ein automatisches System der Geldverwaltung. Die Nutzer sollten ihre eigenen Tests durchführen und ein angemessenes Risikomanagement betreiben. Die in der Vergangenheit erzielten Ergebnisse sind keine Garantie für zukünftige Ergebnisse.
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/20851
Warnung: Alle Rechte sind von MetaQuotes Ltd. vorbehalten. Kopieren oder Vervielfältigen untersagt.
Dieser Artikel wurde von einem Nutzer der Website verfasst und gibt dessen persönliche Meinung wieder. MetaQuotes Ltd übernimmt keine Verantwortung für die Richtigkeit der dargestellten Informationen oder für Folgen, die sich aus der Anwendung der beschriebenen Lösungen, Strategien oder Empfehlungen ergeben.
Einführung in MQL5 (Teil 36): Beherrschen der API und der Funktion WebRequest in MQL5 (X)
MQL5-Werkzeuge für den Handel (Teil 11): Dashboard einer Korrelationsmatrix (Pearson, Spearman, Kendall) mit Heatmap und Standardmodi
Eine alternative Log-datei mit der Verwendung der HTML und CSS
Einführung in MQL5 (Teil 35): Beherrschen der API- und WebRequest-Funktion in MQL5 (IX)
- 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.