English 日本語
preview
Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 12): External Flow (III) TrendMap

Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 12): External Flow (III) TrendMap

MetaTrader 5Handelssysteme |
159 2
Christian Benjamin
Christian Benjamin

Einführung

Während der Marktvolatilität im Jahr 2020, die durch die COVID-19-Krise ausgelöst wurde, griffen die Händler auf verschiedene technische Instrumente zurück, um abzuschätzen, wann eine Erholung eintreten könnte. Einige experimentierten sogar mit Fibonacci-Zeitzonen, um potenzielle Wendepunkte auf der Grundlage des historischen Kursverhaltens zu identifizieren. Obwohl die Übereinstimmung zwischen den Fibonacci-Projektionen und den großen Erholungsphasen immer noch umstritten ist, boten diese Instrumente einen von mehreren Rahmen, um sich in einem unsicheren Umfeld zurechtzufinden, als die Regierungen mit der Umsetzung von Konjunkturmaßnahmen begannen und sich die Wirtschaft allmählich wieder öffnete.

In unserer vorherigen Serie Entwicklung eines Toolkit zur Analyse von Preisaktionen haben wir eine VWAP-basierte Strategie untersucht, die sich darauf konzentrierte, wie VWAP-Niveaus Marktentscheidungen beeinflussen können - indem sie einen Kauf signalisierte, wenn der Preis über dem VWAP lag, und einen Verkauf, wenn er darunter lag. Es kann jedoch problematisch sein, sich ausschließlich auf den VWAP zu verlassen, insbesondere in Zeiten extremer Marktbedingungen, in denen es zu Umkehrungen kommen kann.

In diesem Artikel gehen wir bei unserer Analyse noch einen Schritt weiter, indem wir VWAP mit Fibonacci-Levels kombinieren, um Handelssignale zu generieren. Fibonacci-Retracement-Levels helfen bei der Identifizierung potenzieller Unterstützungs- und Widerstandsbereiche und können in Verbindung mit VWAP die Robustheit Ihrer Handelsstrategie verbessern. Wir beginnen mit der Erläuterung der zugrundeliegenden Konzepte und skizzieren dann die wichtigsten Funktionen sowohl im MQL5 EA als auch im Python-Skript. Als Nächstes gehen wir auf weitere Funktionsdetails ein und diskutieren die erwarteten Ergebnisse, bevor wir die wichtigsten Erkenntnisse zusammenfassen. Bitte beachten Sie das nachstehende Inhaltsverzeichnis. 


Konzept

Das Fibonacci-Retracement basiert auf der Fibonacci-Sequenz, die von Leonardo Fibonacci im 13. Jahrhundert eingeführt wurde, und wird in der technischen Analyse häufig verwendet, um potenzielle Unterstützungs- und Widerstandsniveaus zu ermitteln, auf denen Kursumkehrungen auftreten könnten. Die Kombination von Fibonacci-Retracement und VWAP (Volume Weighted Average Price, volumengewichteter Durchschnittspreis) bietet uns ein robusteres Handelsinstrument, da der VWAP sowohl Preis- als auch Volumendaten enthält, um die wahre Marktstimmung und Liquidität widerzuspiegeln. Diese Integration verbessert die Entscheidungsfindung, indem sie wichtige Umkehrzonen mit volumengestützten Daten bestätigt, falsche Signale reduziert und eine dynamische Perspektive auf das Marktverhalten bietet.

Das TrendMap-System ist ein Rahmenwerk zur Erzeugung von Handelssignalen, das MQL5 (MetaTrader 5 Expert Advisor) mit einem Python-basierten Analyseserver integriert. Das System verarbeitet Fibonacci-Retracement-Levels, VWAP volumengewichtet und Kursdaten, um Handelssignale (Kauf oder Verkauf) zu generieren. 

  • Wenn der VWAP unter dem 50%-Fibonacci-Level (Mittelkurs) liegt, wird ein Kaufsignal generiert.
  • Liegt der VWAP über dem 50%-Fibonacci-Level (Mittelkurs), wird ein Verkaufssignal generiert.

Dadurch wird sichergestellt, dass die Signale auf der Grundlage der Kursentwicklung im Verhältnis zum VWAP und zu den Fibonacci-Retracement-Levels geliefert werden. Nachfolgend habe ich ein Diagramm erstellt, das zeigt, wie der Markt mit den Fibonacci-Levels und dem VWAP interagiert. Dieses Diagramm stellt die notwendigen Bedingungen dar, die unser Python-basiertes System für die Signalerzeugung überwacht.

  • Fib 0 - 0%
  • Fib 1 - 24%
  • Fib 2 - 38%
  • Fib 3 - 50%
  • Fib 4 - 62%
  • Fib 5 - 79%
  • Fib 6 - 100%

Fib 3 stellt das 50%-Retracement-Niveau dar, und wir stellen fest, dass der VWAP über diesem Niveau liegt, was auf eine mögliche Umkehr hinweist. Folglich wird ein Verkaufssignal erzeugt. Ich habe auch die Niveaus eingekreist, bei denen der Preis sowohl mit den Fibonacci-Niveaus als auch mit dem VWAP interagiert.

KONZEPT

Abb. 1. Preis vs. Fibonacci und VWAP

Der MQL5-Expertenberater integriert Fibonacci-Retracement-Levels und VWAP-Analysen, um Handelssignale zu generieren, ohne Trades auszuführen. Es berechnet Fibonacci-Levels aus einer bestimmten Anzahl vergangener Bars, bestimmt Swing-Hochs und -Tiefs und berechnet VWAP, um Markttrends zu bewerten. Der EA sendet diese Daten über HTTP an einen Python-Server, der die Marktbedingungen analysiert und ein Kauf- oder Verkaufssignal liefert. Bei Erhalt eines neuen Signals aktualisiert der EA den Chart, indem er das Signal anzeigt und Fibonacci-Linien, die VWAP-Linie und Pfeile zur visuellen Darstellung einzeichnet.

Das System arbeitet nach einem zeitbasierten Ansatz, der regelmäßige Aktualisierungen gewährleistet und gleichzeitig Marktveränderungen protokolliert und verfolgt. Dieses Skript richtet einen Flask-Server ein, der Marktdaten aus dem MQL5 EA aufnimmt, verarbeitet und ein Handelssignal zurückgibt.

Wenn der EA JSON-Daten sendet, die VWAP, Fibonacci-Retracement-Levels, Swing-High/Low und Preisdaten enthalten, wertet das Skript aus, ob VWAP unter oder über dem mittleren Preis der Swing-Range liegt, um ein Kauf- oder Verkaufssignal zu bestimmen. Gleichzeitig wird ein Matplotlib-Diagramm mit VWAP, Fibonacci-Levels und Kursdaten erstellt und das Bild als Referenz gespeichert. Das Plotten läuft in einem separaten Thread, damit alles reibungslos funktioniert.

