
Entwicklung eines Toolkit zur Analyse von Preisaktionen (Teil 12): External Flow (III) TrendMap
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.
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.
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:
- Berechnung von Fibonacci-Retracement-Levels anhand von Swing-Hochs und -Tiefs
- Bestimmung des VWAP (volumengewichteter Durchschnittspreis) zur Trendbestätigung
- Senden der Marktdaten an Python, das eine tiefergehende Analyse durchführt und ein Kauf-/Verkaufssignal liefert.
- 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
//+------------------------------------------------------------------+ //| 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
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
Bibliothek | Zweck | Wie es in unserem System verwendet wird |
---|---|---|
datetime | Zeitmanagement | Wird 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. |
json | Datenaustausch | Da 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. |
logging | Fehlersuche und Überwachung | Verfolgt 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. |
threading | Aufgaben im Hintergrund ausführen | Wenn 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. |
numpy | Numerische Berechnungen | Wir 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. |
pandas | Datenverarbeitung | Da 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_ta | Technische Indikatoren | Obwohl es kein Kernbestandteil unseres derzeitigen Systems ist, ermöglicht es zusätzliche technische Analysewerkzeuge, falls diese in Zukunft benötigt werden. |
matplotlib.pyplot | Charting & Visualisierung | Das Rückgrat unserer visuellen Analyse. Wir verwenden es, um Kursbewegungen, VWAP-Levels und Fibonacci-Retracement-Zonen darzustellen. |
seanborn | Verbessertes Chart-Styling | Es 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__')
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.
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.
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.
Datum | Name des Werkzeugs | Beschreibung | Version | Aktualisierungen | Hinweis |
---|---|---|---|---|---|
01/10/24 | Chart Projector | Skript zur Überlagerung der Kursentwicklung des Vortages mit Geistereffekt. | 1.0 | Erste Veröffentlichung | Erstes Werkzeug in Lynnchris Tool Chest |
18/11/24 | Analytical Comment | Er liefert Informationen zum Vortag in Tabellenform und nimmt die zukünftige Marktentwicklung vorweg. | 1.0 | Erste Veröffentlichung | Zweites Werkzeug in Lynnchris Tool Chest |
27/11/24 | Analytics Master | Regelmäßige Aktualisierung der Marktmetriken alle zwei Stunden. | 1.01 | Zweite Veröffentlichung | Drittes Werkzeug in Lynnchris Tool Chest |
02/12/24 | Analytics Forecaster | Regelmäßige Aktualisierung der Marktmetriken alle zwei Stunden mit Telegram-Integration. | 1.1 | Dritte Auflage | Werkzeug Nummer 4 |
09/12/24 | Volatility Navigator | Der EA analysiert die Marktbedingungen anhand der Indikatoren Bollinger Bands, RSI und ATR. | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 5 |
19/12/24 | Mean Reversion Signal Reaper | Analysiert den Markt anhand der Strategie „Umkehr zur Mitte“ und liefert Signale. | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 6 |
9/01/25 | Signal Pulse | Multiple timeframe analyzer | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 7 |
17/01/25 | Metrics Board | Bedienfeld mit Taste für die Analyse. | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 8 |
21/01/25 | External Flow | Analytik durch externe Bibliotheken. | 1.0 | Erste Veröffentlichung | Werkzeug Nummer 9 |
27/01/25 | VWAP | Volumen 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
Warnung: Alle Rechte sind von MetaQuotes Ltd. vorbehalten. Kopieren oder Vervielfältigen untersagt.
Dieser Artikel wurde von einem Nutzer der Website verfasst und gibt dessen persönliche Meinung wieder. MetaQuotes Ltd übernimmt keine Verantwortung für die Richtigkeit der dargestellten Informationen oder für Folgen, die sich aus der Anwendung der beschriebenen Lösungen, Strategien oder Empfehlungen ergeben.





- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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
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