Benutzerdefinierte Symbole in MQL5: Erstellung eines 3D-Bar-Symbols
Moderner Handel erfordert unkonventionelle Ansätze zur Datenanalyse. Traditionelle Charts sind zwar nützlich, zeigen aber oft nicht das vollständige Bild der Marktdynamik. Der Kurs ist nur ein Aspekt, während Handelsvolumen, Volatilität und Zeitmuster tiefere Einblicke in den Markt bieten können.
Die MetaTrader 5-Plattform und die MQL5-Sprache bieten ein leistungsstarkes Werkzeug – benutzerdefinierte Symbole –, das es Tradern ermöglicht, synthetische Instrumente auf Basis beliebiger Daten zu erstellen. In diesem Artikel werden wir uns den Indikator 3DBarCustomSymbol.mq5, der ein benutzerdefiniertes Symbol für 3D-Bars generiert, im Detail ansehen. Diese Bars kombinieren Kurs, Zeit, Volumen und Volatilität zu einem einzigartigen Analyse- und Visualisierungswerkzeug.

3D-Bars sind eine Möglichkeit, Standard-Charts um zusätzliche Dimensionen zu erweitern. Sie ermöglichen es Tradern, nicht nur Kursbewegungen zu sehen, sondern auch Parameter wie Handelsintensität, Marktvolatilität und zyklische Zeitmuster. Dieser Ansatz kann verborgene Muster aufdecken, die bei der Verwendung herkömmlicher Candlestick-Charts unsichtbar bleiben.
Der Indikator 3DBarCustomSymbol zeigt, wie sich die Möglichkeiten von MQL5 nutzen lassen, um ein benutzerdefiniertes Symbol zu erstellen, das in Handelsstrategien integriert oder zur visuellen Analyse verwendet werden kann.
Die Entwicklung der Marktdatenanalyse
Die Marktanalyse hat sich von einfachen Papiercharts zu ausgefeilten Computermethoden und Mikrostrukturstudien (Volumina, Orderflow, Handelsintervalle, Clustervolatilität) entwickelt. Doch die meisten Ansätze blieben fragmentiert.
3D-Bars kombinieren vier Schlüsseldimensionen in einem einzigen Chart:
- Kurs: OHLC-Daten, Geschwindigkeit und Beschleunigung von Bewegungen, Verteilungsstatistiken;
- Volumen: Gesamtvolumen, Verteilung über Kursniveaus, Intensität, Anomalien, Verhältnis aggressiver Käufe zu Verkäufen;
- Zeit: Intraday-Zyklen, Bildungsgeschwindigkeit, zeitliche Korrelationen, saisonale Effekte;
- Volatilität: lokal und global, Clustering, ungewöhnliche Ausschläge, Beziehung zum Volumen.
Dies liefert ein umfassenderes Bild des Marktes und hilft dabei, Muster und Anomalien schnell zu identifizieren. Zusätzlich sind 3D-Bars leichter visuell auszuwerten, was die kognitive Belastung reduziert und die Entscheidungsfindung beschleunigt, insbesondere im Hochfrequenzhandel. Der benutzerdefinierte Indikator lässt sich leicht in MetaTrader 5 für verschiedene Strategien integrieren, vom Scalping bis hin zu langfristigen Strategien.
Mathematische Formalisierung des Konzepts
Eine 3D-Bar kann mathematisch als Vektor in einem mehrdimensionalen Raum beschrieben werden:
B₃D = (P, V, T, σ)
wobei:
- P – Kursvektor (Eröffnungs-, Höchst-, Tiefst-, Schluss- und typischer Kurs)
- V – Volumenvektor (Volumen, Volumenprofil, Volumenbeschleunigung)
- T – Zeitvektor (Zeit_Sinus, Zeit_Cosinus, Zeitbeschleunigung)
- σ – Volatilitätsvektor (lokale Volatilität, globale Volatilität, Volatilitätsänderung)
Jede Komponente enthält sowohl statische (historische) als auch dynamische (Echtzeit-)Elemente.
Indikatorarchitektur
Die Indikatorarchitektur basiert auf dem Prinzip der klaren Aufgabentrennung:
Das Initialisierungsmodul ist verantwortlich für:
- die Überprüfung der Verfügbarkeit des Quellsymbols,
- die Validierung der Eingabeparameter,
- die Initialisierung globaler Variablen,
- das Erstellen der notwendigen Datenstrukturen.
Das Modul zur Symbolerstellung umfasst:
- Funktionen zum Erzeugen eines benutzerdefinierten Symbols,
- Einrichten der Symboleigenschaften,
- Konfigurieren von Handelssitzungen,
- Zuweisen von Metadaten.
Datenverarbeitungsmodul enthält:
- Algorithmen zur Berechnung von Metriken,
- Normalisierungs- und Skalierungsfunktionen,
- statistische Berechnungen,
- Fehlerbehandlung.
Aktualisierungsmodul bietet:
- Überwachung neuer Daten,
- Neuberechnung aktueller Metriken,
- Aktualisierung eines benutzerdefinierten Symbols,
- Optimierung der Leistung.
Detaillierte Analyse der Eingabeparameter
Der Indikator bietet eine flexible Konfiguration durch anpassbare Eingabeparameter. Hier ist ein Beispiel dafür, wie diese im Code definiert werden:
input string SourceSymbol = "EURUSD"; // Source symbol input string CustomSymbolName = "EURUSD_3D"; // Custom symbol name input int LookbackPeriod = 20; // Lookback period input int HistoryDays = 100; // Number of history days input bool CreateWindow = true; // Create a chart window input bool UpdateInRealTime = true; // Update in real time input bool ShowPrice = true; // Show a regular price input double MinSpreadMultiplier = 45; // Spread multiplier input double VolumeBrick = 500; // Volume block size input double ScaleMin = 3.0; // Minimum scale value input double ScaleMax = 9.0; // Maximum scale value
wobei:
- SourceSymbol – zugrunde liegendes Finanzinstrument für die Analyse. Alle in MetaTrader 5 verfügbaren Symbole werden unterstützt, einschließlich Währungspaaren, Aktien, Rohstoffen, Indizes und Kryptowährungen.
- CustomSymbolName – eindeutiger Name für das zu erzeugende benutzerdefinierte Symbol. Es wird empfohlen, beschreibende Namen zu verwenden, die das Wesen der Datentransformation widerspiegeln.
- LookbackPeriod – Größe des gleitenden Fensters zur Berechnung statistischer Metriken. Beeinflusst die Empfindlichkeit des Indikators gegenüber kurzfristigen Änderungen. Kleine Werte (5-10) bieten eine hohe Empfindlichkeit, große Werte (50-100) sorgen für geglättete Signale.
- HistoryDays – Tiefe der historischen Daten für die Initialisierung. Beeinflusst die Ladezeit und die Genauigkeit langfristiger Statistiken. Optimale Werte: 30-365 Tage, abhängig von den Analyse-Zielen.
- MinSpreadMultiplier und VolumeBrick – kritische Parameter, die die Empfindlichkeit des Algorithmus gegenüber Kurs- bzw. Volumenänderungen bestimmen.
- ScaleMin und ScaleMax – Normalisierungsbereich aller Metriken. Der Bereich 3-9 wird aufgrund numerologischer Überlegungen gewählt und verbessert die visuelle Interpretierbarkeit.
Die Funktion OnInit führt die Ersteinrichtung durch. Sie prüft das Vorhandensein des ursprünglichen Symbols, berechnet die Kursblockgröße basierend auf dem Spread, erstellt ein benutzerdefiniertes Symbol und füllt es mit historischen Daten. Hier ist der wichtigste Codeausschnitt:
int OnInit() { if(!SymbolSelect(SourceSymbol, true)) { Print("Error: symbol ", SourceSymbol, " not found!"); return INIT_FAILED; } double spread = SymbolInfoDouble(SourceSymbol, SYMBOL_ASK) - SymbolInfoDouble(SourceSymbol, SYMBOL_BID); double point = SymbolInfoDouble(SourceSymbol, SYMBOL_POINT); minPriceBrick = spread * MinSpreadMultiplier * point; if(!Create3DBarSymbol()) { Print("Error creating custom symbol!"); return INIT_FAILED; } if(!GenerateHistorical3DBars()) { Print("Error generating historical data!"); return INIT_FAILED; } if(CreateWindow) { OpenCustomChart(); } if(UpdateInRealTime) { EventSetTimer(5); } Print("3D bars symbol ", CustomSymbolName, " successfully created!"); return(INIT_SUCCEEDED); }
Die Funktion Create3DBarSymbol konfiguriert Eigenschaften eines benutzerdefinierten Symbols, wie Genauigkeit, Tick-Größe und Notierungswährungen. Sie legt außerdem die Handelssitzungen für einen 24/7-Handelsbetrieb fest. Beispiel:
bool Create3DBarSymbol() { if(SymbolSelect(CustomSymbolName, true)) { CustomRatesDelete(CustomSymbolName, 0, 0); Print("Symbol ", CustomSymbolName, " already exists. History deleted."); return true; } int digits = (int)SymbolInfoInteger(SourceSymbol, SYMBOL_DIGITS); double point = SymbolInfoDouble(SourceSymbol, SYMBOL_POINT); double tickSize = SymbolInfoDouble(SourceSymbol, SYMBOL_TRADE_TICK_SIZE); double contractSize = SymbolInfoDouble(SourceSymbol, SYMBOL_TRADE_CONTRACT_SIZE); string baseCurrency = SymbolInfoString(SourceSymbol, SYMBOL_CURRENCY_BASE); string profitCurrency = SymbolInfoString(SourceSymbol, SYMBOL_CURRENCY_PROFIT); if(!CustomSymbolCreate(CustomSymbolName)) { Print("Error creating custom symbol: ", GetLastError()); return false; } CustomSymbolSetInteger(CustomSymbolName, SYMBOL_DIGITS, digits); CustomSymbolSetDouble(CustomSymbolName, SYMBOL_POINT, point); CustomSymbolSetDouble(CustomSymbolName, SYMBOL_TRADE_TICK_SIZE, tickSize); CustomSymbolSetDouble(CustomSymbolName, SYMBOL_TRADE_CONTRACT_SIZE, contractSize); CustomSymbolSetString(CustomSymbolName, SYMBOL_CURRENCY_BASE, baseCurrency); CustomSymbolSetString(CustomSymbolName, SYMBOL_CURRENCY_PROFIT, profitCurrency); string description = "3D bars (price, time, volume, volatility). Lookback: " + IntegerToString(LookbackPeriod); CustomSymbolSetString(CustomSymbolName, SYMBOL_DESCRIPTION, description); for(int day=0; day<7; day++) { datetime start_time = 0; datetime end_time = 24*60*60-1; CustomSymbolSetSessionQuote(CustomSymbolName, (ENUM_DAY_OF_WEEK)day, 0, start_time, end_time); CustomSymbolSetSessionTrade(CustomSymbolName, (ENUM_DAY_OF_WEEK)day, 0, start_time, end_time); } return true; }
Die Funktion GenerateHistorical3DBars verarbeitet historische Daten und berechnet Metriken wie Kursrenditen, Kursbeschleunigung, Volumenänderungen und Volatilität. Sie verwendet den M15-Zeitrahmen, um Basisdaten zu erhalten. Hier ist ein Teil des Codes:
bool GenerateHistorical3DBars() { datetime endTime = TimeCurrent(); datetime startTime = endTime - HistoryDays * 24 * 60 * 60; MqlRates rates[]; int copiedRates = CopyRates(SourceSymbol, PERIOD_M15, startTime, endTime, rates); if(copiedRates <= 0) { Print("Error copying historical data: ", GetLastError()); return false; } MqlRates threeDBars[]; ArrayResize(threeDBars, copiedRates); int validCount = 0; double typicalPrices[], priceReturns[], priceAccelerations[], volumeChanges[], volatilities[]; ArrayResize(typicalPrices, copiedRates); ArrayResize(priceReturns, copiedRates); ArrayResize(priceAccelerations, copiedRates); ArrayResize(volumeChanges, copiedRates); ArrayResize(volatilities, copiedRates); for(int i = 0; i < copiedRates; i++) { typicalPrices[i] = (rates[i].high + rates[i].low + rates[i].close) / 3.0; if(i > 0) { priceReturns[i] = (typicalPrices[i] - typicalPrices[i-1]) / typicalPrices[i-1]; priceAccelerations[i] = i > 1 ? priceReturns[i] - priceReturns[i-1] : 0; } else { priceReturns[i] = 0; priceAccelerations[i] = 0; } volumeChanges[i] = i > 0 ? (rates[i].tick_volume - rates[i-1].tick_volume) / (rates[i-1].tick_volume + 1e-10) : 0; if(i >= LookbackPeriod) { double returns[]; ArrayResize(returns, LookbackPeriod); for(int j = 0; j < LookbackPeriod; j++) returns[j] = priceReturns[i - LookbackPeriod + j + 1]; volatilities[i] = CalculateStdDev(returns); } else { volatilities[i] = 0; } } // Next comes filling the 3D bars and adding them to the history }
Die Funktion UpdateCurrent3DBar stellt sicher, dass die aktuelle Bar alle 5 Sekunden aktualisiert wird, wenn der Parameter UpdateInRealTime aktiviert ist. Sie berechnet dieselben Metriken für die aktuelle Bar und aktualisiert das benutzerdefinierte Symbol.
double ScaleValue(double value, double &values[], int start, int end) { double minVal = values[start]; double maxVal = values[start]; for(int i = start; i <= end; i++) { if(values[i] < minVal) minVal = values[i]; if(values[i] > maxVal) maxVal = values[i]; } if(maxVal == minVal) return ScaleMin; return ScaleMin + (ScaleMax - ScaleMin) * (value - minVal) / (maxVal - minVal); }
Die Funktion OpenCustomChart öffnet den Chart eines benutzerdefinierten Symbols, das je nach Parameter ShowPrice im Bar- oder Linienformat angezeigt werden kann.
Praktische Anwendung
Der Indikator ermöglicht die Analyse der Volatilität, die Identifizierung von Anomalien bei Volumen oder Kursbeschleunigung sowie die Integration eines benutzerdefinierten Symbols in Handelssysteme.
Um zu beginnen, kompilieren Sie den Code im MetaEditor und fügen Sie den Indikator einem Chart hinzu, zum Beispiel EURUSD M15. Legen Sie Parameter wie CustomSymbolName und LookbackPeriod fest, und der Indikator erstellt ein benutzerdefiniertes Symbol, das in einem separaten Fenster geöffnet werden kann. Wenn der Parameter ShowPrice aktiviert ist, zeigt das Chart normale Kursdaten mit eingeblendeten Metriken an; andernfalls zeigt es nur synthetische 3D-Bars.

Hier ist ein typisches Chart:

Trader können 3D-Bars verwenden, um Perioden erhöhter Volatilität zu identifizieren, die Nachrichtenereignisse signalisieren, oder um Anomalien wie Volumenspitzen zu erkennen. Das benutzerdefinierte Symbol kann mit Indikatoren wie gleitenden Durchschnitten kombiniert oder in Expert Advisors für den automatisierten Handel verwendet werden.
Der Indikator kann durch Hinzufügen von Unterstützung für andere Zeitrahmen, wie H1 oder D1, verbessert werden, um größere Bewegungen zu analysieren. Die Einbeziehung zusätzlicher Metriken, wie die Korrelation mit anderen Vermögenswerten, kann den Indikator aussagekräftiger machen. Um die Leistung zu optimieren, begrenzen Sie HistoryDays, insbesondere auf PCs mit geringer Leistung. Die Visualisierung kann durch das Hinzufügen von Indikatoren, wie Bollinger-Bändern, oder Filtern zur Hervorhebung von Anomalien, wie Bars mit extremer Volatilität, verbessert werden.
Das Generieren einer großen Menge an historischen Daten kann ressourcenintensiv sein, beginnen Sie daher mit einer kleinen Anzahl an HistoryDays. Der M15-Zeitrahmen ist für die meisten Instrumente geeignet, aber für Vermögenswerte mit geringer Liquidität ist es besser, längere Zeiträume zu verwenden. Testen Sie den Indikator vor dem Einsatz im Live-Handel auf einem Demokonto, um sicherzustellen, dass er korrekt funktioniert. Die Interpretation von 3D-Bars erfordert Erfahrung, studieren Sie daher deren Verhalten anhand historischer Daten.
Schlussfolgerung
Der 3DBarCustomSymbol-Indikator demonstriert die Leistungsfähigkeit benutzerdefinierter Symbole in MQL5. Durch die Kombination von Kurs, Zeit, Volumen und Volatilität schafft er ein einzigartiges Werkzeug für die Marktanalyse. 3D-Bars eignen sich für die visuelle Analyse, die Erstellung von Handelssystemen und die Identifizierung verborgener Muster. Passen Sie den Indikator an Ihre Bedürfnisse an, experimentieren Sie mit den Parametern und testen Sie ihn auf einem Demokonto. MQL5 eröffnet grenzenlose Möglichkeiten für Innovationen im Handel, und 3DBarCustomSymbol ist ein hervorragendes Beispiel dafür, wie diese Funktionen genutzt werden können, um leistungsstarke Analysewerkzeuge zu erstellen.
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/18681
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.
Neuronale Netze im Trading: Skill-Hierarchie für das Verhalten adaptiver Agenten (letzter Teil)
Exchange-Market-Algorithmus (EMA)
Extremaloptimierung (EO)
Neuronale Netze im Trading: Hierarchische Entdeckung von Skills für adaptives Agentenverhalten (HiSSD)
- 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.