Alles wird zur Nachverfolgung protokolliert, und der Server läuft auf 127.0.0.1:5110. Gehen wir das nachstehende Flussdiagramm durch, um uns ein vollständiges Bild von dem Prozess zu machen.

Hauptlogik

Abb. 2. Flussdiagramm


Hauptfunktionen

MQL5 Expert Advisor

In diesem Teil werden wir die Kernfunktionen durchgehen, die unseren Fibonacci-VWAP EA in MQL5 antreiben. Das Ziel ist es:

  1. Berechnung von Fibonacci-Retracement-Levels anhand von Swing-Hochs und -Tiefs
  2. Bestimmung des VWAP (volumengewichteter Durchschnittspreis) zur Trendbestätigung
  3. Senden der Marktdaten an Python, das eine tiefergehende Analyse durchführt und ein Kauf-/Verkaufssignal liefert.
  4. Zeichnen der Signalpfeile auf dem Chart, sobald alle Bedingungen erfüllt sind.

Lassen Sie uns Schritt für Schritt vorgehen.

1. Fibonacci- und VWAP-Indikatoren aktualisieren

Zunächst müssen wir sicherstellen, dass unsere Fibonacci-Retracement-Levels und VWAP aktuell sind, bevor wir ein Signal erzeugen. Wir erreichen dies durch den Aufruf zweier Schlüsselfunktionen. Zunächst ist die Funktion CalculateFibonacciLevels() für die Ermittlung der Swing-Hoch- und Swing-Tiefpunkte sowie für die Berechnung der entsprechenden Fibonacci-Retracement-Levels zuständig.

Diese Niveaus sind entscheidend für das Verständnis potenzieller Unterstützungs- und Widerstandszonen. Die zweite Funktion, CalculateVWAP(), berechnet den volumengewichteten Durchschnittspreis (VWAP), der als Indikator für die Bestimmung des allgemeinen Markttrends auf der Grundlage von Volumen und Preis dient. Indem wir diese Indikatoren ständig aktualisieren, stellen wir sicher, dass wir mit den aktuellsten Marktdaten arbeiten, was für eine genaue Analyse und Entscheidungsfindung unerlässlich ist.

void UpdateIndicators()
  {
   CalculateFibonacciLevels(InpTimeFrame, InpNumBars, g_SwingHigh, g_SwingLow, g_FibLevels);
   g_VWAP = CalculateVWAP(InpTimeFrame, InpNumBars);
   Print("Updated Indicators: SwingHigh=" + DoubleToString(g_SwingHigh, Digits()) +
         ", SwingLow=" + DoubleToString(g_SwingLow, Digits()) +
         ", VWAP=" + DoubleToString(g_VWAP, Digits()));
  }

2. Senden von Marktdaten an Python

Sobald die Fibonacci- und VWAP-Indikatoren aktualisiert sind, besteht der nächste Schritt darin, die Marktdaten zur erweiterten Analyse an Python zu senden. Dazu werden JSON-Daten (payload) erstellt, die alle für die weitere Verarbeitung erforderlichen Informationen enthält. Die Nutzdaten sind so strukturiert, dass sie wichtige Datenpunkte wie das Symbol und den Zeitrahmen des Charts, die Hoch- und Tiefpunkte des Swing, den VWAP-Wert und die berechneten Fibonacci-Levels enthalten. Außerdem enthalten wir aktuelle Preisdaten zur weiteren Marktanalyse. Sobald die Daten in diesem JSON-Format strukturiert sind, werden sie über eine HTTP-Anfrage an den Python-Server gesendet, wo Python sie verarbeitet und auf der Grundlage der Berechnungen ein Handelssignal zurückgibt.

string BuildJSONPayload()
  {
   string jsonPayload = "{";
   jsonPayload += "\"symbol\":\"" + Symbol() + "\",";
   jsonPayload += "\"timeframe\":\"" + EnumToString(InpTimeFrame) + "\",";
   jsonPayload += "\"swingHigh\":" + DoubleToString(g_SwingHigh, Digits()) + ",";
   jsonPayload += "\"swingLow\":" + DoubleToString(g_SwingLow, Digits()) + ",";
   jsonPayload += "\"vwap\":" + DoubleToString(g_VWAP, Digits()) + ",";

   jsonPayload += "\"fibLevels\":[";
   for(int i = 0; i < 7; i++)
     {
      jsonPayload += DoubleToString(g_FibLevels[i], 3);
      if(i < 6) jsonPayload += ",";
     }
   jsonPayload += "],";

   jsonPayload += "\"priceData\":[";
   for(int i = 0; i < InpNumBars; i++)
     {
      jsonPayload += DoubleToString(iClose(Symbol(), InpTimeFrame, i), Digits());
      if(i < InpNumBars - 1) jsonPayload += ",";
     }
   jsonPayload += "]}";

   return jsonPayload;
  }

3. Kommunizieren mit Python und Empfangen von Signalen

In diesem Stadium wird die HTTP-Anfrage gestellt und die JSON-Nutzdaten an das Python-Skript gesendet. Der Python-Server analysiert dann die Daten und gibt eine Antwort mit einem Kauf- oder Verkaufssignal zurück. Die HTTP-Anfrage ist so aufgebaut, dass sie sowohl das Senden von Daten als auch den Empfang von Antworten abwickelt und während des Prozesses auf Fehler überprüft. Ist die Anfrage erfolgreich (angezeigt durch einen Antwortcode von 200), wird die Antwort geparst und das entsprechende Signal (Kauf, Verkauf oder Halten) aus den von Python zurückgegebenen JSON-Daten extrahiert. Dies ermöglicht es dem MQL5 EA, externe Rechenleistung in seinen Entscheidungsprozess zu integrieren, was robustere Handelssignale ermöglicht.

string SendDataToPython(string payload)
  {
   string headers = "Content-Type: application/json\r\n";
   char postData[];
   StringToCharArray(payload, postData);
   char result[];
   string resultHeaders;
   int resCode = WebRequest("POST", InpPythonURL, headers, InpHTTPTimeout, postData, result, resultHeaders);
   
   if(resCode == 200)
     {
      string response = CharArrayToString(result);
      Print("HTTP Response: " + response);
      string signal = ParseSignalFromJSON(response);
      return signal;
     }
   else
     {
      Print("Error: WebRequest failed with code " + IntegerToString(resCode));
      return "";
     }
  }

4. Zeichnen von Kauf-/Verkaufssignalen auf dem Chart

