
Entwicklung eines Toolkits zur Analyse von Preisaktionen (Teil 20): Externer Fluss (IV) - Correlation Pathfinder
Inhalt
Einführung
Der Devisenhandel erfordert ein klares Verständnis vieler Faktoren. Ein Schlüsselfaktor ist die Korrelation der Währungen. Die Währungskorrelation definiert, wie sich zwei Paare relativ zueinander bewegen. Sie zeigt an, ob sie sich in dieselbe Richtung, in entgegengesetzte Richtungen oder zufällig über die Zeit bewegen. Da Währungen immer paarweise gehandelt werden, jedes Paar ist mit anderen verbunden, wodurch ein Netz von gegenseitigen Abhängigkeiten entsteht.
Die Kenntnis dieser Zusammenhänge kann Ihre Handelsstrategie verfeinern und das Risiko verringern. Wenn Sie beispielsweise sowohl EUR/USD als auch GBP/USD in einem Zeitraum mit hoher positiver Korrelation kaufen, verdoppeln Sie Ihr Engagement gegenüber denselben Marktkräften und erhöhen das Risiko. Oder aber dieses Verständnis ermöglicht es Händlern, diversifizierte Portfolios aufzubauen und Hedging-Strategien effektiv umzusetzen.
In diesem Artikel wird erklärt, wie Sie die Analyse der Währungskorrelation in Ihr Handelsinstrumentarium aufnehmen können. Es bietet praktische Einblicke und umsetzbare Strategien zur Verbesserung der Handelsleistung. Die beiden folgenden Charts veranschaulichen die Marktstruktur für EUR/USD und GBP/USD an denselben Tagen. Beide Paare waren am 2. April im Aufwärtstrend und drehten am 3. April in den Abwärtstrend, was eine positive Korrelation erkennen lässt. Händler können ein Paar verwenden, um Umkehrungen im anderen Paar zu bestätigen. Wenn z. B. EUR/USD überkauft ist und GBP/USD verkauft, ist dies ein klares Signal für eine mögliche Umkehr bei EUR/USD. Das Tool Correlation Pathfinder ist unverzichtbar, da es die Wechselbeziehungen zwischen den Währungspaaren klar aufzeigt und den Händlern hilft, ein genaueres Marktbild zu erhalten.
GBP/USD
Abb. 1. GBP/USD
EUR/USD
Abb. 2. EUR/USD
System-Übersicht
Währungskorrelationen werden durch einen Koeffizienten ausgedrückt, der von -1 bis +1 reicht. Ein Wert nahe +1 zeigt an, dass sich die Währungspaare tendenziell gemeinsam bewegen, während ein Wert nahe -1 signalisiert, dass sie sich in entgegengesetzte Richtungen bewegen. Ein Koeffizient um den Wert Null zeigt an, dass nur ein geringer oder gar kein Zusammenhang besteht.
Dieses Verständnis ist für ein wirksames Risikomanagement unerlässlich. Wenn Sie beispielsweise in Zeiten starker positiver Korrelation sowohl EUR/USD als auch GBP/USD kaufen, erhöht sich das Gesamtmarktengagement, da sich das Risiko effektiv verdoppelt. Im Gegensatz dazu ermöglicht die Kenntnis des Korrelationsgrades den Händlern, ihre Portfolios zu diversifizieren und Absicherungsstrategien anzuwenden, um sich gegen unerwartete Marktbewegungen zu schützen, wie ich bereits erwähnt habe.
Das System besteht aus zwei miteinander verknüpften Komponenten. Zunächst ruft ein MQL5 Expert Advisor kontinuierlich historische Preisdaten für EUR/USD und GBP/USD ab. Es verpackt diese Daten in eine JSON-Struktur und sendet sie an einen Python-Server. Die zweite Komponente ist eine Python-basierte Analyse-Engine. Sie verwendet Pandas, um sowohl Gesamt- als auch rollierende Korrelationen zu berechnen, und nutzt Matplotlib, um ein rollierendes Korrelationsdiagramm mit fester Breite zu erstellen. Darüber hinaus liefert der Server klare Kommentare, die erklären, ob sich die Währungspaare zusammen oder auseinander bewegen, und die Auswirkungen auf die Handelsstrategien darlegen.
Das folgende Flussdiagramm, das den Datenfluss und den Analyseprozess im System skizziert, hilft Ihnen, mehr zu verstehen.
Abb. 3. Flussdiagramm
Dieses Diagramm bietet einen klaren, visuellen Überblick über den Arbeitsablauf des Systems, indem es den Prozess vom Abrufen der Daten im MetaTrader 5 bis zur Erstellung von Analysen und Kommentaren auf dem Python-Server nachzeichnet. Die mit A bis H gekennzeichneten Knoten stellen die einzelnen Schritte des Prozesses dar und veranschaulichen, wie die Daten gesammelt, in JSON verpackt, an den Server übertragen, mit Pandas geparst und analysiert, mit Matplotlib visualisiert und schließlich mit einem interpretierenden Kommentar versehen werden, bevor die Analyseergebnisse zurückgegeben werden.
Technische Details
Der MQL5 Expert Advisor
Abrufen von Daten
Der Expert Advisor ruft historische Kursdaten mithilfe der in MetaTrader 5 integrierten Funktion CopyRates() ab. Diese Funktion holt ein Array von Preisdatensätzen (strukturiert als MqlRates), die Informationen wie Zeit, Eröffnungs-, Höchst-, Tiefst- und Schlusskurs für ein bestimmtes Symbol und einen bestimmten Zeitrahmen enthalten. In diesem EA kann der Nutzer den Zeitrahmen (z. B. 15-Minuten-Intervalle über PERIOD_M15) und die Anzahl der zu exportierenden Balken (Datenpunkte) über den Parameter BarsToExport konfigurieren. Durch die Möglichkeit, diese Werte zu konfigurieren, kann der EA auf verschiedene Handelsstrategien zugeschnitten werden. Unabhängig davon, ob ein Händler eine kurzfristige Momentaufnahme oder einen breiteren Überblick über historische Trends benötigt.
MqlRates rates1[]; if(CopyRates(Symbol1, TimeFrame, 0, BarsToExport, rates1) <= 0) { Print("Failed to copy rates for ", Symbol1); return ""; } ArraySetAsSeries(rates1, true);
Sobald die Daten für jedes Währungspaar (z. B. EUR/USD und GBP/USD) abgerufen wurden, stellt der EA sicher, dass das Datenfeld als Serie eingestellt ist. Dieser Schritt ist von entscheidender Bedeutung, da er das Array so anordnet, dass der jüngste Balken bei Index 0 steht, was mit der Art und Weise übereinstimmt, wie viele andere Funktionen in der MQL5-Umgebung erwarten, dass Daten formatiert werden. Diese Aufbereitung der historischen Daten gewährleistet, dass die richtige Anzahl von Balken abgerufen wird und die richtige chronologische Reihenfolge beibehalten wird, was für die spätere Analyse unerlässlich ist.
Konstruktion von JSON-Nutzdaten
Nachdem die Preisdaten gesammelt wurden, erstellt der EA eine JSON-Nutzlast, die die Daten für die Übermittlung in ein strukturiertes Format bringt. Die Funktion BuildJSONPayload() beginnt mit der Erstellung eines JSON-Objekts, das die Namen der beiden Währungspaare enthält. Anschließend erstellt die Funktion für jedes Währungspaar ein Array von Datenobjekten. Jedes Objekt im Array stellt einen Balken historischer Daten dar und enthält zwei wichtige Informationen: die Zeit (einheitlich formatiert mit TimeToString() mit den Parametern TIME_DATE und TIME_SECONDS) und den Schlusskurs (formatiert auf fünf Dezimalstellen mit DoubleToString()).
string json = "{"; json += "\"symbol1\":\"" + Symbol1 + "\","; json += "\"symbol2\":\"" + Symbol2 + "\","; json += "\"data1\":["; for(int i = 0; i < ArraySize(rates1); i++) { string timeStr = TimeToString(rates1[i].time, TIME_DATE | TIME_SECONDS); json += "{\"time\":\"" + timeStr + "\",\"close\":" + DoubleToString(rates1[i].close, 5) + "}"; if(i < ArraySize(rates1) - 1) json += ","; } json += "],"; // The same pattern repeats for Symbol2's data array. json += "}"; return json;
Dieser modulare Ansatz stellt sicher, dass die Nutzdaten alle notwendigen Details für die Analyse auf dem Python-Server enthalten. Die JSON-Struktur erleichtert die Wahrung der Konsistenz und stellt sicher, dass der Server die Daten, ohne verwirrt zu werden, parsen kann. Durch die Bezeichnung der Arrays als data1 und data2 weiß das Serverskript zum Beispiel genau, welcher Datensatz welchem Währungspaar entspricht. Diese klare Trennung ist entscheidend für die spätere Zusammenführung der Daten bei der Berechnung der Korrelation. Die Funktion iteriert über jedes Array historischer Daten, verkettet jeden Datensatz mit der richtigen JSON-Formatierung und schließt die Konstruktion ab, indem sie das JSON-Objekt schließt.
Die Integration von WebRequest
Sobald der JSON-Payload erstellt ist, sendet der EA die Daten mit der MetaTrader-Funktion WebRequest(), einem wichtigen Tool zur Durchführung von HTTP-Anfragen direkt von der Handelsplattform aus. Diese Komponente übernimmt die Kommunikation zwischen dem MQL5 Expert Advisor und dem Python-Server, der die weitere Analyse durchführt. Vor dem Senden der Daten wandelt der EA den JSON-String mit der Funktion StringToCharArray() in ein dynamisches uchar-Array um, da WebRequest() den Request Body in diesem Format akzeptiert. Diese Umwandlung ist notwendig, um sicherzustellen, dass die Nutzdaten korrekt über das Netz übertragen werden.
string requestHeaders = "Content-Type: application/json\r\n"; uchar result[]; string responseHeaders; int webRequestResult = WebRequest("POST", pythonUrl, requestHeaders, timeout, requestData, result, responseHeaders); if(webRequestResult == -1) { Print("Error in WebRequest. Error code = ", GetLastError()); return; } string response = CharArrayToString(result); Print("Server response: ", response);
Der EA richtet dann die HTTP-Header ein und gibt an, dass die Daten im JSON-Format mit dem Header „Content-Type: application/json\r\n“ vorliegen. Konfigurierbare Eingaben wie die pythonUrl (der Server-Endpunkt) und die Zeitüberschreitung (wie lange der EA auf eine Antwort wartet) ermöglichen dem Nutzer die Feinabstimmung der Netzwerkparameter auf der Grundlage seiner Umgebung. Die Funktion WebRequest() wird mit diesen Headern und Timeout-Einstellungen verwendet, um eine HTTP-POST-Anfrage an den Python-Server zu senden. Wenn die Anfrage fehlschlägt, gibt der EA einen Fehlercode aus, der bei der Behebung von Verbindungsproblemen hilft. Andernfalls wird die resultierende Antwort im Array vom Typ uchar wieder in eine Zeichenkette umgewandelt und dann die Antwort des Servers ausgedruckt. Diese Antwort soll nützliche Informationen enthalten, z. B. einen berechneten Korrelationswert und einen von der Python-Analyse-Engine generierten Kommentar.
Der Python-Analyse-Server
Die Server-Umgebung
Das System ist auf einem Flask-basierten Server aufgebaut, der auf POST-Anfragen wartet. Wenn der Server gestartet wird, initialisiert er sich mit den Standardeinstellungen von Flask und setzt die Protokollierungsstufe auf DEBUG. Diese Konfiguration stellt sicher, dass alle eingehenden Anfragen und Verarbeitungsschritte detailliert protokolliert werden. Der Server ist so konzipiert, dass er JSON-Daten empfängt, sie verarbeitet, die Analyse durchführt und die Ergebnisse im JSON-Format zurückgibt. Durch die Verwendung von Flask bleibt der Server leichtgewichtig und effizient und ist in der Lage, Webanfragen in einer Headless-Umgebung ohne grafische Nutzeroberfläche zu verarbeiten, was ideal für automatisierte Handelsanwendungen ist.
import matplotlib matplotlib.use("Agg") # Use non-interactive backend to avoid GUI overhead import matplotlib.pyplot as plt from flask import Flask, request, jsonify import logging app = Flask(__name__) logging.basicConfig(level=logging.DEBUG) if __name__ == "__main__": app.run(host="127.0.0.1", port=5000)
Datenanalyse und -auswertung
Sobald der Server eine POST-Anforderung erhält, versucht er zunächst, die eingehende JSON-Nutzlast zu parsen. Wenn der Standard-Parser fehlschlägt, dekodiert der Code die rohen Anfragedaten, schneidet alle überflüssigen Zeichen hinter der letzten schließenden geschweiften Klammer ab und lädt dann das JSON. Die geparsten Daten werden dann in zwei separate Pandas DataFrames umgewandelt, einen für jedes Währungspaar. Das Feld „Zeit“ aus der Nutzlast wird geparst und in Datetime-Objekte umgewandelt, um eine genaue Zusammenführung und Zeitreihenanalyse zu erleichtern. Nach der Zusammenführung der beiden DataFrames in der gemeinsamen Spalte „Zeit“ berechnet der Server zwei wichtige Korrelationsmetriken. Zunächst wird die Gesamtkorrelation zwischen den Schlusskursen der beiden Symbole berechnet. Zweitens wird eine rollierende Korrelation mit einem Fenster von 50 Balken berechnet. Diese rollierende Korrelation gibt Aufschluss darüber, wie sich die Korrelation zwischen den Paaren im Laufe der Zeit verändert, was für das Verständnis der Marktdynamik und das Erkennen von Phasen, in denen sich die Beziehung verstärkt oder abschwächt, von entscheidender Bedeutung ist.
import pandas as pd import json @app.route('/analyze', methods=['POST']) def analyze(): # Parse JSON payload data = request.get_json(silent=True) if not data: raw_data = request.data.decode('utf-8').strip() app.logger.debug("Raw request data: %s", raw_data) try: end_index = raw_data.rfind("}") trimmed_data = raw_data[:end_index+1] if end_index != -1 else raw_data data = json.loads(trimmed_data) except Exception as e: app.logger.error("Failed to parse JSON: %s", str(e)) return jsonify({"error": "Invalid JSON received"}), 400 # Convert incoming JSON arrays to DataFrames data1 = pd.DataFrame(data["data1"]) data2 = pd.DataFrame(data["data2"]) # Convert time strings to datetime objects data1['Time'] = pd.to_datetime(data1['time']) data2['Time'] = pd.to_datetime(data2['time']) # Merge DataFrames on 'Time' merged = pd.merge(data1, data2, on="Time", suffixes=('_' + data["symbol1"], '_' + data["symbol2"])) # Calculate overall correlation between the close prices correlation = merged[f'close_{data["symbol1"]}'].corr(merged[f'close_{data["symbol2"]}']) # Calculate rolling correlation with a 50-bar window merged['RollingCorrelation'] = merged[f'close_{data["symbol1"]}'].rolling(window=50).corr(merged[f'close_{data["symbol2"]}']) # [Graph generation and commentary code follows here, see next sections]
Erstellung und Speicherung von Grafiken
Für die visuelle Darstellung setzt der Server Matplotlib ein, wobei das Backend „Agg“ verwendet wird. Dieses Backend umgeht die Notwendigkeit einer grafischen Nutzeroberfläche und stellt sicher, dass der Plot in einer Headless-Umgebung generiert wird, ohne einen GUI-bezogenen Overhead auszulösen. Das Chart wird mit einer festen Größe von 7,5 Zoll Breite und 100 DPI erstellt. Diese Konfiguration garantiert, dass das Ausgabebild eine feste Breite von 750 Pixeln hat, wodurch die Konsistenz der Berichte gewährleistet ist und die visuellen Daten auf einen Blick leicht zu interpretieren sind. Nach der Erstellung wird das Chart, das die rollierende Korrelation anzeigt, als PNG-Datei in demselben Verzeichnis wie das Python-Skript gespeichert. Die lokale Speicherung des Bildes ermöglicht ein einfaches Abrufen und Weitergeben, ohne dass die eigentliche Grafik in der JSON-Antwort des Servers enthalten ist.
import matplotlib.pyplot as plt # Generate a rolling correlation plot plt.figure(figsize=(7.5, 6), dpi=100) # 7.5 inches * 100 dpi = 750 pixels width plt.plot(merged['Time'], merged['RollingCorrelation'], label="Rolling Correlation (50 bars)") plt.xlabel("Time") plt.ylabel("Correlation") plt.title(f"{data['symbol1']} and {data['symbol2']} Rolling Correlation") plt.legend() plt.grid(True) plt.tight_layout() # Save the graph as a PNG file in the same folder plot_filename = "rolling_correlation.png" plt.savefig(plot_filename) plt.close()
Interpretierender Kommentar
Über die reinen Zahlen und Charts hinaus verbessert der Server die Analyse durch die Erstellung interpretierender Kommentare. Dieser Kommentar wird von einer speziellen Funktion erstellt, die sowohl die gesamten als auch die jüngsten (rollierenden) Korrelationswerte untersucht. Wenn beispielsweise die Gesamtkorrelation sehr hoch ist (nahe +1), erklärt der Kommentar, dass sich die beiden Währungspaare im Allgemeinen im Gleichschritt bewegen, was ein Hinweis auf die begrenzte Wirksamkeit der Diversifizierung beim Handel mit mehreren Paaren sein könnte. Ist die Korrelation hingegen gering oder wird sie negativ, weist der Kommentar auf das Potenzial für Paar-Divergenzen und Möglichkeiten zur Absicherung oder Anpassung des Engagements hin.
def generate_commentary(corr, rolling_series): """Generate a commentary based on overall and recent correlation values.""" commentary = "" if corr >= 0.8: commentary += ("The currency pairs have a very strong positive correlation, meaning " "they typically move together. This may support the use of hedging strategies.\n") elif corr >= 0.5: commentary += ("The pairs display a moderately strong positive correlation with some deviations, " "indicating they often move in the same direction.\n") elif corr >= 0.0: commentary += ("The overall correlation is weakly positive, suggesting occasional movement together " "but limited consistency, which may offer diversification opportunities.\n") elif corr >= -0.5: commentary += ("The pairs exhibit a weak to moderate negative correlation; they tend to move in opposite " "directions, which can be useful for diversification.\n") else: commentary += ("The pairs have a strong negative correlation, implying they generally move in opposite " "directions, a factor exploitable in hedging strategies.\n") if not rolling_series.empty: recent_trend = rolling_series.iloc[-1] commentary += f"Recently, the rolling correlation is at {recent_trend:.2f}. " if recent_trend > 0.8: commentary += ("This high correlation suggests near mirror-like movement. " "Relative strength approaches may need reconsideration for diversification.") elif recent_trend < 0.3: commentary += ("A significant drop in correlation indicates potential decoupling. " "This may signal opportunities in pair divergence trades.") else: commentary += ("The correlation remains moderate, meaning the pairs show some synchronization but also " "retain independent movement.") return commentary
Der Kommentar bietet auch Einblicke in die jüngsten Korrelationstrends und gibt Händlern praktische Hinweise darauf, was diese statistischen Signale für ihr Risikomanagement und ihre Strategie bedeuten könnten. Durch die Kombination quantitativer Analysen mit qualitativen Erkenntnissen hilft das System Händlern, das Marktverhalten besser zu verstehen und fundiertere Entscheidungen zu treffen.
Ergebnisse
Bevor wir uns mit den Ergebnissen befassen, muss erklärt werden, wie der Python-Server gestartet wird. Laden Sie zunächst Python von python.org herunter und installieren Sie es. Richten Sie dann eine virtuelle Umgebung ein, indem Sie python -m venv venv ausführen und diese aktivieren. Als Nächstes installieren wir die erforderlichen Pakete, indem wir pip install Flask pandas matplotlib ausführen. Erstellen Sie ein Python-Skript (z. B. server.py), das Ihren Flask-Servercode und die erforderlichen Endpunkte enthält. Navigieren Sie schließlich zum Verzeichnis des Skripts und starten Sie den Server mit python server.py. Weitere Einzelheiten finden Sie in einem meiner früheren Artikel über den externen Fluss.
Im Folgenden werden die Testergebnisse für die Paare EUR/USD und GBP/USD vorgestellt. Die besten Ergebnisse erzielen Sie, wenn Sie das System mit denselben Paaren testen, die in Ihrem EA angegeben sind. Zunächst zeigen die Protokolle der Eingabeaufforderung an, dass das System erfolgreich initialisiert wurde, und sie zeigen deutlich die Daten an, die vom MetaTrader 5 durch den MQL5 EA an den Python-Server weitergeleitet wurden - einschließlich der Eröffnungs-, Schluss- und Zeitwerte für den Zeitraum vom 2. bis 9. April. Der Protokolleintrag “POST /analyze HTTP/1.1“ 200 bestätigt, dass die Verbindung erfolgreich war und dass der Python-Server die erforderliche Verarbeitung erwartungsgemäß durchgeführt hat.
DEBUG:plotter:Raw request data: {"symbol1":"EURUSD","symbol2":"GBPUSD","data1":[{"time":"2025.04.09 07:00:00" ,"close":1.10766},{"time":"2025.04.09 06:45:00","close":1.10735},{"time":"2025.04.09 06:30:00","close":1.10602} ,{"time":"2025.04.09 06:15:00","close":1.10538},{"time":"2025.04.09 06:00:00","close":1.10486}, {"time":"2025.04.09 05:45:00","close":1.10615},{"time":"2025.04.09 05:30:00","close":1.10454}, {"time":"2025.04.09 05:15:00","close":1.10402},{"time":"2025.04.09 05:00:00","close":1.10447}, {"time":"2025.04.09 04:45:00","close":1.10685},{"time":"2025.04.09 04:30:00","close":1.10582}, {"time":"2025.04.09 04:15:00","close":1.10617},{"time":"2025.04.09 04:00:00","close":1.10384}, {"time":"2025.04.09 03:45:00","close":1.10196},{"time":"2025.04.09 03:30:00","close":1.10184}, {"time":"2025.04.09 03:15:00","close":1.10339},{"time":"2025.04.09 03:00:00","close":1.10219}, {"time":"2025.04.09 02:45:00","close":1.10197},{"time":"2025.04.09 02:30:00","close":1.10130}, {"time":"2025.04.09 02:15:00","close":1.10233},{"time":"2025.04.09 02:00:00","close":1.10233}, {"time":"2025.04.09 01:45:00","close":1.10200},{"time":"2025.04.09 01:30:00","close":1.10289}, {"time":"2025.04.09 01:15:00","close":1.10382},{"time":"2025.04.09 01:00:00","close":1.10186}, {"time":"2025.04.09 00:45:00","close":1.10148},{"time":"2025.04.09 00:30:00","close":1.09985}, {"time":"2025.04.09 00:15:00","close":1.09894},{"time":"2025.04.09 00:00:00","close":1.09747}, {"time":"2025.04.08 23:45:00","close":1.09776},{"time":"2025.04.08 23:30:00","close":1.09789}, {"time":"2025.04.08 23:15:00","close":1.09793},{"time":"2025.04.08 23:00:00","close":1.09740}, {"time":"2025.04.08 22:45:00","close":1.09681},{"time":"2025.04.08 22:30:00","close":1.09718}, {"time":"2025.04.08 22:15:00","close":1.09669},{"time":"2025.04.08 22:00:00","close":1.09673}, {"time":"2025.04.08 21:45:00","close":1.09586},{"time":"2025.04.08 21:30:00","close":1.09565}, {"time":"2025.04.08 21:15:00","close":1.09507},{"time":"2025.04.08 21:00:00","close":1.09493}, {"time":"2025.04.08 20:45:00","close":1.09529},{"time":"2025.04.08 20:30:00","close":1.09442}, {"time":"2025.04.08 20:15:00","close":1.09417},{"time":"2025.04.08 20:00:00","close":1.09533}, {"time":"2025.04.08 19:45:00","close":1.09541},{"time":"2025.04.08 19:30:00","close":1.09587}, {"time":"2025.04.08 19:15:00","close":1.09684},{"time":"2025.04.08 19:00:00","close":1.09724}, {"time":"2025.04.08 18:45:00","close":1.09521},{"time":"2025.04.08 18:30:00","close":1.09551}, {"time":"2025.04.08 18:15:00","close":1.09561},{"time":"2025.04.08 18:00:00","close":1.09474}, {"time":"2025.04.08 17:45:00","close":1.09337},{"time":"2025.04.08 17:30:00","close":1.09334}, {"time":"2025.04.08 17:15:00","close":1.09421},{"time":"2025.04.08 17:00:00","close":1.09429}, {"time":"2025.04.08 16:45:00","close":1.09296},{"time":"2025.04.08 16:30:00","close":1.09210}, {"time":"2025.04.08 16:15:00","close":1.09123},{"time":"2025.04.08 16:00:00","close":1.09073}, {"time":"2025.04.08 15:45:00","close":1.09116},{"time":"2025.04.08 15:30:00","close":1.09083}, {"time":"2025.04.08 15:15:00","close":1.09119},{"time":"2025.04.08 15:00:00","close":1.08986}, {"time":"2025.04.08 14:45:00","close":1.09102},{"time":"2025.04.08 14:30:00","close":1.08954}, {"time":"2025.04.08 14:15:00","close":1.09051},{"time":"2025.04.08 14:00:00","close":1.09213}, {"time":"2025.04.08 13:45:00","close":1.09357},{"time":"2025.04.08 13:30:00","close":1.09300}, {"time":"2025.04.08 13:15:00","close":1.09548},{"time":"2025.04.08 13:00:00","close":1.09452}, {"time":"2025.04.08 12:45:00","close":1.09485},{"time":"2025.04.08 12:30:00","close":1.09585}, {"time":"2025.04.08 12:15:00","close":1.09477},{"time":"2025.04.08 12:00:00","close":1.09512}, {"time":"2025.04.08 11:45:00","close":1.09342},{"time":"2025.04.08 11:30:00","close":1.09311}, {"time":"2025.04.07 09:45:00","close":1.09627},{"time":"2025.04.07 09:30:00","close":1.09545}, {"time":"2025.04.07 09:15:00","close":1.09597},{"time":"2025.04.07 09:00:00","close":1.09729}, {"time":"2025.04.07 08:45:00","close":1.09918},{"time":"2025.04.07 08:30:00","close":1.09866}, {"time":"2025.04.07 08:15:00","close":1.09705},{"time":"2025.04.07 08:00:00","close":1.10051}, {"time":"2025.04.07 07:45:00","close":1.10006},{"time":"2025.04.07 07:30:00","close":1.10232}, {"time":"2025.04.07 07:15:00","close":1.10273},{"time":"2025.04.07 07:00:00","close":1.10397}, {"time":"2025.04.07 06:45:00","close":1.10029},{"time":"2025.04.07 06:30:00","close":1.10083}, {"time":"2025.04.07 06:15:00","close":1.10012},{"time":"2025.04.07 06:00:00","close":1.10084}, {"time":"2025.04.07 05:45:00","close":1.10183},{"time":"2025.04.07 05:30:00","close":1.09905}, {"time":"2025.04.07 05:15:00","close":1.09941},{"time":"2025.04.07 05:00:00","close":1.09826}, {"time":"2025.04.07 04:45:00","close":1.09848},{"time":"2025.04.07 04:30:00","close":1.09830}, {"time":"2025.04.07 04:15:00","close":1.09739},{"time":"2025.04.07 04:00:00","close":1.09608}, {"time":"2025.04.07 03:45:00","close":1.09503},{"time":"2025.04.07 03:30:00","close":1.09456}, {"time":"2025.04.07 03:15:00","close":1.09373},{"time":"2025.04.07 03:00:00","close":1.09343}, {"time":"2025.04.07 02:45:00","close":1.09353},{"time":"2025.04.07 02:30:00","close":1.09248}, {"time":"2025.04.07 02:15:00","close":1.09360},{"time":"2025.04.07 02:00:00","close":1.09550}, {"time":"2025.04.07 01:45:00","close":1.09673},{"time":"2025.04.07 01:30:00","close":1.09740}, {"time":"2025.04.07 01:15:00","close":1.09688},{"time":"2025.04.07 01:00:00","close":1.09649}, {"time":"2025.04.07 00:45:00","close":1.09667},{"time":"2025.04.07 00:30:00","close":1.09526}, {"time":"2025.04.07 00:15:00","close":1.09555},{"time":"2025.04.07 00:00:00","close":1.09517}, {"time":"2025.04.06 23:45:00","close":1.09825},{"time":"2025.04.06 23:30:00","close":1.09981}, {"time":"2025.04.06 23:15:00","close":1.09872},{"time":"2025.04.06 23:00:00","close":1.09981}, {"time":"2025.04.06 22:45:00","close":1.09822},{"time":"2025.04.06 22:30:00","close":1.09803}, {"time":"2025.04.06 22:15:00","close":1.09826},{"time":"2025.04.06 22:00:00","close":1.09529}, {"time":"2025.04.06 21:45:00","close":1.09147},{"time":"2025.04.06 21:30:00","close":1.09046}, {"time":"2025.04.06 21:15:00","close":1.08910},{"time":"2025.04.06 21:00:00","close":1.08818}, {"time":"2025.04.04 20:45:00","close":1.09623},{"time":"2025.04.04 20:30:00","close":1.09435}, {"time":"2025.04.04 20:15:00","close":1.09339},{"time":"2025.04.04 20:00:00","close":1.09502}, {"time":"2025.04.04 19:45:00","close":1.09436},{"time":"2025.04.04 19:30:00","close":1.09631}, {"time":"2025.04.04 19:15:00","close":1.09425},{"time":"2025.04.04 19:00:00","close":1.09358}, {"time":"2025.04.04 18:45:00","close":1.09447},{"time":"2025.04.04 18:30:00","close":1.09611}, {"time":"2025.04.04 18:15:00","close":1.09604},{"time":"2025.04.04 18:00:00","close":1.09531}, {"time":"2025.04.04 17:45:00","close":1.09472},{"time":"2025.04.04 17:30:00","close":1.09408}, {"time":"2025.04.04 17:15:00","close":1.09311},{"time":"2025.04.04 17:00:00","close":1.09407}, {"time":"2025.04.04 16:45:00","close":1.09714},{"time":"2025.04.04 16:30:00","close":1.09690}, {"time":"2025.04.04 16:15:00","close":1.09845},{"time":"2025.04.04 16:00:00","close":1.09892}, {"time":"2025.04.04 15:45:00","close":1.10139},{"time":"2025.04.04 15:30:00","close":1.09998}, {"time":"2025.04.04 15:15:00","close":1.09837},{"time":"2025.04.04 15:00:00","close":1.09970}, {"time":"2025.04.04 14:45:00","close":1.09862},{"time":"2025.04.04 14:30:00","close":1.09706}, {"time":"2025.04.04 14:15:00","close":1.09991},{"time":"2025.04.04 14:00:00","close":1.10068}, {"time":"2025.04.04 13:45:00","close":1.10057},{"time":"2025.04.04 13:30:00","close":1.10252}, {"time":"2025.04.04 13:15:00","close":1.10288},{"time":"2025.04.04 13:00:00","close":1.10358}, {"time":"2025.04.04 12:45:00","close":1.10200},{"time":"2025.04.04 12:30:00","close":1.10289}, {"time":"2025.04.04 12:15:00","close":1.10794},{"time":"2025.04.04 12:00:00","close":1.10443}, {"time":"2025.04.04 11:45:00","close":1.10601},{"time":"2025.04.04 11:30:00","close":1.10697}, {"time":"2025.04.04 11:15:00","close":1.10502},{"time":"2025.04.04 11:00:00","close":1.10517}, {"time":"2025.04.04 10:45:00","close":1.10305},{"time":"2025.04.04 10:30:00","close":1.10340}, {"time":"2025.04.04 10:15:00","close":1.10447},{"time":"2025.04.04 10:00:00","close":1.09869}, {"time":"2025.04.04 09:45:00","close":1.09844},{"time":"2025.04.04 09:30:00","close":1.09757}, {"time":"2025.04.04 09:15:00","close":1.09820},{"time":"2025.04.04 09:00:00","close":1.09786}, {"time":"2025.04.04 08:45:00","close":1.09962},{"time":"2025.04.04 08:30:00","close":1.10002}, {"time":"2025.04.04 08:15:00","close":1.10062},{"time":"2025.04.04 08:00:00","close":1.10034}, {"time":"2025.04.04 07:45:00","close":1.10042},{"time":"2025.04.04 07:30:00","close":1.10223}, {"time":"2025.04.04 07:15:00","close":1.10490},{"time":"2025.04.04 07:00:00","close":1.10641}, {"time":"2025.04.04 06:45:00","close":1.10506},{"time":"2025.04.04 06:30:00","close":1.10638}, {"time":"2025.04.04 06:15:00","close":1.10649},{"time":"2025.04.04 06:00:00","close":1.10747}, {"time":"2025.04.04 05:45:00","close":1.10843},{"time":"2025.04.04 05:30:00","close":1.10809}, {"time":"2025.04.04 05:15:00","close":1.11057},{"time":"2025.04.04 05:00:00","close":1.10984}, {"time":"2025.04.04 04:45:00","close":1.10874},{"time":"2025.04.04 04:30:00","close":1.10896}, {"time":"2025.04.04 04:15:00","close":1.10906},{"time":"2025.04.04 04:00:00","close":1.10876}, {"time":"2025.04.04 03:45:00","close":1.10937},{"time":"2025.04.04 03:30:00","close":1.10918}, {"time":"2025.04.04 03:15:00","close":1.10766},{"time":"2025.04.04 03:00:00","close":1.10695}, {"time":"2025.04.04 02:45:00","close":1.10632},{"time":"2025.04.04 02:30:00","close":1.10668}, {"time":"2025.04.04 02:15:00","close":1.10625},{"time":"2025.04.04 02:00:00","close":1.10773}, {"time":"2025.04.04 01:45:00","close":1.10677},{"time":"2025.04.04 01:30:00","close":1.10625}, {"time":"2025.04.04 01:15:00","close":1.10610},{"time":"2025.04.04 01:00:00","close":1.10589}, {"time":"2025.04.04 00:45:00","close":1.10606},{"time":"2025.04.04 00:30:00","close":1.10603}, {"time":"2025.04.04 00:15:00","close":1.10403},{"time":"2025.04.04 00:00:00","close":1.10432}, {"time":"2025.04.03 23:45:00","close":1.10452},{"time":"2025.04.03 23:30:00","close":1.10467}, {"time":"2025.04.03 23:15:00","close":1.10446},{"time":"2025.04.03 23:00:00","close":1.10524}, {"time":"2025.04.03 22:45:00","close":1.10642},{"time":"2025.04.03 22:30:00","close":1.10631}, {"time":"2025.04.03 22:15:00","close":1.10582},{"time":"2025.04.03 22:00:00","close":1.10577}, {"time":"2025.04.03 21:45:00","close":1.10515},{"time":"2025.04.03 21:30:00","close":1.10497}, {"time":"2025.04.03 21:15:00","close":1.10505},{"time":"2025.04.03 21:00:00","close":1.10488}, {"time":"2025.04.03 20:45:00","close":1.10514},{"time":"2025.04.03 20:30:00","close":1.10448}, {"time":"2025.04.03 20:15:00","close":1.10312},{"time":"2025.04.03 20:00:00","close":1.10253}, {"time":"2025.04.03 19:45:00","close":1.10275},{"time":"2025.04.03 19:30:00","close":1.10164}, {"time":"2025.04.03 19:15:00","close":1.10192},{"time":"2025.04.03 19:00:00","close":1.10320}, {"time":"2025.04.03 18:45:00","close":1.10373},{"time":"2025.04.03 18:30:00","close":1.10362}, {"time":"2025.04.03 18:15:00","close":1.10322},{"time":"2025.04.03 18:00:00","close":1.10236}, {"time":"2025.04.03 17:45:00","close":1.10245},{"time":"2025.04.03 17:30:00","close":1.10222}, {"time":"2025.04.03 17:15:00","close":1.10273},{"time":"2025.04.03 17:00:00","close":1.10267}, {"time":"2025.04.03 16:45:00","close":1.10386},{"time":"2025.04.03 16:30:00","close":1.10404}, {"time":"2025.04.03 16:15:00","close":1.10367},{"time":"2025.04.03 16:00:00","close":1.10491}, {"time":"2025.04.03 15:45:00","close":1.10506},{"time":"2025.04.03 15:30:00","close":1.10452}, {"time":"2025.04.03 15:15:00","close":1.10613},{"time":"2025.04.03 15:00:00","close":1.10922}, {"time":"2025.04.03 14:45:00","close":1.11182},{"time":"2025.04.03 14:30:00","close":1.11197}, {"time":"2025.04.03 14:15:00","close":1.10950},{"time":"2025.04.03 14:00:00","close":1.10981}, {"time":"2025.04.03 13:45:00","close":1.10784},{"time":"2025.04.03 13:30:00","close":1.10911}, {"time":"2025.04.03 13:15:00","close":1.10943},{"time":"2025.04.03 13:00:00","close":1.11064}, {"time":"2025.04.03 12:45:00","close":1.10816},{"time":"2025.04.03 12:30:00","close":1.10910}, {"time":"2025.04.03 12:15:00","close":1.10858},{"time":"2025.04.03 12:00:00","close":1.10867}, {"time":"2025.04.03 11:45:00","close":1.10876},{"time":"2025.04.03 11:30:00","close":1.10839}, {"time":"2025.04.03 11:15:00","close":1.10570},{"time":"2025.04.03 11:00:00","close":1.10596}, {"time":"2025.04.03 10:45:00","close":1.10521},{"time":"2025.04.03 10:30:00","close":1.10696}, {"time":"2025.04.03 10:15:00","close":1.10859},{"time":"2025.04.03 10:00:00","close":1.11052}, {"time":"2025.04.03 09:45:00","close":1.10305},{"time":"2025.04.03 09:30:00","close":1.10280}, {"time":"2025.04.03 09:15:00","close":1.10336},{"time":"2025.04.03 09:00:00","close":1.10304}, {"time":"2025.04.03 08:45:00","close":1.10093},{"time":"2025.04.03 08:30:00","close":1.10092}, {"time":"2025.04.03 08:15:00","close":1.09885},{"time":"2025.04.03 08:00:00","close":1.09803}, {"time":"2025.04.03 07:45:00","close":1.09707},{"time":"2025.04.03 07:30:00","close":1.09658}, {"time":"2025.04.03 07:15:00","close":1.09497},{"time":"2025.04.03 07:00:00","close":1.09733}, {"time":"2025.04.03 06:45:00","close":1.09896},{"time":"2025.04.03 06:30:00","close":1.09775}, {"time":"2025.04.03 06:15:00","close":1.09488},{"time":"2025.04.03 06:00:00","close":1.09457}, {"time":"2025.04.03 05:45:00","close":1.09444},{"time":"2025.04.03 05:30:00","close":1.09515}, {"time":"2025.04.03 05:15:00","close":1.09431},{"time":"2025.04.03 05:00:00","close":1.09171}, {"time":"2025.04.03 04:45:00","close":1.09069},{"time":"2025.04.03 04:30:00","close":1.09104}, {"time":"2025.04.03 04:15:00","close":1.09109},{"time":"2025.04.03 04:00:00","close":1.09110}, {"time":"2025.04.03 03:45:00","close":1.09148},{"time":"2025.04.03 03:30:00","close":1.09118}, {"time":"2025.04.03 03:15:00","close":1.09196},{"time":"2025.04.03 03:00:00","close":1.09115}, {"time":"2025.04.03 02:45:00","close":1.09122},{"time":"2025.04.03 02:30:00","close":1.09207}, {"time":"2025.04.03 02:15:00","close":1.09220},{"time":"2025.04.03 02:00:00","close":1.09134}, {"time":"2025.04.03 01:45:00","close":1.09132},{"time":"2025.04.03 01:30:00","close":1.09137}, {"time":"2025.04.03 01:15:00","close":1.09078},{"time":"2025.04.03 01:00:00","close":1.08970}, {"time":"2025.04.03 00:45:00","close":1.08906},{"time":"2025.04.03 00:30:00","close":1.08995}, {"time":"2025.04.03 00:15:00","close":1.08831},{"time":"2025.04.03 00:00:00","close":1.08905}, {"time":"2025.04.02 23:45:00","close":1.09044},{"time":"2025.04.02 23:30:00","close":1.09068}, {"time":"2025.04.02 23:15:00","close":1.08874},{"time":"2025.04.02 23:00:00","close":1.08552}, {"time":"2025.04.02 22:45:00","close":1.08389},{"time":"2025.04.02 22:30:00","close":1.08277}, {"time":"2025.04.02 22:15:00","close":1.08221},{"time":"2025.04.02 22:00:00","close":1.08161}, {"time":"2025.04.02 21:45:00","close":1.08274},{"time":"2025.04.02 21:30:00","close":1.08286}, {"time":"2025.04.02 21:15:00","close":1.08156},{"time":"2025.04.02 21:00:00","close":1.08350}, {"time":"2025.04.02 20:45:00","close":1.08507},{"time":"2025.04.02 20:30:00","close":1.08184}, INFO:werkzeug:127.0.0.1 - - [09/Apr/2025 09:04:18] "POST /analyze HTTP/1.1" 200 -
Nachfolgend finden Sie die Protokolle der Registerkarte „MetaTrader 5 Experts“, die den Kommentar des Python-Servers zur Korrelationsanalyse enthalten. Die Protokolle enthalten die Daten der vergangenen Tage bis zum aktuellen Tag und zeigen, wie sich die beiden Währungspaare EUR/USD und GBP/USD im Verhältnis zueinander entwickelt haben. Der Kommentar interpretiert das Korrelationsdiagramm und erklärt, dass die Paare über den aufgezeichneten Zeitraum im Allgemeinen eine starke positive Korrelation aufweisen.
2025.04.09 00:57:33.296 Correlation Pathfinder (GBPUSD,M15) Server response: {"commentary":"The overall correlation is weakly positive, suggesting occasional movement together but limited consistency, which may offer diversification opportunities.\nRecently, the rolling correlation is at 0.82. This high correlation suggests near mirror-like movement. Relative strength approaches may need reconsideration for diversification.","correlation":0.3697032305325312,"message":"Plot saved as rolling_ correlation.png"}Dies deutet darauf hin, dass sie sich tendenziell im Gleichschritt bewegen, auch wenn es gelegentlich zu leichten Abweichungen kommt. Diese Abweichungen können auf eine vorübergehende Marktdivergenz hindeuten, die potenzielle Möglichkeiten zur Portfoliodiversifizierung oder -absicherung aufzeigt. Insgesamt bestätigen die Protokolle eine erfolgreiche Datenübertragung und genaue Verarbeitung und bieten Einblicke, die helfen können, Handelsstrategien auf der Grundlage der sich entwickelnden Beziehung zwischen den Währungspaaren zu verfeinern.
2025.04.09 00: 57 :33.296 Correlation Pathfinder (EURUSD,M15) Server response: {"commentary":"The overall correlation is weakly positive, suggesting occasional movement together but limited consistency, which may offer diversification opportunities.\nRecently, the rolling correlation is at 0.83. This high correlation suggests near mirror-like movement. Relative strength approaches may need reconsideration for diversification.","correlation":0.33874205977082567,"message":"Plot saved as rolling_correlation.png"}
Nachstehend finden Sie unsere Korrelationsanalyse. Vom 2. bis zum 9. April blieb die rollierende Korrelation zwischen EUR/USD und GBP/USD hoch und lag zwischen 0,8 und 1,0, was zeigt, dass sich die beiden Paare im Allgemeinen gemeinsam bewegten. Es gab Momente, in denen die Korrelation stark auf etwa 0,3 abfiel, was auf eine kurze Divergenz hindeutet, die wahrscheinlich auf kurzzeitige Marktereignisse oder währungsspezifische Nachrichten zurückzuführen ist. Die Korrelation erholte sich schnell wieder in Richtung 1,0, was bestätigt, dass die zugrunde liegenden Marktkräfte diese Paare neu ausrichten. Händler können diese gelegentlichen Einbrüche als Signale für Divergenzgelegenheiten nutzen und dann beobachten, bis das normale Korrelationsniveau zurückkehrt.
Abb. 4. Rollierende Korrelation
Schlussfolgerung
Dieses Diagramm bietet einen klaren, visuellen Überblick über den Arbeitsablauf des Systems, indem es den Prozess vom Abrufen der Daten im MetaTrader 5 bis zur Erstellung von Analysen und Kommentaren auf dem Python-Server nachzeichnet. Die mit A bis H gekennzeichneten Knoten stellen die einzelnen Schritte des Prozesses dar und veranschaulichen, wie die Daten gesammelt, in JSON verpackt, an den Server übertragen, mit Pandas geparst und analysiert, mit Matplotlib visualisiert und schließlich mit einem interpretierenden Kommentar versehen werden, bevor die Analyseergebnisse zurückgegeben werden.
Datum | Name des Werkzeugs | Beschreibung | Version | Aktualisierungen | Hinweis |
---|---|---|---|---|---|
01/10/24 | Chart Projector | Skript zur Überlagerung der Kursentwicklung des Vortages mit einem Ghost-Effekt. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 1 |
18/11/24 | Analytical Comment | Er liefert Informationen zum Vortag in Tabellenform und nimmt die zukünftige Marktentwicklung vorweg. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 2 |
27/11/24 | Analytics Master | Reguläre Aktualisierung der Marktmetriken alle zwei Stunden. | 1.01 | Zweite Veröffentlichung | Toolkit Nummer 3 |
02/12/24 | Analytics Forecaster | Reguläre Aktualisierung der Marktmetriken alle zwei Stunden mit Telegram-Integration. | 1.1 | Dritte Ausgabe | Toolkit Nummer 4 |
09/12/24 | Volatility Navigator | Der EA analysiert die Marktbedingungen anhand der Indikatoren Bollinger Bands, RSI und ATR. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 5 |
19/12/24 | Mean Reversion Signal Reaper | Analysiert den Markt anhand der Strategie „Umkehr zur Mitte“ und liefert Signale. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 6 |
9/01/25 | Signal Pulse | Analysator für mehrere Zeitrahmen. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 7 |
17/01/25 | Metrics Board | Bedienfeld mit Taste für die Analyse. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 8 |
21/01/25 | External Flow | Analytik durch externe Bibliotheken. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 9 |
27/01/25 | VWAP | Volumengewichteter Durchschnittspreis | 1.3 | Erste Veröffentlichung | Toolkit Nummer 10 |
02/02/25 | Heikin Ashi | Trendglättung und Identifizierung von Umkehrsignalen | 1.0 | Erste Veröffentlichung | Toolkit Nummer 11 |
04/02/25 | FibVWAP | Signalerzeugung durch Python-Analyse | 1.0 | Erste Veröffentlichung | Toolkit Nummer 12 |
14/02/25 | RSI DIVERGENCE | Kursentwicklung versus RSI-Divergenzen | 1.0 | Erste Veröffentlichung | Toolkit Nummer 13 |
17/02/25 | Parabolic Stop and Reverse (PSAR) | Automatisierung der PSAR-Strategie | 1.0 | Erste Veröffentlichung | Toolkit Nummer 14 |
20/02/25 | Quarters Drawer Script | Einzeichnen der Ebenen der Viertel auf dem Chart | 1.0 | Erste Veröffentlichung | Toolkit Nummer 15 |
27/02/25 | Intrusion Detector | Erkennen und warnen, wenn der Preis ein Viertel-Niveau erreicht | 1.0 | Erste Veröffentlichung | Toolkit Nummer 16 |
27/02/25 | TrendLoom Tool | Analysepanel für mehrere Zeitrahmen | 1.0 | Erste Veröffentlichung | Toolkit Nummer 17 |
11/03/25 | Quarters Board | Bedienfeld mit Tasten zum Aktivieren oder Deaktivieren der Viertel-Ebenen | 1.0 | Erste Veröffentlichung | Toolkit Nummer 18 |
26/03/25 | ZigZag Analyzer | Zeichnen von Trendlinien mit dem ZigZag-Indikator | 1.0 | Erste Veröffentlichung | Toolkit Nummer 19 |
10/04/25 | Correlation Pathfinder | Plotten von Währungskorrelationen mit Python-Bibliotheken. | 1.0 | Erste Veröffentlichung | Toolkit Nummer 20 |
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/17742
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.





- 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.