Kombinieren Sie fundamentale und technische Analysestrategien in MQL5 für Einsteiger
Einführung
Fundamentalanalyse und Trendfolgestrategien werden oft als gegensätzliche Ansätze betrachtet. Viele Händler, die die Fundamentalanalyse bevorzugen, sind der Meinung, dass die technische Analyse Zeitverschwendung ist, da alle notwendigen Informationen bereits im Preis enthalten sind. Umgekehrt sehen technische Analysten die Fundamentalanalyse oft als fehlerhaft an, weil identische Muster, wie Kopf und Schulter, auf demselben Markt zu unterschiedlichen Ergebnissen führen können.
Für jeden neuen Händler kann sich dies leicht überwältigend anfühlen, weil man mit so vielen Möglichkeiten konfrontiert wird, aber welche ist die beste? Mit welcher Strategie erzielen Sie auf Ihrem Handelskonto stets Gewinne, während Sie sich bei ungünstigen Bedingungen vom Markt fernhalten?
Als Autorin glaube ich, dass die Wahrheit irgendwo in der Mitte liegt. In diesem Artikel soll untersucht werden, ob es möglich ist, eine stabile Handelsstrategie zu entwickeln, die die besten Aspekte der fundamentalen und der technischen Analyse miteinander verbindet, und ob sich eine solche Strategie lohnt, Zeit zu investieren.
Wir werden unseren Expert Advisor von Grund auf mit nativem MQL5 aufbauen, was uns die Flexibilität gibt, unsere Strategie auf jedem Markt zu testen. Am Ende dieses Artikels werden Sie es verstehen:
- Wie Sie Ihre eigenen Expert Advisors in MQL5 erstellen.
- Wie man ein Ensemble von technischen Indikatoren kombiniert.
- Ein Rahmen für die Konzeptualisierung von fundamentalen und technischen Daten.
Überblick über die Handelsstrategie
Unsere Handelsstrategie setzt sich aus 2 Komponenten zusammen:
- Fundamentale Analyse
- Technische Analyse
Lassen Sie uns jeden Ansatz der Reihe nach betrachten, um zu verstehen, wie sie sich gegenseitig ergänzen, anstatt zu versuchen, zu bestimmen, welcher Ansatz besser ist. Zunächst werden wir die grundlegenden Prinzipien verstehen, die unsere Strategie motivieren.
Auf den ersten Blick können Finanzcharts sehr zufällig und unvorhersehbar erscheinen. Finanzdatensätze sind bekanntermaßen verrauscht und manchmal sogar instabil. Die Analyse dieser Charts aus einer fundamentalen Perspektive kann jedoch zu ganz anderen Schlussfolgerungen über das Marktverhalten führen.
Fundamentale Analyse
Die Fundamentalanalyse beruht auf dem Verständnis der Funktionsweise der Märkte. In unserer Diskussion werden wir uns auf Währungspaare konzentrieren und unseren Handelsalgorithmus aufbauen, um unser Verständnis der Devisenmärkte und ihrer wichtigsten Teilnehmer zu nutzen.
Abb. 1: Ein Beispiel für die Fundamentalanalyse des AUDJPY-Paares.
Fundamentale Händler diskutieren oft über Unterstützung und Widerstand, obwohl es keine endgültigen Definitionen für diese Konzepte gibt. Ich möchte eine mögliche Interpretation aus einer grundlegenden Perspektive anbieten.
Bei der Betrachtung des Wechselkurses zwischen zwei Währungen vergisst man leicht die Auswirkungen auf die reale Welt. Steigt beispielsweise der USDJPY-Chart, bedeutet dies, dass der japanische Yen gegenüber dem Dollar an Wert verliert. Da 90 % der weltweiten Rohstoffpreise in Dollar angegeben werden, zeigt ein steigender Chart an, dass Japans Exporte im Ausland weniger Geld einbringen.
Sollte der Wechselkurs weiterhin ungebremst steigen, stünde die japanische Regierung vor großen Herausforderungen. Ihre Exporte wären nur noch wenig wert, was zu einer wirtschaftlichen Belastung und einem Rückgang des Lebensstandards führen würde. Familien könnten Schwierigkeiten haben, sich das Nötigste zu leisten, und das Land könnte mit einer Hyperinflation und katastrophalen wirtschaftlichen Bedingungen konfrontiert werden.
Um dies zu verhindern, ist es für das Wohlergehen Japans von entscheidender Bedeutung, dass der Wechselkurs zwischen dem Yen und dem US-Dollar in einer erträglichen Bandbreite bleibt. Wenn der Wechselkurs zu hoch wird, sieht sich die japanische Regierung veranlasst, auf den Devisenmärkten zu intervenieren, um ihre Wirtschaft zu schützen. Umgekehrt könnte die US-Regierung, wenn der Wechselkurs zu niedrig ist, Unterstützung leisten, um das Gleichgewicht zu erhalten. So lassen sich Unterstützung und Widerstand aus fundamentaler Sicht interpretieren.
Die Devisenkurse werden größtenteils durch die kumulierten Entscheidungen großer Finanzinstitute wie Privatkundenbanken, Investmentbanken und Hedgefonds bestimmt. Diese Finanzmächte kontrollieren große Mengen an Geld, und ihre Entscheidungen als Gruppe bestimmen die Märkte.
Aus fundamentaler Sicht würden wir also nicht gegen die großen Unternehmen handeln wollen, sondern wir würden es vorziehen, Gelegenheiten zu finden, mit den dominierenden Marktteilnehmern in die gleiche Richtung zu handeln.
Durch die Analyse der Preisveränderungen auf höheren Zeitskalen, z. B. auf wöchentlicher oder monatlicher Ebene, können wir einen Einblick in das Preisniveau gewinnen, das die großen institutionellen Marktteilnehmer für das beobachtete Wertpapier für angemessen halten. Daher werden wir nach Handelsmöglichkeiten Ausschau halten, die mit der langfristigen Preisentwicklung übereinstimmen.
Unsere grundlegende Strategie besteht aus mehreren Schritten, um alles zusammenzufügen. Zunächst werden wir höhere Zeithorizonte analysieren, um zu verstehen, wo institutionelle Marktteilnehmer den Preis wahrscheinlich nehmen werden. Sobald dies bestätigt ist, werden wir unsere Unterstützungs- und Widerstandsniveaus ermitteln, indem wir die Höchst- und Tiefstkurse der Vorwoche untersuchen. Unser Ziel ist es, Setups mit hoher Wahrscheinlichkeit zu handeln, d. h., wenn der Kurs die Widerstandsmarke überschreitet, werden wir eine Kaufposition eingehen. Umgekehrt werden wir eine Verkaufsposition einnehmen, wenn der Kurs unter das Unterstützungsniveau fällt.
Technische Analyse
Nun werden wir die technische Analyse definieren, die in unsere Handelsstrategie einfließt. Unsere technische Analyse konzentriert sich auf die Identifizierung von Handels-Setups, bei denen unsere Indikatoren mit unserer Fundamentalanalyse übereinstimmen. Das bedeutet, dass wir bei einem Aufwärtstrend auf höheren Zeitskalen nur dann nach Setups suchen, wenn unsere technischen Indikatoren uns signalisieren, dass wir kaufen sollten. Umgekehrt suchen wir bei einem rückläufigen Trend auf höheren Zeitskalen nur nach Setups, bei denen unsere Indikatoren einen Verkauf signalisieren.
Der erste Indikator in unserem Ensemble ist der „Money Flow Index“ (MFI, Geldflussindex). Der MFI dient als Volumenindikator und spielt eine entscheidende Rolle in unserer Strategie. Wir berücksichtigen nur Handelsgeschäfte, die durch ein signifikantes Volumen unterstützt werden. Geschäfte mit schwachem oder gegenläufigem Volumen fallen nicht in unseren Bereich. In unserer Strategie interpretieren wir den MFI anders als herkömmliche Methoden. Wir zentrieren den MFI auf 50: Messwerte unter 50 deuten auf ein rückläufiges Volumen hin, während Messwerte über 50 auf ein steigendes Volumen hindeuten.
Als Nächstes verwenden wir den Indikator Moving Average Convergence Divergence (MACD). Ähnlich wie bei unserem Ansatz für den MFI verwenden wir den MACD nicht in seiner traditionellen Bedeutung. Stattdessen zentrieren wir unseren MACD um 0. Eine MACD-Signallinie unter 0 signalisiert einen Abwärtstrend, während eine Signallinie über 0 einen Aufwärtstrend anzeigt.
Neben dem MFI und dem MACD beinhaltet unsere Strategie einen klassischen Trendfolgeansatz unter Verwendung eines gleitenden Durchschnitts. Im Gegensatz zu unserem Ansatz bei anderen technischen Indikatoren interpretieren wir den gleitenden Durchschnitt auf herkömmliche Weise: Liegt der Kurs unter dem gleitenden Durchschnitt, signalisiert er eine Verkaufsmöglichkeit; liegt der Kurs über dem gleitenden Durchschnitt, signalisiert er eine Kaufmöglichkeit.
Darüber hinaus integrieren wir den Stochastik-Oszillator in unsere Strategie, wobei wir uns an seine traditionelle Interpretation halten. Wenn der Oszillator einen Wert über 20 anzeigt, interpretieren wir dies als Kaufsignal. Umgekehrt bedeutet ein Wert unter 80 für den Oszillator ein Verkaufssignal.
Daher die Gründe, ein Wertpapier zu kaufen:
- Der Kurs muss über dem gleitenden Durchschnitt schließen
- Das MACD-Signal sollte über 0 liegen.
- Der MFI-Wert sollte größer als 50 sein.
- Der Stochastik-Oszillator sollte über 20 liegen.
- Der Preis muss in den letzten 3 Monaten gestiegen sein
- Die Kurse sollten oberhalb des Unterstützungsniveaus liegen.
Und umgekehrt, wenn wir ein Wertpapier verkaufen wollen:
- Der Kurs muss unter dem gleitenden Durchschnitt schließen
- Das MACD-Signal sollte unter 0 liegen.
- Der MFI-Wert sollte weniger als 50 % betragen.
- Der Stochastik-Oszillator sollte unter 80 liegen.
- Der Preis muss in den letzten 3 Monaten gefallen sein
- Die Kurse sollten unterhalb des Widerstandsniveaus liegen.
Fangen wir an
Zunächst importieren wir die benötigten Bibliotheken. In diesem Fall werden wir die Handelsbibliothek importieren, um Handelsaufträge auszuführen.
//+------------------------------------------------------------------+ //| Price Action & Trend Following.mq5 | //| Copyright 2024, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Gamuchirai Zororo Ndawana" #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ /* This Expert Advisor will help us implement a combination of fundamental analysis and trend following principles to trade financial securities with precision thanks to the easy to learn MQL5 Language that gives us a blend of creative flexibility and technical control at the same time. Our Fundamental strategy follows the principles outlined below: 1)Respect price movements on higher order time frames 2)Enter at support levels and exit on resistance levels Our Trend following strategy follows principles that have been proven over time: 1)Only enter trades backed by volume 2)Do not trade against the dominant trend, rather wait for setups to go with the bigger trend. 3)Use an ensemble of good confirmation indicators Gamuchirai Zororo Ndawana Selebi Phikwe Botswana 11:06 Thursday 11 July 2024 */ //+------------------------------------------------------------------+ //| Include necessary libraries | //+------------------------------------------------------------------+ #include <Trade/Trade.mqh> CTrade Trade;
Als Nächstes müssen wir die Eingaben für unser Programm definieren. Diese Eingaben steuern die Periodenlängen unserer technischen Indikatoren, die gewünschte Größe des Handels-Lots und andere Variablen dieser Art.
//+------------------------------------------------------------------+ //| Input parameters for technical indicators | //+------------------------------------------------------------------+ input int stoch_percent_k = 5; // Stochastic %K input int stoch_percent_d = 3; // Stochastic %D input int stoch_slowing = 3; // Stochastic Slowing input int macd_fast_ema = 12; // MACD Fast EMA input int macd_slow_ema = 26; // MACD Slow EMA input int macd_sma = 9; // MACD SMA input int ma_period = 60; // Moving Average Period input int mfi_period = 14; // MFI Period input int lot_multiple = 10; // Lot size multiplier
Jetzt werden wir globale Variablen erstellen, die wir in unserer gesamten Anwendung verwenden werden. In diesen Variablen werden unsere Unterstützungs- und Widerstandsniveaus, Puffer für technische Indikatoren, Brief- und Geldkurse (ask & bid) und andere Informationen dieser Art gespeichert.
//+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ double ask, bid; // Ask and Bid prices double min_distance = 0.2; // Minimum distance for stoploss double min_lot_size = 0; // Minimum lot size double position_size; // Actual position size double last_week_high = 0; // High of the previous week double last_week_low = 0; // Low of the previous week string last_week_high_name = "last week high"; // Name for high level object string last_week_low_name = "last week low"; // Name for low level object double higher_time_frame_change = 0.0; // Change on higher time frame string zone_location = ""; // Current zone location int zone = 0; // Zone indicator string higher_time_frame_trend = ""; // Higher time frame trend int trend = 0; // Trend indicator int ma_handler, stoch_handler, macd_handler, mfi_handler; // Handlers for indicators double ma_reading[], stoch_signal_reading[], macd_signal_reading[], mfi_reading[]; // Buffers for indicator readings
Unser Ziel ist es nun, unseren OnInit() zu definieren. In dieser Funktion werden wir unsere technischen Indikatoren initialisieren und unsere Handels-Lot entsprechend anpassen.
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Set up handlers for technical indicators ma_handler = iMA(_Symbol, PERIOD_CURRENT, ma_period, 0, MODE_EMA, PRICE_CLOSE); macd_handler = iMACD(_Symbol, PERIOD_CURRENT, macd_fast_ema, macd_slow_ema, macd_sma, PRICE_CLOSE); stoch_handler = iStochastic(_Symbol, PERIOD_CURRENT, stoch_percent_k, stoch_percent_d, stoch_slowing, MODE_EMA, STO_CLOSECLOSE); mfi_handler = iMFI(_Symbol, PERIOD_CURRENT, mfi_period, VOLUME_TICK); //--- Adjust lot size min_lot_size = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); position_size = min_lot_size * lot_multiple; //--- Initialization done return(INIT_SUCCEEDED); }
Jetzt werden wir eine Funktion definieren, die die Unterstützungs- und Widerstandsniveaus abruft, die durch den Handelsverlauf der letzten Woche definiert wurden.
//+------------------------------------------------------------------+ //| Function to get the previous week's high and low prices | //+------------------------------------------------------------------+ bool get_last_week_high_low(void) { //--- Reset values last_week_high = 0; last_week_low = 0; //--- Remove old levels if any ObjectDelete(0, last_week_high_name); ObjectDelete(0, last_week_low_name); //--- Update high and low values last_week_high = iHigh(_Symbol, PERIOD_W1, 1); last_week_low = iLow(_Symbol, PERIOD_W1, 1); //--- Mark current levels of support and resistance ObjectCreate(0, last_week_high_name, OBJ_HLINE, 0, 0, last_week_high); ObjectCreate(0, last_week_low_name, OBJ_HLINE, 0, 0, last_week_low); //--- Check for valid values return((last_week_high * last_week_low) != 0); }
Nun müssen wir die Kursentwicklung in den höheren Zeitrahmen verstehen. Denken Sie daran, dass wir auf den vergangenen Konjunkturzyklus zurückblicken, d. h. auf etwa drei Monate, um Rückschlüsse auf das Verhalten der institutionellen Akteure am Markt zu ziehen.
//+------------------------------------------------------------------+ //| Function to determine higher time frame price movement | //+------------------------------------------------------------------+ bool get_higher_time_frame_move(void) { //--- Analyze weekly time frame higher_time_frame_change = iClose(_Symbol, PERIOD_CURRENT, 1) - iClose(_Symbol, PERIOD_W1, 12); //--- Check for valid values return((iClose(_Symbol, PERIOD_W1, 12) * iClose(_Symbol, PERIOD_W1, 1)) != 0); }
Als Nächstes werden wir uns mit der Interpretation der gesammelten Preissignale befassen. Insbesondere müssen wir verstehen, ob wir uns über dem Hoch der letzten Woche befinden, was wir als Zone 1 bezeichnen, oder ob wir uns unter dem Tief der letzten Woche befinden, was wir als Zone 3 bezeichnen, und schließlich, wenn wir uns dazwischen befinden, sind wir in Zone 2. Dann kennzeichnen wir den Trend, den wir auf dem höheren Zeitrahmen identifiziert haben. Wenn der Preis auf dem höheren Zeitrahmen gestiegen ist, kennzeichnen wir den Trend mit 1, ansonsten mit -1.
//+------------------------------------------------------------------+ //| Function to interpret price action data | //+------------------------------------------------------------------+ void interpet_price_action(void) { //--- Determine zone location based on last week's high and low if(iClose(_Symbol, PERIOD_CURRENT, 0) > last_week_high) { zone = 1; zone_location = "We are above last week's high"; } else if(iClose(_Symbol, PERIOD_CURRENT, 0) < last_week_low) { zone = 3; zone_location = "We are below last week's low"; } else { zone = 2; zone_location = "We are stuck inside last week's range"; } //--- Determine higher time frame trend if(higher_time_frame_change > 0) { higher_time_frame_trend = "Higher time frames are in an up trend"; trend = 1; } else if(higher_time_frame_change < 0) { higher_time_frame_trend = "Higher time frames are in a down trend"; trend = -1; } }
Jetzt brauchen wir eine Funktion, die unsere technischen Indikatorwerte aktualisiert und die aktuellen Marktdaten abruft.
//+------------------------------------------------------------------+ //| Function to update technical indicators and fetch market data | //+------------------------------------------------------------------+ void update_technical_indicators(void) { //--- Update market prices ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); //--- Copy indicator buffers CopyBuffer(ma_handler, 0, 1, 1, ma_reading); CopyBuffer(stoch_handler, 1, 1, 1, stoch_signal_reading); CopyBuffer(macd_handler, 1, 1, 1, macd_signal_reading); CopyBuffer(mfi_handler, 0, 1, 1, mfi_reading); }
Diese Funktion führt unsere Handelseinträge für uns aus, wenn wir die Erlaubnis von unserer Funktion für die pessimistische Stimmung haben, werden wir einen Verkaufsgeschäft eröffnen. Umgekehrt können wir nur dann Kaufpositionen eröffnen, wenn wir die Erlaubnis unserer Funktion für die optimistische Stimmung haben.
//+------------------------------------------------------------------+ //| Function to find entry points for trades | //+------------------------------------------------------------------+ void find_entry(void) { //--- Check for bullish sentiment if(bullish_sentiment()) { Trade.Buy(position_size, _Symbol, ask, (last_week_low - min_distance), (last_week_high + min_distance)); } //--- Check for bearish sentiment else if(bearish_sentiment()) { Trade.Sell(position_size, _Symbol, bid, (last_week_high + min_distance), (last_week_low - min_distance)); } }
Lassen Sie uns nun genau definieren, was es für unsere beiden Handelssysteme bedeutet, wenn sie sich für ein Kauf-Setup ausrichten. Wir möchten, dass der Kurs über dem gleitenden Durchschnitt schließt, dass unser MFI-Indikator über 50 liegt, dass unser MACD-Wert über 0 liegt, dass der Stochastik-Oszillator über 20 liegt, dass der Trend auf dem höheren Zeitrahmen nach oben zeigt und dass wir über dem Unterstützungsniveau liegen.
//+------------------------------------------------------------------+ //| Function to analyze bullish signals | //+------------------------------------------------------------------+ bool bullish_sentiment(void) { //--- Analyze conditions for bullish sentiment return((mfi_reading[0] > 50) && (iClose(_Symbol, PERIOD_CURRENT, 1) > ma_reading[0]) && (macd_signal_reading[0] > 0) && (stoch_signal_reading[0] > 20) && (trend == 1) && (zone < 3)); }
Umgekehrt gilt das auch für unsere Verkaufsarrangements.
//+------------------------------------------------------------------+ //| Function to analyze bearish signals | //+------------------------------------------------------------------+ bool bearish_sentiment(void) { //--- Analyze conditions for bearish sentiment return((mfi_reading[0] < 50) && (iClose(_Symbol, PERIOD_CURRENT, 1) < ma_reading[0]) && (macd_signal_reading[0] > 0) && (stoch_signal_reading[0] < 80) && (trend == -1) && (zone > 1)); }
Schließlich brauchen wir noch OnTick(), der sicherstellt, dass der Ablauf der Ereignisse in unserer Anwendung wie vorgesehen erfolgt. Beachten Sie, dass wir mit der Überprüfung des Zeitstempels beginnen. So können wir sicherstellen, dass unsere Anwendung nur einmal pro Woche nach Unterstützungs- und Widerstandsniveaus sucht. Wenn wir keine neuen Wochenkerzen haben, macht es keinen Sinn, bei jedem Tick nach denselben Informationen zu suchen! Wenn alles in Ordnung ist, interpretiert unser Expert Advisor die Kursbewegung, aktualisiert unsere technischen Indikatoren und sucht dann nach einem Handelseinstieg.
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- Check for new candle on higher time frame static datetime time_stamp; datetime current_time = iTime(_Symbol, PERIOD_W1, 0); if(time_stamp != current_time) { time_stamp = current_time; if(!get_last_week_high_low()) { Print("Failed to get historical performance of ", _Symbol); Print("[ERROR]: ", GetLastError()); } else if(!get_higher_time_frame_move()) { Print("Failed to analyze historical performance of ", _Symbol); Print("[ERROR]: ", GetLastError()); } } else { interpet_price_action(); update_technical_indicators(); if(PositionsTotal() == 0) { find_entry(); } Comment("Last week high: ", last_week_high, "\nLast week low: ", last_week_low, "\nZone: ", zone_location, "\nTrend: ", higher_time_frame_trend); } }
Abb. 2: Unser Expert Advisor handelt den AUDJPY auf dem H1-Zeitrahmen.
Abb. 3: Die Ergebnisse des Backtests unseres Handelsalgorithmus auf H1-Daten des AUDJPY-Symbols über einen Monat.
Schlussfolgerung
Dieser Artikel veranschaulicht die Integration von fundamentaler und technischer Analyse in Handelsstrategien. Mit MQL5 haben wir gezeigt, wie sich die Erkenntnisse aus diesen beiden Perspektiven nahtlos in umsetzbare Handelsanweisungen umsetzen lassen. Durch die Darstellung eines Rahmens, in dem fundamentale und technische Daten einander ergänzen, anstatt miteinander zu konkurrieren, befähigen wir die Leser, beide Ansätze effektiv zu nutzen.
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/15293
- 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.