Nachdem das Handelssignal von Python empfangen wurde, besteht der nächste Schritt darin, dieses Signal visuell auf dem Chart darzustellen. Dazu wird ein Pfeil auf den aktuellen Marktpreis gezeichnet, um die vorgeschlagene Aktion anzuzeigen. Bei einem Kaufsignal wird ein nach oben gerichteter Pfeil (grüne Farbe) und bei einem Verkaufssignal ein nach unten gerichteter Pfeil (rote Farbe) eingezeichnet. Dieser visuelle Hinweis ist für Händler entscheidend, um den Handelsvorschlag schnell zu interpretieren, ohne Zahlen analysieren zu müssen.

Die Pfeile werden mit der Funktion ObjectCreate dynamisch erstellt, und ihr Aussehen (z. B. Farbe und Größe) kann zur besseren Sichtbarkeit angepasst werden. Die Verwendung dieser Pfeile macht die Handelssignale klar und zugänglich, auch für diejenigen, die nicht jedes Detail der Analyse des Systems verfolgen können.

void DrawSignalArrow(string signal)
  {
   int arrowCode = 0;
   color arrowColor = clrWhite;

   string lowerSignal = MyStringToLower(signal);
   if(lowerSignal == "buy")
     {
      arrowCode = 233;  // Upward arrow
      arrowColor = clrLime;
     }
   else if(lowerSignal == "sell")
     {
      arrowCode = 234;  // Downward arrow
      arrowColor = clrRed;
     }
   else
     {
      Print("Invalid signal: " + signal);
      return;
     }

   string arrowName = "SignalArrow_" + IntegerToString(TimeCurrent());
   ObjectCreate(0, arrowName, OBJ_ARROW, 0, TimeCurrent(), iClose(Symbol(), PERIOD_CURRENT, 0));
   ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, arrowCode);
   ObjectSetInteger(0, arrowName, OBJPROP_COLOR, arrowColor);
   ObjectSetInteger(0, arrowName, OBJPROP_WIDTH, 2);
  }

Python-Skript

1. VWAP & Fibonacci gegen den Preis aufzeichnen

Die Funktion plot_vwap_fib_vs_price() visualisiert die Preisbewegung, den VWAP und die Fibonacci-Retracement-Levels. Er dient dazu, die Beziehung zwischen diesen drei Indikatoren zu verstehen. Die Funktion akzeptiert die folgenden Parameter:

  • symbol: Das zu analysierende Handelsinstrument. 
  • vwap: Der berechnete volumengewichtete Durchschnittspreis.
  • swingHigh und swingLow: Die Hoch- und Tiefpunkte, die zur Berechnung der Fibonacci-Retracement-Levels verwendet werden.
  • fibLevels: Die Fibonacci-Retracement-Levels (die Standardwerte umfassen gängige Retracements wie 0,236, 0,382, usw.).
  • price_data: Eine Pandas-Serie, die die Preisdaten im Zeitverlauf enthält.

Funktionsaufteilung:

  • Aufzeichnung von Preisdaten: Die Funktion beginnt mit dem Plotten der Preisdaten im Zeitverlauf unter Verwendung von sns.set für den Stil und ax.plot für die Visualisierung.
  • Zeichnen von Fibonacci-Ebenen: Für jedes Fibonacci-Level, das in der Liste angegeben ist, berechnet die Funktion den entsprechenden Preis und zeichnet eine horizontale Linie mit ax.axhline.
  • Zeichnung VWAP: Der VWAP wird als gelbe horizontale Linie dargestellt.
  • Zeichnung speichern: Das Chart wird mit einem Zeitstempel gespeichert, um das Überschreiben früherer Charte zu vermeiden.

Die Zeichnung wird als Bilddatei gespeichert und hilft bei der Visualisierung der Interaktion des Preises mit wichtigen Fibonacci-Retracement-Levels und dem VWAP.

def plot_vwap_fib_vs_price(symbol: str, vwap: float, swingHigh: float, swingLow: float, fibLevels: list, price_data: pd.Series) -> str:     sns.set(style="whitegrid")     fig, ax = plt.subplots(figsize=(7.5, 5), dpi=100)     ax.plot(price_data.index, price_data.values, label="Price", color='blue', marker='o', markersize=4)     for level in fibLevels:         level_price = swingLow + (swingHigh - swingLow) * level         ax.axhline(y=level_price, linestyle='--', linewidth=1.5, label=f'Fib {level*100:.1f}%: {level_price:.5f}')          ax.axhline(y=vwap, color='yellow', linestyle='-', linewidth=2, label=f'VWAP: {vwap:.5f}')     ax.set_title(f'VWAP & Fibonacci vs Price for {symbol}')     ax.set_xlabel('Time Index')     ax.set_ylabel('Price')     ax.legend()     filename = f"vwap_fib_plot_{symbol}_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"     plt.savefig(filename)     plt.close(fig)     return filename

2. Kolbenweg für Signal und Analyse

Die Funktion get_signal() ist die zentrale Route, die POST-Anfragen bearbeitet und für den Empfang von Marktdaten, die Durchführung von Analysen und die Rückgabe von Handelssignalen zuständig ist. Die Daten werden als JSON-Nutzdaten von MQL5 an diese Route gesendet.

Funktionsaufteilung:

  • Erhalten der Daten: Die Funktion empfängt Marktdaten im Rohformat, entschlüsselt sie und überträgt sie in ein JSON-Objekt.
  • Daten extrahieren: Wichtige Datenpunkte wie Symbol, swingHigh, swingLow, vwap, fibLevels und priceData werden aus dem eingehenden JSON extrahiert.
  • Plotten: Es wird ein neuer Thread gestartet, der die Zeichen-Funktion aufruft, um die visuelle Darstellung der Marktbedingungen (VWAP und Fibonacci) zu erzeugen.
  • Signalerzeugung: Das Kauf-/Verkaufssignal wird durch den Vergleich des VWAP mit dem Mittelwert zwischen dem Swing-Hoch und dem Swing-Tief erzeugt. Liegt der VWAP unter dem Mittelwert, wird ein Kaufsignal generiert, andernfalls wird ein Verkaufssignal ausgegeben.
  • Antwort: Es wird eine Antwort mit dem erzeugten Signal („Kaufen“, „Verkaufen“ oder „Keine“) und einer Erklärung zurückgegeben.

Die Logik der Signalerzeugung ist einfach, aber effektiv:

  • Kaufsignal: Der VWAP liegt unter dem Mittelpunkt des Swing-Hochs und -Tiefs, was auf eine potenzielle Aufwärtsdynamik hinweist.
  • Verkaufssignal: Der VWAP liegt über dem Mittelwert, was auf einen Abwärtstrend oder rückläufige Bedingungen hindeutet.

