English Русский 中文 Español Português
preview
Benutzerdefinierte Symbole in MQL5: Erstellung eines 3D-Bar-Symbols

Benutzerdefinierte Symbole in MQL5: Erstellung eines 3D-Bar-Symbols

MetaTrader 5Indikatoren |
26 1
Yevgeniy Koshtenko
Yevgeniy Koshtenko

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

Beigefügte Dateien |
3D_Bars_EA.mq5 (39.53 KB)
Letzte Kommentare | Zur Diskussion im Händlerforum (1)
Andy An
Andy An | 17 Juli 2025 in 08:34
Online funktioniert der Indikator nicht.
Neuronale Netze im Trading: Skill-Hierarchie für das Verhalten adaptiver Agenten (letzter Teil) Neuronale Netze im Trading: Skill-Hierarchie für das Verhalten adaptiver Agenten (letzter Teil)
Der Artikel erörtert die praktische Implementierung des HiSSD-Frameworks bei algorithmischen Handelsaufgaben. Er erklärt, wie die Skill-Hierarchie und die adaptive Architektur genutzt werden können, um stabile Handelsstrategien aufzubauen.
Exchange-Market-Algorithmus (EMA) Exchange-Market-Algorithmus (EMA)
Der Artikel präsentiert eine detaillierte Analyse des Exchange Market Algorithm (EMA), der vom Verhalten von Börsenhändlern inspiriert ist. Der Algorithmus simuliert den Aktienhandel, bei dem Marktteilnehmer mit unterschiedlichem Erfolg verschiedene Strategien anwenden, um ihre Gewinne zu maximieren.
Extremaloptimierung (EO) Extremaloptimierung (EO)
Der Artikel diskutiert den Algorithmus der Extremaloptimierung (EO), eine Optimierungsmethode, die vom Bak-Sneppen-Modell der selbstorganisierten Kritikalität inspiriert ist, bei dem Evolution durch die Eliminierung der schlechtesten Komponenten des Systems erfolgt. Die modifizierte Populationsversion des Algorithmus zeigt eine Abkehr von theoretischen Prinzipien zugunsten praktischer Effizienz, was zur Schaffung leistungsfähiger Optimierungswerkzeuge führt.
Neuronale Netze im Trading: Hierarchische Entdeckung von Skills für adaptives Agentenverhalten (HiSSD) Neuronale Netze im Trading: Hierarchische Entdeckung von Skills für adaptives Agentenverhalten (HiSSD)
In diesem Artikel untersuchen wir das HiSSD-Framework, das hierarchisches Lernen und Multi-Agenten-Ansätze kombiniert, um adaptive Systeme zu schaffen. Wir untersuchen im Detail, wie diese innovative Methodik dabei hilft, verborgene Muster in Finanzmärkten aufzudecken und Handelsstrategien in dezentralen Umgebungen zu optimieren.