
Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 10): External Flow (II) VWAP
Einführung
In unserem vorangegangenen Artikel haben wir die Integration von Marktdaten mit externen Bibliotheken vorgestellt und die Möglichkeit aufgezeigt, Märkte durch verschiedene automatisierte Systeme zu analysieren. Das robuste Python-Framework bietet leistungsstarke Instrument für fortschrittliche Datenanalyse, prädiktive Modellierung und Visualisierung, während sich MQL5 auf nahtlose Handelsausführung und chartbasierte Operationen konzentriert. Durch die Kombination dieser Stärken erreichen wir ein flexibles, effizientes und hochentwickeltes System für Marktanalyse und Handel.
In diesem Artikel wird ein leistungsstarkes Instrument vorgestellt, das auf dem Konzept des volumengewichteten Durchschnittspreises (VWAP) basiert und präzise Handelssignale liefert. Durch die Nutzung der fortschrittlichen Python-Bibliotheken für Berechnungen wird die Genauigkeit der Analyse verbessert, was zu sehr gut umsetzbaren VWAP-Signalen führt. Wir beginnen mit der Erkundung der Strategie, gehen dann auf die Kernlogik des MQL5-Codes ein und diskutieren die Ergebnisse. Abschließend ziehen wir ein Fazit. Werfen wir einen Blick auf das nachstehende Inhaltsverzeichnis:
Verstehen der Strategie
Der VWAP (volumengewichteter Durchschnittspreis) ist ein Instrument der technischen Analyse, das das Verhältnis zwischen dem Preis eines Vermögenswerts und seinem gesamten Handelsvolumen widerspiegelt. Er vermittelt Händlern und Anlegern ein Gefühl für den Durchschnittspreis, zu dem eine Aktie in einem bestimmten Zeitraum gehandelt wurde. Der VWAP wird häufig von eher passiven Anlegern wie Pensionsfonds und Investmentfonds als Benchmark verwendet, um die Qualität ihrer Geschäfte zu bewerten. Er ist auch für Händler wertvoll, die feststellen wollen, ob ein Vermögenswert zu einem optimalen Preis gekauft oder verkauft wurde.Die Formel zur Berechnung des VWAP lautet:
VWAP = ∑(Menge des gehandelten Vermögenswerts × Preis des Vermögenswerts) / Gesamtvolumen, das an diesem Tag gehandelt wurde
Der VWAP wird in der Regel anhand von Aufträgen berechnet, die während eines einzigen Handelstages erteilt werden. Sie kann jedoch auch über mehrere Zeiträume hinweg für eine umfassendere Marktanalyse angewendet werden. In einem Diagramm erscheint der VWAP als Linie und dient als dynamischer Referenzpunkt. Wenn der Kurs über dem VWAP liegt, befindet sich der Markt im Allgemeinen in einem Aufwärtstrend. Liegt der Kurs hingegen unter dem VWAP, wird der Markt in der Regel als Abwärtstrend betrachtet. In der nachstehenden Abbildung habe ich die VWAP-Strategie visualisiert, indem ich die Schlüsselniveaus hervorgehoben habe, bei denen der Preis dazu neigt, um den VWAP herum zu reagieren. Diese markierten Niveaus zeigen, wie der Markt häufig mit der VWAP-Linie interagiert.
Abb. 1. VWAP-Strategie
Lassen Sie uns die Logik hinter diesem System untersuchen. Zunächst werden die in der nachstehenden Abbildung dargestellten Erkenntnisse untersucht und anschließend ausführlich erläutert.
Abb. 2. Systemlogik
Der VWAP Expert Advisor (EA) wurde entwickelt, um Charts zu überwachen und reibungslos mit Python für fortgeschrittene Marktanalysen zu interagieren. Er sendet Marktdaten an Python und protokolliert die empfangenen Handelssignale in der Registerkarte MetaTrader 5 Experts. Die Strategie nutzt den volumengewichteten Durchschnittspreis (VWAP) als Hauptindikator, um präzise und umsetzbare Erkenntnisse zu liefern. Nachstehend finden Sie eine detaillierte Aufschlüsselung der Strategie:
1. Datenerhebung
Der EA sammelt historische Marktdaten (Preis und Volumen) der letzten 150 Kerzen. Er stellt sicher, dass die Daten gültig sind (z. B. keine fehlenden oder Nullwerte). Die Daten werden zur Rückverfolgbarkeit als CSV-Datei gespeichert und zur Analyse an einen Python-Server gesendet.
2. Python-Analyse
Das Python-Skript berechnet den VWAP anhand der empfangenen Daten und nutzt fortschrittliche Bibliotheken für eine präzise Berechnung. Zwei Bibliotheken übernehmen die wichtigsten Berechnungen und Analysen:
Pandas und NumPy. Pandas erleichtert die Datenmanipulation, gleitende Durchschnitte und kumulative Berechnungen, während NumPy numerische Operationen, einschließlich bedingter Logik und vektorisierter Berechnungen, verwaltet. Gemeinsam bieten sie eine effiziente und genaue Verarbeitung für die Analyse von Zeitreihendaten.
Die Analyse umfasst:
- VWAP-Berechnung: Ermittelt den nach Volumen gewichteten Durchschnittspreis für den ausgewählten Zeitraum.
- Signalerzeugung: Liefert Handelssignale (z. B. Kauf/Verkauf) auf der Grundlage des Verhältnisses zwischen aktuellem Preis und VWAP-Niveau.
- Erklärungen: Jedes Signal enthält eine textliche Erklärung, um zu verdeutlichen, warum es erzeugt wurde.
3. Signal-Bestätigung
Der EA führt einen Bestätigungsmechanismus ein:
Signale werden nur dann aktualisiert, wenn sie über mehrere Intervalle hinweg (z. B. 2 Bestätigungszeiträume) konsistent erscheinen.
Dies reduziert Fehlalarme und erhöht die Zuverlässigkeit der Signale.
4. Ausgabe und Warnungen
Die Signale werden angezeigt als:
- Warnungen: Echtzeit-Benachrichtigungen für sofortiges Handeln des Händlers.
- Log-Meldungen: Sie werden im Terminal des EA zur Überprüfung ausgedruckt.
Zukünftige Versionen werden möglicherweise grafische Anmerkungen auf dem Diagramm zur besseren Visualisierung enthalten.
Python MQL5 Verarbeitet große Datenmengen effizient. Überwacht den Markt und integriert sich mit dem Chart in Echtzeit Nutzung robuster Bibliotheken für erweiterte Berechnungen und Modellierung Bietet sofortige Warnungen und Benachrichtigungen Sorgt für bessere Genauigkeit und Flexibilität bei VWAP-basierten Strategien Die Verwendung von VWAP auf MQL5 hilft, wichtige Unterstützungs- und Widerstandsniveaus des Marktes hervorzuheben. Dies ermöglicht es Händlern, Entscheidungen auf der Grundlage der Marktreaktion auf den VWAP zu treffen, der oft als starker Drehpunkt für Kursbewegungen dient.
Zentrale Logik
1. MQL5 EA
Initialisierung: Einrichten des EA
Wenn Sie den Expert Advisor (EA) zum ersten Mal auf einen Chart anwenden, wird die Funktion OnInit() ausgeführt. Diese Funktion ist verantwortlich für die Initialisierung des EA, die Einrichtung der erforderlichen Ressourcen und die Sicherstellung, dass alles betriebsbereit ist. Hier werden in der Regel Einrichtungsaufgaben wie das Drucken von Meldungen, das Initialisieren von Variablen oder das Setzen von Parametern durchgeführt. In unserem Fall drucken wir einfach eine Meldung, die bestätigt, dass der EA initialisiert wurde. Dieser Schritt gibt auch INIT_SUCCEEDED zurück, um anzuzeigen, dass die Initialisierung erfolgreich war, was für das ordnungsgemäße Funktionieren des EA entscheidend ist.
int OnInit() { Print("VWAP Expert initialized."); return(INIT_SUCCEEDED); }
Die Initialisierung ist die erste Phase, in der der EA seine Grundlagen schafft. Es ist wichtig, dass alle Parameter und Ressourcen richtig eingestellt sind. Eine einfache Bestätigungsmeldung teilt Ihnen mit, dass der EA einsatzbereit ist.
Deinitialisierung: Aufräumen, wenn EA aufhört
Die Deinitialisierung erfolgt, wenn der EA aus dem Chart entfernt wird oder wenn MetaTrader geschlossen wird. Die Funktion OnDeinit() wird aufgerufen, um alle Ressourcen zu bereiningen, die während OnInit() zugewiesen oder initialisiert wurden. Hier wird lediglich eine Meldung ausgegeben, dass der EA deinitialisiert wird. Dies ist eine gute Praxis, um sicherzustellen, dass alle Ressourcen oder Prozesse, die der EA möglicherweise verwendet hat, ordnungsgemäß geschlossen werden, um Speicherlecks oder die Ausführung unnötiger Hintergrundprozesse zu verhindern.
void OnDeinit(const int reason) { Print("VWAP Expert deinitialized."); }
Eine ordnungsgemäße Deinitialisierung ist entscheidend für die Aufrechterhaltung der Systemleistung. Bereinigen Sie immer die Ressourcen, wenn ein EA entfernt wird, damit keine hängenden Prozesse zurückbleiben. Zu den Deinitialisierungsfunktionen gehören beispielsweise das Speichern von Daten, das Schließen von Verbindungen oder das Anhalten von Zeitgebern.
Sammeln von Marktdaten (Kerzen)
Das Kernstück dieses EA ist die Sammlung von Marktdaten (Kerzen) für die Analyse. Dieser Prozess beginnt mit der Funktion OnTick(), die jedes Mal ausgeführt wird, wenn der Marktpreis aktualisiert wird. Der EA ist so konfiguriert, dass er in bestimmten Intervallen Daten erfasst, wobei jedes Intervall durch signalIntervalMinutes definiert ist. Sobald seit dem letzten Signal genügend Zeit verstrichen ist, beginnt der EA mit dem Sammeln der Marktdaten (Open, High, Low, Close, Volume) für die letzte numCandles Anzahl von Balken.
Die Daten werden dann als CSV-String formatiert, was wichtig ist, da sie zur weiteren Verarbeitung an den Python-Server gesendet werden. Die Schleife iteriert rückwärts von der letzten Kerze, um sicherzustellen, dass die neuesten Marktdaten erfasst werden, und die Daten werden mit StringFormat() standardisiert formatiert.
int totalBars = iBars(Symbol(), Period()); if (totalBars < numCandles) { Print("Error: Not enough candles on the chart to collect ", numCandles, " candles."); return; } for (int i = numCandles - 1; i >= 0; i--) { datetime currentTime = iTime(Symbol(), Period(), i); if (currentTime == 0) continue; double high = iHigh(Symbol(), Period(), i); double low = iLow(Symbol(), Period(), i); double close = iClose(Symbol(), Period(), i); double open = iOpen(Symbol(), Period(), i); long volume = iVolume(Symbol(), Period(), i); if (high == 0 || low == 0 || close == 0 || volume == 0) { Print("Skipping invalid data at ", TimeToString(currentTime, TIME_DATE | TIME_MINUTES)); continue; } csvData += StringFormat("%s,%.5f,%.5f,%.5f,%.5f,%ld\n", TimeToString(currentTime, TIME_DATE | TIME_MINUTES), high, low, open, close, volume); }
iBars():
iBars() ermittelt die Gesamtzahl der Balken (Kerzen), die auf dem Chart für das aktuelle Symbol und den aktuellen Zeitrahmen verfügbar sind. Der EA prüft, ob mindestens numCandles Balken vorhanden sind. Ist dies nicht der Fall, wird eine Fehlermeldung ausgegeben und die Funktion verlassen, wodurch eine weitere Datenerfassung verhindert wird.
Die for-Schleife:
Die for-Schleife iteriert rückwärts vom jüngsten Balken (numCandles - 1) zum ältesten Balken (0) und sammelt dabei die erforderliche Anzahl von Balken.
iTime(), iHigh(), iLow(), iOpen(), iClose(), iVolume():
Diese Funktionen holen die relevanten Kursdaten für jede Kerze. iTime() holt den Zeitstempel, iHigh() den Höchstkurs, iLow() den Tiefstkurs und so weiter.
Validierung der Daten:
Bevor die Daten an die CSV-Zeichenfolge angehängt werden, prüft der EA auf fehlende oder ungültige Daten (Nullwerte). Wenn die Daten einer Kerze ungültig sind, wird die Iteration fortgesetzt und diese Kerze übersprungen.
Formatierung von Zeichenketten:
StringFormat() wird verwendet, um die Kerzendaten in eine CSV-Zeile zu formatieren. Jedes Feld wird durch ein Komma getrennt, und der Zeitstempel wird mit TimeToString() in eine lesbare Zeichenfolge formatiert.
Daten in eine CSV-Datei schreiben
Nachdem wir die Daten gesammelt haben, müssen wir sie in eine CSV-Datei schreiben. Dies ist wichtig, weil wir die gesammelten Daten lokal speichern wollen, bevor wir sie an den Python-Server senden. Die Funktion FileOpen() öffnet die Datei im Schreibmodus, und FileWriteString() schreibt die formatierten CSV-Daten in die Datei. Nach dem Schreiben der Daten wird die Datei geschlossen, um den Vorgang abzuschließen und sicherzustellen, dass keine Daten verloren gehen.
Die CSV-Datei wird im Verzeichnis MQL5\\Files gespeichert, einem speziellen Verzeichnis in MetaTrader, in dem Dateien gespeichert werden, auf die die Plattform zugreifen kann. Auf diese Weise ist sichergestellt, dass die Datei bei Bedarf leicht abrufbar ist.
string fileName = StringFormat("%s_vwap_data.csv", Symbol()); string filePath = "MQL5\\Files\\" + fileName; int fileHandle = FileOpen(filePath, FILE_WRITE | FILE_CSV | FILE_ANSI); if (fileHandle != INVALID_HANDLE) { FileWriteString(fileHandle, csvData); FileClose(fileHandle); } else { Print("Failed to open file for writing: ", filePath); }
Das Schreiben der Daten in eine CSV-Datei ist eine Möglichkeit, die Informationen für spätere Analysen lokal zu speichern. Die Verwendung von FILE_CSV stellt sicher, dass die Daten in einem standardisierten Format gespeichert werden, sodass sie mit anderen Systemen wie Python kompatibel sind. Durch die Fehlerbehandlung wird sichergestellt, dass der EA, wenn die Datei nicht geöffnet werden kann, das Problem anständig behandelt und eine Fehlermeldung ausgibt.
Senden von Daten an den Python-Server für die VWAP-Analyse
Die gesammelten Daten können nun zur Analyse an einen Python-Server gesendet werden. Dies geschieht mit der Funktion WebRequest(), die es dem EA ermöglicht, HTTP-Anfragen zu stellen. Die CSV-Daten werden in ein Zeichenarray umgewandelt (StringToCharArray()) und über eine POST-Anfrage an den Server gesendet. Die Kopfzeilen geben an, dass es sich bei dem gesendeten Inhalt um CSV handelt, und die Antwort des Servers wird in einem Ergebnis-Array erfasst.
Der Timeout-Parameter ist auf 5000 Millisekunden (5 Sekunden) eingestellt, damit die Anfrage nicht zu lange hängen bleibt, wenn der Server nicht antwortet.
char data[]; StringToCharArray(csvData, data); string headers = "Content-Type: text/csv\r\n"; char result[]; string resultHeaders; int timeout = 5000; int responseCode = WebRequest("POST", pythonUrl, headers, timeout, data, result, resultHeaders);
HTTP POST wird hier verwendet, weil es die beste Möglichkeit ist, Daten an einen Server zu senden, ohne die URL zu ändern. WebRequest() wickelt die Kommunikation mit dem Python-Server ab, auf dem alle wichtigen Aufgaben (z. B. die VWAP-Berechnungen) durchgeführt werden. Die Zeitüberschreitung stellt sicher, dass der EA nicht hängen bleibt, wenn der Server nicht reagiert, und sorgt für einen reibungslosen Betrieb.
Behandlung der Antwort vom Python-Server
Nach dem Senden der Daten müssen wir die Antwort des Python-Servers verarbeiten. Hier geschieht die eigentliche Magie, denn der Python-Server analysiert die Daten und liefert ein Handelssignal auf der Grundlage des VWAP (Volume Weighted Average Price). Die Antwort wird im JSON-Format zurückgegeben, und wir verwenden eine Hilfsfunktion, ExtractValueFromJSON(), um die relevanten Werte (VWAP und Erklärung) aus der Antwort zu extrahieren.
Wenn die Antwort erfolgreich ist (HTTP-Code 200), analysieren wir die erforderlichen Informationen und fahren mit der Handelslogik fort. Wenn die Antwort gültige Daten enthält, können wir mit der Erzeugung eines neuen Signals fortfahren.
// Check if the request was successful if (responseCode == 200) { string response = CharArrayToString(result); // Convert the result array to a string Print("Server response: ", response); // Print the server's response // Validate if the required data is present in the response if (StringFind(response, "\"vwap\":") == -1 || StringFind(response, "\"signal_explanation\":") == -1) { Print("Error: Invalid response from server. Response: ", response); return; } // Extract individual data points from the JSON response string vwap = ExtractValueFromJSON(response, "vwap"); string explanation = ExtractValueFromJSON(response, "signal_explanation"); string majorSupport = ExtractValueFromJSON(response, "major_support"); string majorResistance = ExtractValueFromJSON(response, "major_resistance"); string minorSupport = ExtractValueFromJSON(response, "minor_support"); string minorResistance = ExtractValueFromJSON(response, "minor_resistance"); // If valid data is received, update the signal if (vwap != "" && explanation != "") { string newSignal = "VWAP: " + vwap + "\nExplanation: " + explanation + "\nMajor Support: " + majorSupport + "\nMajor Resistance: " + majorResistance + "\nMinor Support: " + minorSupport + "\nMinor Resistance: " + minorResistance; // Confirm the signal and handle the response further if (newSignal != lastSignal) { signalConfirmationCount++; // Increment confirmation count } if (signalConfirmationCount >= confirmationInterval) { lastSignal = newSignal; // Set the new signal signalConfirmationCount = 0; // Reset the count Print("New VWAP signal: ", newSignal); Alert("New VWAP Signal Received:\n" + newSignal); // Alert user of the new signal } } } else { Print("Error: WebRequest failed with code ", responseCode, ". Response headers: ", resultHeaders); }
Die korrekte Bearbeitung der Antwort ist entscheidend für die Interpretation der Serveranalyse. Die Funktion ExtractValueFromJSON() stellt sicher, dass wir nur die benötigten Daten (VWAP und Signalerklärung) aus der potenziell umfangreichen JSON-Antwort abrufen. Wenn die Antwort ungültig ist oder die erwarteten Daten nicht gefunden werden, ist es wichtig, Fehler zu behandeln und zu vermeiden, dass auf falsche Signale reagiert wird.
Signalbestätigung und Anzeige des Handelssignals
Der letzte Schritt besteht darin, das Handelssignal zu bestätigen. Nachdem wir das Signal vom Python-Server erhalten haben, reagieren wir nicht sofort darauf. Stattdessen verlangen wir eine Bestätigung in mehreren Intervallen (konfiguriert durch confirmationInterval). Dadurch wird sichergestellt, dass das Signal über einen bestimmten Zeitraum hinweg konsistent ist, was dazu beiträgt, dass nicht auf kurzfristige Marktstörungen reagiert wird.
Sobald das Signal bestätigt wird, aktualisieren wir die Variable lastSignal und zeigen dem Nutzer das Signal über Alert() an. Der EA wartet dann auf das nächste gültige Signal, bevor er erneut auslöst.
// Confirm the signal multiple times before updating if (newSignal != lastSignal) { signalConfirmationCount++; // Increment the confirmation count } // Once the signal has been confirmed enough times if (signalConfirmationCount >= confirmationInterval) { // Update the last signal and reset confirmation count lastSignal = newSignal; signalConfirmationCount = 0; // Reset the count after confirmation // Display the new signal in the log and via an alert Print("New VWAP signal: ", newSignal); // Print to the log Alert("New VWAP Signal Received:\n" + newSignal); // Display alert to the user }
Die Signalbestätigung hilft dabei, nicht auf flüchtige oder unzuverlässige Signale zu reagieren. Indem wir das Signal mehrfach bestätigen, erhöhen wir die Genauigkeit und Zuverlässigkeit der Handelsentscheidungen. Warnmeldungen geben dem Händler sofortige Rückmeldung und stellen sicher, dass er über wichtige Änderungen informiert ist.
2. Python
Der Ablauf des Skripts ist darauf ausgelegt, Daten vorzuverarbeiten, VWAP und relevante Metriken zu berechnen, Signale zu generieren und aussagekräftige Informationen für die Entscheidungsfindung an den EA zurückzugeben. Dazu gehört die Bestimmung der großen und kleinen Unterstützungs-/Widerstandsniveaus sowie der VWAP und der Signalerklärungen. Folgen Sie den nachstehenden Schritten:
Datenaufbereitung & Vorverarbeitung
Der erste Teil des Skripts stellt sicher, dass die eingehenden Daten sauber und bereit für die Analyse sind, indem mehrere Vorverarbeitungsschritte durchgeführt werden. Mit diesen Schritten wird sichergestellt, dass alle erforderlichen Spalten gültige Daten enthalten, und Randfälle wie fehlende oder ungültige Werte werden behandelt.
# Ensure critical columns have no missing values df = df.dropna(subset=['volume', 'high', 'low', 'open', 'close']) # Convert 'date' column to datetime df.loc[:, 'date'] = pd.to_datetime(df['date']) # Handle zero volume by replacing with NaN and dropping invalid rows df.loc[:, 'volume'] = df['volume'].replace(0, np.nan) df = df.dropna(subset=['volume']) # Check if data exists after filtering if df.empty: print("No data to calculate VWAP.") return pd.DataFrame()
Das Skript stellt mit dropna() sicher, dass die wesentlichen Spalten (Volumen, Hoch, Tief, Eröffnen, Schließen) keine fehlenden Werte enthalten. Es behandelt auch Nullvolumina, indem es sie durch NaN ersetzt und alle Zeilen mit ungültigen Volumina löscht. Die Datumsspalte wird für die Zeitreihenanalyse in ein Datumsformat umgewandelt.
VWAP-Berechnung & zusätzliche Metriken
Das Skript berechnet den VWAP (Volume Weighted Average Price) und zusätzliche Kennzahlen wie typischer Preis, Durchschnittspreis, Durchschnittsvolumen und Unterstützungs-/Widerstandsniveaus.
# Calculate VWAP and additional metrics df.loc[:, 'typical_price'] = (df['high'] + df['low'] + df['close']) / 3 df.loc[:, 'vwap'] = (df['typical_price'] * df['volume']).cumsum() / df['volume'].cumsum() df.loc[:, 'avg_price'] = df[['high', 'low', 'open', 'close']].mean(axis=1) df.loc[:, 'avg_volume'] = df['volume'].rolling(window=2, min_periods=1).mean() df.loc[:, 'major_support'] = df['low'].min() df.loc[:, 'major_resistance'] = df['high'].max() df.loc[:, 'minor_support'] = df['low'].rolling(window=3, min_periods=1).mean() df.loc[:, 'minor_resistance'] = df['high'].rolling(window=3, min_periods=1).mean()
- VWAP-Berechnung: Der VWAP wird als kumulative Summe der typischen, mit dem Volumen gewichteten Preise, geteilt durch das kumulative Volumen, berechnet.
- Typischer Preis: Der typische Preis wird als Durchschnitt aus Höchst-, Tiefst- und Schlusskurs für jeden Zeitraum berechnet.
Unterstützung und Widerstand
- Wichtige Unterstützung: Der niedrigste Wert der Tiefs (über den gesamten Zeitraum).
- Großer Widerstand: Der höchste Wert der Hochs.
- Geringe Unterstützung/Widerstand: Rollierende Durchschnitte der Höchst- und Tiefstpreise über ein Zeitfenster von 3 Perioden.
Signalerzeugung und -analyse
Dieser Teil berechnet die Markttendenz und generiert Handelssignale auf der Grundlage der Position des VWAP im Verhältnis zum Schlusskurs. Sie enthält auch Erläuterungen zu diesen Signalen.
# Calculate strength and generate signals df.loc[:, 'strength'] = np.where( (df['high'] - df['low']) != 0, np.abs(df['close'] - df['open']) / (df['high'] - df['low']) * 100, 0 ) # Generate Buy/Sell signals based on VWAP df.loc[:, 'signal'] = np.where( df['close'] > df['vwap'], 'BUY', np.where(df['close'] < df['vwap'], 'SELL', 'NEUTRAL') ) # Signal explanation df.loc[:, 'signal_explanation'] = np.where( df['signal'] == 'BUY', 'The price is trading above the VWAP, indicating bullish market tendencies.', np.where( df['signal'] == 'SELL', 'The price is trading below the VWAP, indicating bearish market tendencies.', 'The price is trading at the VWAP, indicating equilibrium in the market.' ) )
Berechnung der Stärke: Dabei wird die Marktstärke anhand der Differenz zwischen dem Schluss- und dem Eröffnungskurs im Verhältnis zum Höchst- und Tiefstkurs berechnet. Ein höherer Wert bedeutet eine stärkere Bewegung.
Signalerzeugung
- KAUFEN: Wenn der Schlusskurs größer ist als der VWAP.
- VERKAUEN: Wenn der Schlusskurs niedriger ist als der VWAP.
- NEUTRAL: Wenn der Schlusskurs gleich dem VWAP ist.
- Signal Erläuterung: Auf der Grundlage des Signals wird ein Erläuterungstext erstellt, der die Tendenzen des Marktes (aufwärts, abwärts oder neutral) angibt.
Endgültige Antwort und Ausgabe
Nachdem alle Berechnungen durchgeführt wurden, bereitet das Skript die endgültige Ausgabe vor, die den VWAP, das Handelssignal, die Erklärung und die wichtigsten Unterstützungs-/Widerstandsniveaus enthält.
# Return data with major and minor support/resistance levels included return df[['date', 'vwap', 'signal', 'signal_explanation', 'entry_point', 'major_support', 'major_resistance', 'minor_support', 'minor_resistance']].iloc[-1]
- Endgültiges Ergebnis: Das Skript gibt die neuesten Daten (letzte Zeile) zurück, einschließlich des VWAP, des Handelssignals, seiner Erklärung, des Einstiegspunkts (der auf VWAP gesetzt ist) und der Haupt- und Nebenunterstützungs-/Widerstandsniveaus. Unterstützungs-/Widerstandsniveaus werden berechnet, um weitere Markttendenzen zu erkennen. Die an den EA zurückgesendete Antwort enthält diese Werte und ermöglicht es ihm, sie zu visualisieren oder darauf basierende Maßnahmen zu ergreifen.
Ergebnisse
Ich werde Antworten von beiden Seiten geben: von der MQL5-Seite und der Python-Seite. Bevor ich das tue, möchte ich betonen, wie wichtig es ist, dass das Python-Skript zuerst läuft. Wenn Sie mehr über die Erstellung und Ausführung des Python-Skripts erfahren möchten, lesen Sie bitte meinen vorherigen Artikel. Um eine reibungslose Kommunikation zwischen MetaTrader 5 und dem Server zu gewährleisten, fügen Sie die HTTP-Adresse zu Ihren MetaTrader 5-Einstellungen hinzu. Navigieren Sie zu Extras > Optionen, aktivieren Sie WebRequest zulassen, und geben Sie die Serveradresse in das vorgesehene Feld ein. Die nachstehende GIF ist eine Orientierungshilfe.
Abb. 3. Webrequest-Einstellung
Werfen wir einen Blick auf die Antworten von Python und MQL5.
- Python-Protokoll in der Eingabeaufforderung
Received data: date,high,low,open,close,volume 2025.01.22 15:00,8372.10000,8365.60000,8368.90000,8367.80000,3600 2025.01.22 16:00,8369.00000,8356.60000,8367.90000,8356.80000,3600 2025.01.22 17:00,8359.00000,8347.800... Calculating VWAP... 127.0.0.1 - - [28/Jan/2025 22:07:59] "POST /vwap HTTP/1.1" 200 -
Der MQL5 EA hat erfolgreich Daten für die letzten 150 Kerzen gesendet, einschließlich des Datums, des Hochs, des Tiefs, der Eröffnung, des Abschlusses und des Volumens. Python hat die Daten erfolgreich empfangen, wie aus dem obigen Protokoll der Eingabeaufforderung hervorgeht. Obwohl aufgrund der Datenmenge nicht alle Informationen angezeigt werden, können wir dennoch Werte für mehrere Kerzen beobachten.
- MetaTrader 5 Expert Advisor Protokoll
2025.01.28 22:07:59.452 VWAP (Step Index,H1) VWAP Expert initialized. 2025.01.28 22:07:59.513 VWAP (Step Index,H1) CSV file created: MQL5\Files\Step Index_vwap_data.csv 2025.01.28 22:07:59.777 VWAP (Step Index,H1) Server response: { 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "entry_point": 8356.202504986322, 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "major_resistance": 8404.5, 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "major_support": 8305.0, 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "minor_resistance": 8348.0, 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "minor_support": 8341.699999999999, 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "signal": "SELL", 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "signal_explanation": "The price is trading below the VWAP, indicating bearish market tendencies.", 2025.01.28 22:07:59.777 VWAP (Step Index,H1) "vwap": 8356.202504986322 2025.01.28 22:07:59.777 VWAP (Step Index,H1) }
Der MQL5 EA hat die Antwort von Python erfolgreich erhalten und sie im MetaTrader 5 Experts Log protokolliert. Schauen wir uns die Antwort der Analyse an und sehen wir, wie sie mit dem MetaTrader 5-Chart übereinstimmt.
Abb. 4. Signalanzeige
Schauen wir uns an, wie der Markt nach dem Auslösen des Signals reagierte, wie im folgenden Chart dargestellt.
Abb. 5. Reaktion des Marktes
Schlussfolgerung
Nach erfolgreicher Konfiguration des VWAP-Systems ist es von entscheidender Bedeutung, die Marktrichtung zu überwachen und die VWAP-Levels zur Bestätigung zu verwenden. Das VWAP-Niveau wird vom Markt sehr respektiert und dient oft als wichtige Unterstützungs- oder Widerstandszone. Darüber hinaus ist es wichtig, den richtigen Zeitrahmen für Ihre Handelsstrategie zu wählen. Kürzere Zeitrahmen wie M1-M15 erfassen Intraday-Bewegungen, M30 bietet ein ausgewogenes Verhältnis zwischen Präzision und breiterer Perspektive, H1-H4 zeigen mehrtägige Trends auf, und Tages-/Wochen-Charts bieten Einblicke in die langfristige Marktdynamik. Die Anpassung Ihres Ansatzes an den entsprechenden Zeitrahmen gewährleistet eine bessere Ausrichtung auf Ihre Handelsziele.
Datum | Name des Instruments | Beschreibung | Version | Aktualisierungen | Hinweis |
---|---|---|---|---|---|
01/10/24 | Chart Projector | Skript zur Überlagerung der Kursentwicklung des Vortages mit Geistereffekt. | 1.0 | Erste Veröffentlichung | Erstes Werkzeug in Lynnchris Tool Chest |
18/11/24 | Analytical Comment | Er liefert Informationen zum Vortag in Tabellenform und nimmt die zukünftige Marktentwicklung vorweg. | 1.0 | Erste Veröffentlichung | Zweites Werkzeug in Lynnchris Tool Chest |
27/11/24 | Analytics Master | Regelmäßige Aktualisierung der Marktmetriken alle zwei Stunden. | 1.01 | Zweite Veröffentlichung | Drittes Werkzeug in Lynnchris Tool Chest |
02/12/24 | Analytics Forecaster | Regelmäßige Aktualisierung der Marktmetriken alle zwei Stunden mit Telegram-Integration. | 1.1 | Dritte Auflage | Werkzeug 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 | Werkzeug 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 | Werkzeug Nummer 6 |
9/01/2025 | Signal-Impuls | Analysator für mehrere Zeitrahmen. | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 7 |
17/01/2025 | Metrics Board | Bedienfeld mit Taste für die Analyse. | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 8 |
21/01/2025 | External Flow | Analytik durch externe Bibliotheken. | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 9 |
27/01/2025 | VWAP | Volumen Gewichteter Durchschnittspreis | 1.3 | Erste Veröffentlichung | Werkzeug Nummer 10 |
Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/16984





- 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.
Können wir den "WebRequest enabled EA" auf MetaTrader mit Cloud-Agenten backtesten(optimieren)?
Nach meinen Erkenntnissen:
- Die Verwendung von WebRequest() auf Cloud Agents (remote MQL5.com Netzwerk) ist nicht erlaubt
- Im Gegensatz zu MetaTrader Cloud Agents (die externe Kommunikation blockieren), sind LAN Agents erlaubt