@app.route('/getSignal', methods=['POST']) def get_signal():     try:         # Get the raw data from the request         raw_data = request.data.decode('utf-8').strip()         logging.debug("Raw data received: " + raw_data)         # Parse JSON         decoder = json.JSONDecoder()         data, idx = decoder.raw_decode(raw_data)         if idx != len(raw_data):             logging.error(f"Extra data found after valid JSON: index {idx} of {len(raw_data)}")         logging.info("Data received from MQL5: " + json.dumps(data, indent=2))     except Exception as e:         logging.error("Error parsing JSON: " + str(e))         return jsonify({"signal": "None", "error": str(e)})     try:         # Extract parameters         symbol = data.get('symbol', 'Unknown')         swingHigh = float(data.get('swingHigh', 0))         swingLow = float(data.get('swingLow', 0))         vwap = float(data.get('vwap', 0))         fibLevels = data.get('fibLevels', [0.236, 0.382, 0.5, 0.618, 1.618])  # Default levels if not provided         # Convert priceData list into a pandas Series         price_data = pd.Series(data.get('priceData', []))         # Start thread for visualization         threading.Thread(target=plot_vwap_fib_vs_price, args=(symbol, vwap, swingHigh, swingLow, fibLevels, price_data)).start()         # Determine signal based on VWAP & Fibonacci         mid_price = np.mean([swingHigh, swingLow])         if vwap < mid_price and price_data.iloc[-1] < swingLow + (swingHigh - swingLow) * 0.382:             signal = "Buy"         elif vwap > mid_price and price_data.iloc[-1] > swingLow + (swingHigh - swingLow) * 0.618:             signal = "Sell"         else:             signal = "None"         explanation = f"Signal: {signal} based on VWAP and Fibonacci analysis."     except Exception as e:         logging.error("Error processing data: " + str(e))         signal = "None"         explanation = "Error processing the signal."     # Build response     response = {         "signal": signal,         "explanation": explanation,         "received_data": data     }     logging.debug("Sending response to MQL5: " + json.dumps(response))     return jsonify(response)

Im Code werden bei der Signalerzeugung sowohl VWAP als auch Fibonacci berücksichtigt, wobei sich die Logik ausdrücklich auf beide stützt, um zu entscheiden, ob ein Kauf- oder Verkaufssignal erzeugt werden soll. Das Kauf- oder Verkaufssignal basiert direkt auf der Übereinstimmung zwischen dem VWAP und den Fibonacci-Levels. Zum Beispiel:

  • Kaufsignal: Wenn der VWAP unter dem Mittelwert liegt und der Kurs sich einem Unterstützungsniveau (Fibonacci-Retracement) nähert, ist dies ein starkes Indiz für einen Kauf.
  • Verkaufssignal: Wenn der VWAP über dem Mittelwert liegt und der Kurs sich auf einem Fibonacci-Widerstandsniveau befindet, ist das Verkaufssignal stärker.


Andere Funktionen

MQL5 EA

  • Hilfsfunktionen

Beginnen wir mit den Hilfsfunktionen. Sie sind wie die kleinen Werkzeuge in unserem Werkzeugkasten, die uns später die Arbeit erleichtern. Die Funktion BoolToString wandelt zum Beispiel einen true/false-Wert in eine Zeichenkette („true“ oder „false“) um, sodass diese Werte bei der Protokollierung oder Anzeige leicht zu lesen sind. Dann gibt es noch CharToStr, das einen Zeichencode (eine vorzeichenlose Kurzform) in eine Zeichenkette umwandelt - eine praktische Funktion, wenn Sie mit Textdaten arbeiten müssen. MyStringToLower schließlich durchläuft eine gegebene Zeichenkette Zeichen für Zeichen und wandelt alle Großbuchstaben in Kleinbuchstaben um. Dies ist besonders nützlich, wenn Sie Zeichenketten vergleichen wollen, ohne sich um Groß- und Kleinschreibung zu kümmern. Hier ist der genaue Code:

//+------------------------------------------------------------------+ //| Helper: Convert bool to string                                   | //+------------------------------------------------------------------+ string BoolToString(bool val)   {    return(val ? "true" : "false");   } //+------------------------------------------------------------------+ //| Helper: Convert ushort (character code) to string                | //+------------------------------------------------------------------+ string CharToStr(ushort ch)   {    return(StringFormat("%c", ch));   } //+------------------------------------------------------------------+ //| Helper: Convert a string to lower case                           | //| This custom function avoids the implicit conversion warning.     | //+------------------------------------------------------------------+ string MyStringToLower(string s)   {    string res = "";    int len = StringLen(s);    for(int i = 0; i < len; i++)      {       ushort ch = s[i];       // Check if character is uppercase A-Z.       if(ch >= 'A' && ch <= 'Z')          ch = ch + 32;       res += CharToStr(ch);      }    return res;   }

Diese Funktionen tragen im Wesentlichen dazu bei, dass unsere Text- und Datenverarbeitung im gesamten EA einheitlich ist.

  • Initialisierung und Bereinigung

Als Nächstes folgen die Initialisierungs- und Bereinigungsroutinen. Stellen Sie sich vor, dass sie die Bühne vor Beginn des Stücks vorbereiten und danach aufräumen. In der Funktion OnInit beginnt der EA mit dem Ausdruck einer Willkommensnachricht. Dann wird mit EventSetTimer ein Timer initialisiert (der für periodische Aufgaben wichtig ist) und InitializeFibonacciArray aufgerufen, um unsere Fibonacci-Stufen vorzuladen. Außerdem wird die aktuelle Zeit für die Verwaltung späterer Aktualisierungen gespeichert. Wenn der Timer nicht initialisiert werden kann, wird der EA sofort angehalten, um weitere Probleme zu vermeiden. Umgekehrt wird die Funktion OnDeinit aufgerufen, wenn der EA aus dem Chart entfernt wird; sie beendet den Timer mit EventKillTimer und protokolliert den Grund. Das sieht folgendermaßen aus:

//+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()   {    Print("FibVWAP No-Trade EA initializing...");    if(!EventSetTimer(InpTimerInterval))      {       Print("Error: Unable to set timer.");       return(INIT_FAILED);      }    InitializeFibonacciArray();    g_LastUpdateTime = TimeCurrent();    Print("FibVWAP No-Trade EA successfully initialized.");    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   {    EventKillTimer();    Print("FibVWAP No-Trade EA deinitialized, reason code: " + IntegerToString(reason));   } //+------------------------------------------------------------------+ //| Initialize Fibonacci levels array                                | //+------------------------------------------------------------------+ void InitializeFibonacciArray()   {    g_FibLevels[0] = 0.000;    g_FibLevels[1] = 0.236;    g_FibLevels[2] = 0.382;    g_FibLevels[3] = 0.500;    g_FibLevels[4] = 0.618;    g_FibLevels[5] = 0.786;    g_FibLevels[6] = 1.000;   }

