English 日本語
preview
Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 10): External Flow (II) VWAP

Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 10): External Flow (II) VWAP

MetaTrader 5Handelssysteme | 10 Juni 2025, 08:34
86 4
Christian Benjamin
Christian Benjamin

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

VWAP-Formel

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.

VWAP Stratergy

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.

EA Logik

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

Webrequest

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.

SYSTEMERGEBNISSE

Abb. 4. Signalanzeige

Schauen wir uns an, wie der Markt nach dem Auslösen des Signals reagierte, wie im folgenden Chart dargestellt.

Marktreaktion

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.

DatumName des Instruments BeschreibungVersion Aktualisierungen Hinweis
01/10/24Chart ProjectorSkript zur Überlagerung der Kursentwicklung des Vortages mit Geistereffekt.1.0Erste VeröffentlichungErstes Werkzeug in Lynnchris Tool Chest
18/11/24Analytical CommentEr liefert Informationen zum Vortag in Tabellenform und nimmt die zukünftige Marktentwicklung vorweg.1.0Erste VeröffentlichungZweites Werkzeug in Lynnchris Tool Chest
27/11/24Analytics MasterRegelmäßige Aktualisierung der Marktmetriken alle zwei Stunden. 1.01Zweite VeröffentlichungDrittes Werkzeug in Lynnchris Tool Chest
02/12/24Analytics Forecaster Regelmäßige Aktualisierung der Marktmetriken alle zwei Stunden mit Telegram-Integration.1.1Dritte AuflageWerkzeug Nummer 4
09/12/24Volatility NavigatorDer EA analysiert die Marktbedingungen anhand der Indikatoren Bollinger Bands, RSI und ATR.1.0Erste VeröffentlichungWerkzeug Nummer 5
19/12/24Mean Reversion Signal ReaperAnalysiert 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öffentlichungWerkzeug Nummer 8 
21/01/2025External FlowAnalytik durch externe Bibliotheken.1.0 Erste VeröffentlichungWerkzeug Nummer 9 
27/01/2025VWAPVolumen 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

Beigefügte Dateien |
VWAP.py (3.89 KB)
VWAP.mq5 (6.99 KB)
Letzte Kommentare | Zur Diskussion im Händlerforum (4)
Isuru Weerasinghe
Isuru Weerasinghe | 31 Jan. 2025 in 10:45
Sie haben gezeigt, dass dieser Code im Backtesting funktioniert, aber ich bekomme diesen Fehler HTTP Code: -1 | Error: 4014 . laut Doku "Funktion ist für den Aufrufnicht erlaubt"

Christian Benjamin
Christian Benjamin | 31 Jan. 2025 in 10:51
Isuru Weerasinghe Backtesting funktioniert, aber ich bekomme diesen Fehler HTTP Code: -1 | Error: 4014 . laut Doku "Funktion ist für Aufrufnicht erlaubt"

Ich bitte um Entschuldigung. Sie müssen Backtesting-Bibliotheken wie Backtrader, BT oder VectorBT in Ihr Python-Skript importieren. Ohne diese ist Backtesting nicht möglich.
Too Chee Ng
Too Chee Ng | 30 Mai 2025 in 15:19
Danke für den Artikel.
Können wir den "WebRequest enabled EA" auf MetaTrader mit Cloud-Agenten backtesten(optimieren)?
Too Chee Ng
Too Chee Ng | 30 Mai 2025 in 15:45
Too Chee Ng 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

Automatisieren von Handelsstrategien in MQL5 (Teil 5): Die Entwicklung der Strategie „Adaptive Crossover RSI Trading Suite“ Automatisieren von Handelsstrategien in MQL5 (Teil 5): Die Entwicklung der Strategie „Adaptive Crossover RSI Trading Suite“
In diesem Artikel entwickeln wir ein System für die Strategie „Adaptive Crossover RSI Trading Suite“, das das Kreuzen der gleitende Durchschnitte mit Periodenlängen von 14 und 50 als Signale verwendet, die durch einen 14-periodischen RSI-Filter bestätigt werden. Das System umfasst einen Filter für den Handelstag, Signalpfeile mit Kommentaren und ein Echtzeit-Dashboard zur Überwachung. Dieser Ansatz gewährleistet Präzision und Anpassungsfähigkeit beim automatisierten Handel.
Erstellen von selbstoptimierenden Expert Advisor in MQL5 (Teil 5): Selbstanpassende Handelsregeln Erstellen von selbstoptimierenden Expert Advisor in MQL5 (Teil 5): Selbstanpassende Handelsregeln
Die besten Praktiken, die festlegen, wie ein Indikator sicher zu verwenden ist, sind nicht immer leicht zu befolgen. Bei ruhigen Marktbedingungen kann der Indikator überraschenderweise Werte anzeigen, die nicht als Handelssignal gelten, was dazu führt, dass algorithmischen Händlern Chancen entgehen. In diesem Artikel wird eine mögliche Lösung für dieses Problem vorgeschlagen, da wir erörtern, wie Handelsanwendungen entwickelt werden können, die ihre Handelsregeln an die verfügbaren Marktdaten anpassen.
JSON beherrschen: Erstellen Sie Ihren eigenen JSON-Reader in MQL5 von Grund auf JSON beherrschen: Erstellen Sie Ihren eigenen JSON-Reader in MQL5 von Grund auf
Erleben Sie eine Schritt-für-Schritt-Anleitung zur Erstellung eines nutzerdefinierten JSON-Parsers in MQL5, komplett mit Objekt- und Array-Handling, Fehlerprüfung und Serialisierung. Gewinnen Sie praktische Einblicke in die Verknüpfung Ihrer Handelslogik mit strukturierten Daten mit dieser flexiblen Lösung für den Umgang mit JSON in MetaTrader 5.
Generative Adversarial Networks (GANs) für synthetische Daten in der Finanzmodellierung (Teil 2): Erstellen eines synthetischen Symbols für Tests Generative Adversarial Networks (GANs) für synthetische Daten in der Finanzmodellierung (Teil 2): Erstellen eines synthetischen Symbols für Tests
In diesem Artikel erstellen wir ein synthetisches Symbol mit Hilfe eines Generative Adversarial Network (GAN), das realistische Finanzdaten generiert, die das Verhalten tatsächlicher Marktinstrumente, wie z. B. EURUSD, nachahmen. Das GAN-Modell lernt Muster und Volatilität aus historischen Marktdaten und erstellt synthetische Preisdaten mit ähnlichen Merkmalen.