Durch den sorgfältigen Auf- und Abbau unserer Umgebung stellen wir sicher, dass unser EA reibungslos funktioniert und keine losen Enden zurückbleiben.

  • Periodische Ausführung und Ereignisbehandlung

Sehen wir uns nun an, wie der EA seine Aufgaben während der Laufzeit verwaltet. Die Funktion OnTimer ist hier der Schlüssel; sie wird in vom Nutzer festgelegten Intervallen ausgelöst (festgelegt durch InpTimerInterval). Jedes Mal, wenn dieser Timer abläuft, aktualisiert der EA seine Indikatoren, erstellt eine JSON-Nutzdaten, sendet diese Nutzdaten an unseren Python-Endpunkt und verarbeitet alle zurückgegebenen Signale. Wenn es ein neues Signal gibt, zeichnet der EA sogar einen Pfeil auf dem Chart. OnTick wird zwar bei jeder Marktaktualisierung (oder jedem Tick) aufgerufen, aber wir verwenden es nur, um die MainProcessingLoop aufzurufen, damit nicht bei jedem Tick eine umfangreiche Verarbeitung stattfindet, sondern nur in kontrollierten Abständen. Diese Konstruktion trägt dazu bei, dass der EA effizient bleibt. Sehen Sie sich den Code an:

//+------------------------------------------------------------------+ //| Expert timer function: periodic update                           | //+------------------------------------------------------------------+ void OnTimer()   {    UpdateIndicators();    string payload = BuildJSONPayload();    Print("Payload sent to Python: " + payload);    string signal = SendDataToPython(payload);    if(signal != "")      {       if(signal != g_LastSignal)         {          g_LastSignal = signal;          Print("New signal received: " + signal);          Comment("ML Signal: " + signal);          // Draw an arrow on the chart for the new signal.          DrawSignalArrow(signal);         }       else         {          Print("Signal unchanged: " + signal);         }      }    else      {       Print("Warning: No valid signal received.");      }    UpdateChartObjects();   } //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick()   {    MainProcessingLoop();   } //+------------------------------------------------------------------+ //| Main processing loop: can be called from OnTick                  | //+------------------------------------------------------------------+ void MainProcessingLoop()   {    datetime currentTime = TimeCurrent();    if(currentTime - g_LastUpdateTime >= InpTimerInterval)      {       UpdateChartObjects();       g_LastUpdateTime = currentTime;      }   }

Dieses Setup stellt sicher, dass unser EA seine Updates im richtigen Tempo durchführt, ohne von jedem Tick überfordert zu werden.

  • Chart-Objekt-Verwaltung

Visuelles Feedback ist beim Handel von großer Bedeutung, und genau hier kommt unser Chart-Objektmanagement ins Spiel. Die Funktion DrawChartObjects ist für das Zeichnen visueller Elemente auf dem Chart verantwortlich, wie z.B. horizontale Linien, die unsere Fibonacci-Levels und den VWAP darstellen. Es löscht zunächst alle vorherigen Objekte, um Unordnung zu vermeiden, und erstellt dann neue Objekte mit den entsprechenden Farben, Stilen und Textbeschriftungen. Die Hilfsfunktion UpdateChartObjects ruft einfach DrawChartObjects auf, um die Dinge modular zu halten, und ExtendedProcessing ist verfügbar, wenn wir zusätzliche Aktualisierungen oder Debugging-Aktionen durchführen müssen. Hier ist der Code:

//+------------------------------------------------------------------+ //| Draw objects on the chart for visual indicator levels            | //+------------------------------------------------------------------+ void DrawChartObjects()   {    string objPrefix = "FibVWAP_";    // Remove previous objects with the given prefix.    ObjectsDeleteAll(0, objPrefix);    double range = g_SwingHigh - g_SwingLow;    for(int i = 0; i < 7; i++)      {       double levelPrice = g_SwingLow + range * g_FibLevels[i];       string name = objPrefix + "FibLevel_" + IntegerToString(i);       if(!ObjectCreate(0, name, OBJ_HLINE, 0, 0, levelPrice))          Print("Error creating object: " + name);       else         {          ObjectSetInteger(0, name, OBJPROP_COLOR, clrDeepSkyBlue);          ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT);          ObjectSetString(0, name, OBJPROP_TEXT, "Fib " + DoubleToString(g_FibLevels[i]*100, 0) + "%");         }      }    string vwapName = objPrefix + "VWAP";    if(!ObjectCreate(0, vwapName, OBJ_HLINE, 0, 0, g_VWAP))       Print("Error creating VWAP object.");    else      {       ObjectSetInteger(0, vwapName, OBJPROP_COLOR, clrYellow);       ObjectSetInteger(0, vwapName, OBJPROP_STYLE, STYLE_SOLID);       ObjectSetString(0, vwapName, OBJPROP_TEXT, "VWAP");      }   } //+------------------------------------------------------------------+ //| Periodically update chart objects                                | //+------------------------------------------------------------------+ void UpdateChartObjects()   {    DrawChartObjects();   } //+------------------------------------------------------------------+ //| Extended processing: additional updates and chart redraw         | //+------------------------------------------------------------------+ void ExtendedProcessing()   {    Print("Extended processing executed.");    UpdateChartObjects();   }

  • Zusätzliche Hilfsfunktionen
Betrachten wir abschließend die Hilfsfunktionen. Dies sind die unbesungenen Helden, die unsere EA hinter den Kulissen unterstützen. Die Funktion CharArrayToString nimmt ein Array von Zeichen - oft von Webanfragen empfangen - und wandelt es in eine brauchbare Zeichenkette um. LogDebugInfo gibt Meldungen mit einem Zeitstempel aus, sodass Sie die Aktivität des EA über die Zeit verfolgen können, was bei der Fehlersuche sehr hilfreich ist. Und mit PauseExecution können Sie den EA für eine bestimmte Anzahl von Sekunden anhalten, was nützlich sein kann, wenn Sie die Dinge verlangsamen müssen, um das Verhalten während der Tests zu beobachten. Hier ist der Code für diese Hilfsfunktion:

//+------------------------------------------------------------------+ //| Convert char array to string                                     | //+------------------------------------------------------------------+ string CharArrayToString(const char &arr[])   {    string ret = "";    for(int i = 0; i < ArraySize(arr); i++)       ret += CharToStr(arr[i]);    return(ret);   } //+------------------------------------------------------------------+ //| Custom logging function for detailed debug information           | //+------------------------------------------------------------------+ void LogDebugInfo(string info)   {    string logMessage = TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " | " + info;    Print(logMessage);   } //+------------------------------------------------------------------+ //| Additional utility: Pause execution (for debugging)              | //+------------------------------------------------------------------+ void PauseExecution(int seconds)   {    datetime endTime = TimeCurrent() + seconds;    while(TimeCurrent() < endTime)      {       Sleep(100);      }   }

Diese Funktionen sind vielleicht nicht der Star des EA, aber sie machen einen großen Unterschied, wenn es darum geht, Fehler zu beheben und sicherzustellen, dass alles wie erwartet läuft.

Python-Skript

  • Wichtige Importe in unserem Python-Handelssystem
Schauen wir uns die wichtigsten Bibliotheken an, die in diesem System verwendet werden. Jeder spielt eine entscheidende Rolle, sei es bei der Verarbeitung von Daten, der Durchführung von Berechnungen oder der Visualisierung von Markteinblicken. Nachfolgend finden Sie einen Codefragment, der diese Importe zeigt, gefolgt von einer Tabelle, in der ihr Zweck und ihr Beitrag zum System erläutert werden.

import datetime   import json   import logging   import threading   import numpy as np   import pandas as pd   import pandas_ta as ta   import matplotlib.pyplot as plt   import seaborn as sns   from flask import Flask, request, jsonify  

BibliothekZweckWie es in unserem System verwendet wird
datetimeZeitmanagementWird verwendet, um gespeicherte Handelscharts und Protokollereignisse mit einem Zeitstempel zu versehen. Jedes Mal, wenn wir ein Chart erstellen, fügen wir einen Zeitstempel hinzu, um die verschiedenen Marktbedingungen im Laufe der Zeit zu verfolgen.
jsonDatenaustauschDa unser System mit MQL5 kommuniziert, senden und empfangen wir Daten im JSON-Format. Dieses Modul hilft uns bei der Kodierung und Dekodierung von JSON-Nachrichten zwischen Python und MQL5.
loggingFehlersuche und ÜberwachungVerfolgt die Systemereignisse. Wir verwenden es, um jeden Schritt zu protokollieren - wenn ein Signal empfangen oder verarbeitet wird oder wenn ein Fehler auftritt - was die Fehlersuche erleichtert.
threadingAufgaben im Hintergrund ausführenWenn wir ein VWAP-Fibonacci-Chart generieren, lassen wir es in einem separaten Thread laufen, um sicherzustellen, dass der Server reaktionsfähig bleibt und keine Verzögerung beim Senden von Signalen zurück an MQL5 entsteht.
numpyNumerische BerechnungenWir verwenden NumPy, um den mittleren Preis zu berechnen und andere mathematische Operationen schnell und effizient durchzuführen. Bei der Verarbeitung von Echtzeit-Marktdaten kommt es auf Geschwindigkeit an.
pandasDatenverarbeitungDa Marktdaten in Zeilen und Spalten strukturiert sind (wie in einer Tabellenkalkulation), lassen sich diese Daten mit Pandas leicht speichern, filtern und für die Analyse manipulieren.
pandas_taTechnische IndikatorenObwohl es kein Kernbestandteil unseres derzeitigen Systems ist, ermöglicht es zusätzliche technische Analysewerkzeuge, falls diese in Zukunft benötigt werden.
matplotlib.pyplotCharting & VisualisierungDas Rückgrat unserer visuellen Analyse. Wir verwenden es, um Kursbewegungen, VWAP-Levels und Fibonacci-Retracement-Zonen darzustellen.
seanbornVerbessertes Chart-StylingEs trägt dazu bei, unsere Charts visuell ansprechend zu gestalten, sodass Trends und wichtige Niveaus leichter zu erkennen sind.
flask Kommunikation zwischen MQL5 und Python Dadurch wird der Austausch von Signalen in Echtzeit möglich. Flask erstellt eine API, die es unserem MQL5 Expert Advisor ermöglicht, Preisdaten zu senden und Handelssignale sofort zu empfangen. 
  • Initialisierung des Flask-Servers (if __name__ == '__main__')
Dieser Block initialisiert und startet den Flask-Webserver, sodass der MQL5 EA mit dem Python-Skript über HTTP-Anfragen kommunizieren kann.

Wie es funktioniert:
  • Bindet den Server an Port 5110
  • Läuft im Debug-Modus für Echtzeit-Protokollierung und Fehlersuche
  • Stellt sicher, dass der Server nicht unnötig neu gestartet wird (use_reloader=False)

if __name__ == '__main__':     port = 5110     logging.info(f"Starting Flask server on 127.0.0.1:{port} (debug mode ON)")     app.run(host="127.0.0.1", port=port, debug=True, use_reloader=False)

Ergebnisse

Um das System zu testen, führen Sie zunächst das Python-Skript aus, um den Port und den Server für die Verbindung zu aktivieren. Wenn Sie sich nicht sicher sind, wie Sie das Skript ausführen sollen, finden Sie im Artikel über den External Flow eine Anleitung. Sobald der Server aktiv ist, führen wir den MQL5 EA aus. Schauen wir uns nun die Ergebnisse an, nachdem das System erfolgreich gestartet wurde.

Protokolle der Eingabeaufforderung

2025-02-06 12:45:32,384 DEBUG: Sending response to MQL5: {"signal": "Sell", "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", "received_data": {"symbol": "EURUSD", "timeframe": "PERIOD_H1", "swingHigh": 1.05331, "swingLow": 1.02099, "vwap": 1.03795, "fibLevels": [0.0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0], "priceData": [1.03622, 1.03594, 1.03651, 1.03799, 1.03901, 1.03865, 1.03871, 1.0392, 1.03951, 1.04025, 1.03974, 1.03986, 1.04041, 1.04017, 1.04049, 1.04072, 1.04156, 1.04197, 1.04181, 1.04223, 1.04224, 1.04079, 1.04192, 1.04147, 1.04251, 1.04039, 1.04039, 1.04026, 1.0385, 1.03778, 1.03786, 1.03796, 1.03845, 1.03734, 1.03786, 1.03714, 1.0378, 1.03786, 1.03854, 1.03817, 1.03811, 1.03767, 1.03784, 1.03801, 1.03593, 1.03404, 1.03254, 1.03223, 1.0335, 1.03386, 1.03344, 1.03115, 1.03067, 1.02932, 1.0306, 1.03147, 1.0322, 1.03221, 1.03178, 1.03281, 1.0342, 1.03441, 1.02955, 1.02846, 1.02785, 1.02795, 1.02761, 1.03162, 1.0251, 1.0264, 1.02577, 1.02522, 1.02438, 1.0231, 1.02436, 1.02249, 1.02431, 1.02404, 1.02265, 1.02216, 1.02235, 1.02377, 1.02314, 1.0247, 1.02504, 1.03583, 1.03733, 1.03763, 1.03698, 1.042, 1.03998, 1.03964, 1.03687, 1.03822, 1.03825, 1.03759, 1.03765, 1.03836, 1.03845, 1.0404, 1.03946, 1.03888, 1.03875, 1.0385, 1.03897, 1.03884, 1.03867, 1.03969, 1.03873, 1.03885, 1.04076, 1.0428, 1.0425, 1.0417, 1.04197, 1.04314, 1.0428, 1.04562, 1.04033, 1.03918, 1.04007, 1.04076, 1.04217, 1.04239, 1.04139, 1.0422, 1.04191, 1.04253, 1.0423, 1.042, 1.04259, 1.04247, 1.04216, 1.04209, 1.04105, 1.04164, 1.042, 1.04213, 1.04157, 1.04194, 1.04013, 1.03878, 1.0404, 1.04016, 1.04037, 1.04038, 1.04244, 1.04161, 1.04372, 1.04403, 1.04386, 1.04374, 1.0434, 1.04272, 1.04304, 1.04272, 1.04286, 1.04301, 1.04315, 1.0435, 1.04264, 1.04279, 1.04262, 1.04241, 1.04314, 1.04249, 1.04203, 1.04234, 1.0425, 1.04352, 1.04252, 1.04342, 1.04376, 1.04364, 1.04336, 1.04291, 1.04336, 1.04378, 1.04453, 1.0437, 1.04886, 1.04916, 1.04881, 1.04926, 1.04849, 1.04888, 1.04908, 1.04992, 1.05094, 1.05199, 1.05212, 1.0513, 1.05054, 1.04888, 1.04875, 1.04571, 1.04591, 1.0463, 1.04633, 1.04686]}} 2025-02-06 12:39:32,397 INFO: 127.0.0.1 - - [06/Feb/2025 12:39:32] "POST /getSignal HTTP/1.1" 200 - 2025-02-06 12:39:32,805 DEBUG: VWAP & Fibonacci vs Price graph saved as vwap_fib_plot_EURUSD_20250206_123932.png

MQL5-Protokolle

2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 0 (0%): 1.02099 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 1 (24%): 1.02862 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 2 (38%): 1.03334 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 3 (50%): 1.03715 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 4 (62%): 1.04096 2025.02.06 12:45:32.331 FIBVWAP (EURUSD,M5)     Fib Level 5 (79%): 1.04639 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Fib Level 6 (100%): 1.05331 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Updated Indicators: SwingHigh=1.05331, SwingLow=1.02099, VWAP=1.03795 2025.02.06 12:45:32.332 FIBVWAP (EURUSD,M5)     Payload sent to Python: {"symbol":"EURUSD","timeframe":"PERIOD_H1","swingHigh":1.05331,"swingLow":1.02099,"vwap":1.03795,"fibLevels":[0.000,0.236,0.382,0.500,0.618,0.786,1.000],"priceData":[1.03583,1.03594,1.03651,1.03799,1.03901,1.03865,1.03871,1.03920,1.03951,1.04025,1.03974,1.03986,1.04041,1.04017,1.04049,1.04072,1.04156,1.04197,1.04181,1.04223,1.04224,1.04079,1.04192,1.04147,1.04251,1.04039,1.04039,1.04026,1.03850,1.03778,1.03786,1.03796,1.03845,1.03734,1.03786,1.03714,1.03780,1.03786,1.03854,1.03817,1 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)     HTTP Response: { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "explanation": "Signal: Sell based on VWAP and Fibonacci analysis.", 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)       "received_data": { 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "fibLevels": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.0, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.236, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.382, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.5, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.618, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           0.786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)         "priceData": [ 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03594, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03651, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03799, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03901, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03865, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03871, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0392, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03951, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04025, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03974, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03986, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04041, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04017, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04049, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04072, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04156, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04181, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04223, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04224, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04079, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04192, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04147, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04251, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04039, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.04026, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03778, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03796, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03734, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03714, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.0378, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03786, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03854, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03817, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03811, 2025.02.06 12:45:32.441 FIBVWAP (EURUSD,M5)           1.03767, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03784, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03801, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03593, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03254, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03223, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0335, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03344, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03115, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03067, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02932, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0306, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03147, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0322, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03221, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03178, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03281, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03441, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02955, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02846, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02785, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02795, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02761, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03162, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0251, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02577, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02522, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02438, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0231, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02436, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02431, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02265, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02235, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02377, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.02504, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03583, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03733, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03763, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03698, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03998, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03964, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03687, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03822, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03825, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03759, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03765, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03836, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03845, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03946, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0385, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03897, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03884, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03867, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03969, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03873, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03885, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0417, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04197, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0428, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04562, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04033, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03918, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04007, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04076, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04217, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04239, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04139, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0422, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04191, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04253, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0423, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04259, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04247, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04216, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04209, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04105, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04164, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.042, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04213, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04157, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04194, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04013, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.03878, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0404, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04016, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04037, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04038, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04244, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04161, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04372, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04403, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04386, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04374, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0434, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04304, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04272, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04286, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04301, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04315, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0435, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04264, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04279, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04262, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04241, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04314, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04249, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04203, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04234, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0425, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04352, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04252, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04342, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04376, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04364, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04291, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04336, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04378, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04453, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0437, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04886, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04916, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04881, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04926, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04849, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04908, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04992, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05094, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05199, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05212, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0513, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.05054, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04888, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04875, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04571, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04591, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.0463, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04633, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)           1.04686 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         ], 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingHigh": 1.05331, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "swingLow": 1.02099, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "symbol": "EURUSD", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "timeframe": "PERIOD_H1", 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)         "vwap": 1.03795 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       }, 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)       "signal": "Sell" 2025.02.06 12:45:32.442 FIBVWAP (EURUSD,M5)     }

VWAP-Fibonacci vs. Preischart wurde ebenfalls gezeichnet und im selben Verzeichnis wie das Python-Skript gespeichert. Dieses Diagramm veranschaulicht, wie der Preis mit VWAP und Fibonacci-Levels interagiert.

MATPLOTLIB

Abb. 3. Matplotlib Zeichnung

Im folgenden Chart protokolliert der MQL5 EA auf dem MetaTrader 5 Chart und zeigt die Antwort des Python Servers an. Das Chart zeigt zwei Kaufsignale, die durch Pfeile gekennzeichnet sind und die auch auf der Registerkarte Experten protokolliert werden. Wie wir sehen, folgte der Markt der Richtung dieser Signale und bestätigte damit deren Gültigkeit. Für eine genauere Analyse habe ich mich für das M1-Chart entschieden.

B300

Abb. 4. Test auf Boom 300 Index


Schlussfolgerung

Dieses System erweist sich als äußerst nützlich für Händler. Neben der Bereitstellung von Signalen ermöglicht es eine klare Visualisierung, wie der Preis mit den Fibonacci-Levels und dem VWAP während der Signalgenerierung interagiert. Die Visualisierung wird auf zwei Arten erreicht: Python zeichnet ein Chart mit der Matplotlib-Bibliothek, während der MQL5 EA VWAP und Fibonacci-Linien zur besseren Analyse direkt im Chart anzeigt. Diese verbesserte visuelle Darstellung kann Händlern dabei helfen, fundierte Entscheidungen zu treffen.

DatumName des Werkzeugs 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/25 Signal Pulse Multiple timeframe analyzer1.0 Erste Veröffentlichung Werkzeug Nummer 7 
17/01/25 Metrics Board Bedienfeld mit Taste für die Analyse. 1.0 Erste VeröffentlichungWerkzeug Nummer 8 
21/01/25External FlowAnalytik durch externe Bibliotheken.1.0 Erste VeröffentlichungWerkzeug Nummer 9 
27/01/25VWAPVolumen Gewichteter Durchschnittspreis  1.3 Erste Veröffentlichung Werkzeug Nummer 10 
02/02/25 Heikin Ashi Trendglättung und Identifizierung von Umkehrsignalen 1.0 Erste Veröffentlichung Werkzeug Nummer 11
04/02/25 FibVWAP Signalerzeugung durch Python-Analyse 1.0 Erste Veröffentlichung Werkzeug Nummer 12

Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/17121

Beigefügte Dateien |
server.py (4.53 KB)
FIBVWAP.mq5 (17.22 KB)
Letzte Kommentare | Zur Diskussion im Händlerforum (2)
linfo2
linfo2 | 21 März 2025 in 18:52
Vielen Dank, Chris, für all deine Ideen und Veröffentlichungen, definitiv hilfreiches Material. Um diesen Artikel zum Laufen zu bringen, muss ich einige Einstellungen vornehmen, die meiner Umgebung entsprechen, nachdem ich Price Action Analysis Toolkit Development (Part 9) erneut geprüft habe : External Flow - MQL5 Artikel, die vielleicht für andere hilfreich sind

1 Aktualisieren Sie die Skripte, um Ihre Adresse oder den lokalen Host 127.0.0.1 zu verwenden.

2 fügen Sie in tools options web request url die von Ihnen verwendete Adresse hinzu

4 stellen Sie sicher, dass alle Python-Teile installiert sind

matplotlib installieren

pip install pandas

pip install Flask seaborn und Numpty falls nötig

3 Starten Sie die Flask-Anwendung auf dieser Adresse, indem Sie die Python-Datei mit der von Ihnen verwendeten Adresse ausführen

Christian Benjamin
Christian Benjamin | 22 März 2025 in 14:59
linfo2 #:
Vielen Dank, Chris, für all deine Ideen und Veröffentlichungen, definitiv hilfreiches Material. Um diesen Artikel zum Laufen zu bringen, muss ich einige Einstellungen vornehmen, die meiner Umgebung entsprechen, nachdem ich Price Action Analysis Toolkit Development (Part 9) erneut geprüft habe : External Flow - MQL5 Artikel, die vielleicht für andere hilfreich sind

1 Aktualisieren Sie die Skripte, um Ihre Adresse oder den lokalen Host 127.0.0.1 zu verwenden.

2 fügen Sie in tools options web request url die von Ihnen verwendete Adresse hinzu

4 stellen Sie sicher, dass alle Python-Teile installiert sind

matplotlib installieren

pip install pandas

pip install Flask seaborn und Numpty falls nötig

3 Starten Sie die Flask-Anwendung auf dieser Adresse, indem Sie die Python-Datei mit der von Ihnen verwendeten Adresse ausführen

Hallo linfo2
Du hast absolut Recht mit Deinen zusätzlichen Hinweisen. Vielen Dank an dich🔥.
Erstellen eines Keltner-Kanal-Indikators mit nutzerdefinierten Canvas-Grafiken in MQL5 Erstellen eines Keltner-Kanal-Indikators mit nutzerdefinierten Canvas-Grafiken in MQL5
In diesem Artikel bauen wir einen Keltner-Kanal-Indikator mit nutzerdefinierten Canvas-Grafiken in MQL5. Wir erläutern die Integration von gleitenden Durchschnitten, ATR-Berechnungen und verbesserter Chartvisualisierung. Wir behandeln auch die Backtests, um die Leistung des Indikators für praktische Handelseinblicke zu bewerten.
MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 53): Market Facilitation Index MQL5-Assistenten-Techniken, die Sie kennen sollten (Teil 53): Market Facilitation Index
Der Market Facilitation Index ist ein weiterer Bill-Williams-Indikator, der die Effizienz der Preisbewegung in Verbindung mit dem Volumen messen soll. Wie immer betrachten wir die verschiedenen Muster dieses Indikators im Rahmen einer Assistentensignalklasse und präsentieren eine Vielzahl von Testberichten und Analysen zu den verschiedenen Mustern.
Trendvorhersage mit LSTM für Trendfolgestrategien Trendvorhersage mit LSTM für Trendfolgestrategien
Long Short-Term Memory (LSTM) ist eine Art rekurrentes neuronales Netz (RNN), das für die Modellierung sequenzieller Daten entwickelt wurde, indem es langfristige Abhängigkeiten effektiv erfasst und das Problem des verschwindenden Gradienten löst. In diesem Artikel werden wir untersuchen, wie LSTM zur Vorhersage zukünftiger Trends eingesetzt werden kann, um die Leistung von Trendfolgestrategien zu verbessern. Der Artikel behandelt die Einführung von Schlüsselkonzepten und die Motivation hinter der Entwicklung, das Abrufen von Daten aus dem MetaTrader 5, die Verwendung dieser Daten zum Trainieren des Modells in Python, die Integration des maschinellen Lernmodells in MQL5 und die Reflexion der Ergebnisse und zukünftigen Bestrebungen auf der Grundlage von statistischem Backtesting.
Automatisieren von Handelsstrategien in MQL5 (Teil 6): Beherrschen der Erkennung von Auftragsblöcken für den Handel des Smart Money Automatisieren von Handelsstrategien in MQL5 (Teil 6): Beherrschen der Erkennung von Auftragsblöcken für den Handel des Smart Money
In diesem Artikel automatisieren wir das Erkennen von Auftragsblöcken in MQL5 mithilfe der reinen Preisaktionsanalyse. Wir definieren Auftragsblöcke, implementieren ihre Erkennung und integrieren die automatische Handelsausführung. Schließlich führen wir einen Backtest der Strategie durch, um ihre Leistung zu bewerten.