Tectonic Structure Engine
- Bibliotheken
-
Syarief Azman Bin Rosli
Hallo und herzlich willkommen auf meinem offiziellen MQL5-Profil!
Ich bin Syarief Azman Bin Rosli, Entwickler algorithmischer Handelssysteme und Software-Ingenieur mit über zehn Jahren Erfahrung in der Entwicklung robuster automatisierter Handelslösungen für MetaTrader 5 und MetaTrader 4. - Version: 1.0
- Aktivierungen: 5
Eine MQL4-Bibliothek, die die Marktstruktur für Ihren EA, Indikator oder Ihr Skript abbildet: bestätigte Swings mit den Labels HH, HL, LH, LL, EQH und EQL, Strukturbruch (BOS), Charakterwechsel (CHoCH), Liquiditäts-Sweeps, Order Blocks und Fair Value Gaps mit Füllverfolgung sowie die Position des Preises in der Handelsspanne. Sie liest nur geschlossene Bars und zeichnet nie neu. Sie handelt nicht, zeichnet nicht und sendet keine Alarme. Sie erhalten die kompilierte Tectonic_Structure_Engine.ex4; diese Seite ist die vollständige API-Referenz.
Schnellstart
- Kopieren Sie Tectonic_Structure_Engine.ex4 nach MQL4/Libraries (Datei > Dateiordner öffnen).
- Fügen Sie den #import-Block unten in Ihr Programm ein.
- In OnInit: h = TSE_Create("", 0, 3, 1000); optional TSE_Configure.
- Rufen Sie TSE_Update(h) in OnTick oder OnCalculate auf. Ohne neuen Bar liefert es 0 in etwa einer Mikrosekunde.
- Lesen Sie TSE_Trend, TSE_GetEvent, TSE_NearestZone und die übrigen; TSE_Release(h) in OnDeinit.
- Prüfen: Starten Sie das Beispiel unten im Strategietester (beliebiges Symbol, M15). Das Journal listet jedes Ereignis; das erste Update listet die gesamte Historie.
Import-Deklaration (kopierfertig)
#import "Tectonic_Structure_Engine.ex4" int TSE_Create(string symbol, int timeframe, int strength, int history_bars); bool TSE_Configure(int handle, int break_mode, double min_swing_atr, double equal_tol_atr, double fvg_min_atr, int atr_period); void TSE_Release(int handle); int TSE_Update(int handle); int TSE_Trend(int handle); int TSE_SwingCount(int handle); bool TSE_GetSwing(int handle, int index, int &side, double &price, datetime &time, int &label); int TSE_EventCount(int handle); bool TSE_GetEvent(int handle, int index, int &type, double &level, datetime &swing_time, datetime &break_time); bool TSE_GetLevels(int handle, double &swing_high, double &swing_low, bool &high_broken, bool &low_broken); double TSE_RangePosition(int handle, double price); int TSE_ZoneCount(int handle); bool TSE_GetZone(int handle, int index, int &kind, int &dir, double &top, double &bottom, datetime &time, int &state, double &fill); int TSE_NearestZone(int handle, int kind, int dir, double price, double &top, double &bottom); int TSE_GetStats(int handle, int &stats[]); int TSE_LastError(); string TSE_ErrorText(int code); string TSE_LabelText(int label); string TSE_EventText(int type); string TSE_ZoneText(int kind, int dir); string TSE_StateText(int state); #import
Codes
- Swing-Labels: 1 HH, 2 LH, 3 EQH (Hochs); -1 LL, -2 HL, -3 EQL (Tiefs); 0 FIRST (kein früherer Swing auf dieser Seite).
- Ereignistypen: 1 BOS UP, -1 BOS DOWN, 2 CHOCH UP, -2 CHOCH DOWN, 3 SWEEP HIGH, -3 SWEEP LOW.
- Zonenart (kind): 1 Fair Value Gap, 2 Order Block. dir: 1 bullisch (Unterstützung), -1 bärisch (Widerstand). Texte: BULL FVG, BEAR FVG, BULL OB, BEAR OB.
- Zonenstatus: 0 FRESH (unberührt), 1 TESTED (Preis eingedrungen), 2 FILLED (FVG durchlaufen), 3 BROKEN (OB durchschlossen).
- Fehler: 0 OK, -1 BAD HANDLE, -2 BAD PARAMETERS, -3 NO HISTORY, -4 NO FREE SLOT, -5 BAD INDEX. Die Textfunktionen liefern UNKNOWN für andere Codes.
So wird jeder geschlossene Bar gelesen
- Zonen: Ein Tief in einer bullischen Zone (ein Hoch in einer bärischen) setzt TESTED und erhöht fill, das tiefste Eindringen in % der Zonenhöhe. Ein FVG wird FILLED, wenn der Preis die ferne Kante erreicht; ein OB wird BROKEN bei einem Schlusskurs jenseits der fernen Kante (fill kann 100% erreichen, während der OB aktiv bleibt).
- Swings: Der Bar strength Bars zurück ist ein Swing-Hoch, wenn sein Hoch über den strength Bars davor und nicht unter den strength Bars danach liegt (Tiefs gespiegelt). Ein Swing wird strength Bars später gemeldet und verschiebt sich nie. Mit min_swing_atr über 0 muss das Hoch minus das tiefste Tief der 2 x strength + 1 Bars mindestens min_swing_atr x ATR betragen. Label gegenüber dem vorigen Swing derselben Seite: innerhalb von equal_tol_atr x ATR ist es EQH oder EQL, sonst HH oder LH, LL oder HL. Das jüngste Swing-Hoch und Swing-Tief sind die Bruchniveaus.
- Brüche: break_mode 0 verlangt einen Schlusskurs jenseits des Niveaus, 1 einen Docht. Der Bruch des Swing-Hochs ergibt CHOCH UP, wenn der Trend -1 war, sonst BOS UP; der Trend wird 1 und das Niveau ist verbraucht. Tiefs gespiegelt. Im Schlusskurs-Modus ist ein Docht jenseits mit Schluss zurück innerhalb ein SWEEP, einmal pro Niveau.
- Order Block: Bei jedem BOS oder CHoCH die letzte gegenläufige Kerze (bärisch bei einem Aufwärtsbruch) am Extrem des Schenkels zwischen Swing und Bruch oder bis zu 10 Bars davor; die Zone ist ihre Hoch-Tief-Spanne.
- Fair Value Gap: Tief der dritten Kerze über dem Hoch der ersten (bullisch) oder Hoch der dritten unter dem Tief der ersten (bärisch), mindestens fvg_min_atr x ATR hoch.
Der ATR ist der einfache Durchschnitt der True Range über atr_period Bars.
API-Referenz
TSE_Create
symbol: "" oder NULL = Chartsymbol; muss existieren. timeframe: 0 = Chartperiode, sonst PERIOD_M1 bis PERIOD_MN1. strength: 1-50. history_bars: 100-20000, beim ersten Update aufgebaut. Liefert ein Handle 0-31 oder -1 mit BAD PARAMETERS oder NO FREE SLOT. Standardwerte: break_mode 0, min_swing_atr 0, equal_tol_atr 0.10, fvg_min_atr 0.25, atr_period 14.
TSE_Configure
break_mode 0-1, min_swing_atr 0-10 (0 = aus), equal_tol_atr 0-5, fvg_min_atr 0-10, atr_period 1-500. Leert das Handle; das nächste TSE_Update baut neu auf. Jeder Wert außerhalb des Bereichs: false, BAD PARAMETERS, nichts geändert.
TSE_Release
Gibt das Handle zur Wiederverwendung frei. Rufen Sie es in OnDeinit auf.
TSE_Update
Liest die noch nicht gesehenen geschlossenen Bars; der erste Aufruf baut history_bars auf. Liefert die Zahl neuer Ereignisse (Indizes 0 bis n-1 von TSE_GetEvent), 0 ohne neuen Bar oder -1: BAD HANDLE oder NO HISTORY, solange weniger als 2 x strength + 4 Bars geladen sind (beim nächsten Tick erneut aufrufen). Verschwindet der zuletzt gelesene Bar (Historie neu geladen), baut sich das Handle selbst neu auf.
int n = TSE_Update(h); if(n > 0) Print(n, " new events");
TSE_Trend
1 nach einem Aufwärtsbruch, -1 nach einem Abwärtsbruch, 0 vor dem ersten Bruch oder bei ungültigem Handle.
TSE_SwingCount und TSE_GetSwing
Gespeicherte Swings, der jüngste bei Index 0: side (1 Hoch, -1 Tief), price, Zeit des Swing-Bars, label. Die Anzahl ist -1 bei ungültigem Handle; außerhalb von 0 bis Anzahl-1 liefert TSE_GetSwing false mit BAD INDEX.
TSE_EventCount und TSE_GetEvent
Gespeicherte Ereignisse, das jüngste bei Index 0: type, level (der Swing-Preis), swing_time, break_time (der Bar, der es gebrochen oder gesweept hat).
TSE_GetLevels
Das jüngste Swing-Hoch und Swing-Tief (0.0, falls noch keines) und ob jedes bereits gebrochen ist. Ein intaktes Niveau ist der nächste Auslöser für BOS oder CHoCH.
TSE_RangePosition
Wo der Preis zwischen diesen beiden Niveaus liegt: 0 = Swing-Tief, 50 = Gleichgewicht, 100 = Swing-Hoch, unter 0 oder über 100 außerhalb. price 0 = Bid des Handle-Symbols. EMPTY_VALUE, wenn ein Niveau fehlt oder das Hoch nicht über dem Tief liegt. Die Demo zeigt DISCOUNT unter 45 und PREMIUM über 55.
TSE_ZoneCount und TSE_GetZone
Gespeicherte Zonen aller Zustände, die jüngste bei Index 0: kind, dir, top, bottom, time (FVG: mittlere Kerze; OB: die Kerze selbst), state, fill 0-100.
TSE_NearestZone
Die dem Preis nächste FRESH- oder TESTED-Zone (0 = Bid); Abstand 0 innerhalb einer Zone, bei Gleichstand gewinnt die jüngere. kind: 0 alle, 1 FVG, 2 OB. dir: 0 alle, 1, -1. Liefert ihren Index für TSE_GetZone und füllt top und bottom; -1, wenn keine existiert (Fehler OK), oder BAD PARAMETERS.
double top, bottom; int z = TSE_NearestZone(h, 2, 1, 0, top, bottom); // nearest bullish order block
TSE_GetStats
Übergeben Sie ein dynamisches int-Array; es wird auf 12 vergrößert und 12 wird geliefert: 0 gelesene Bars, 1 Swing-Hochs, 2 Swing-Tiefs, 3 BOS UP, 4 BOS DOWN, 5 CHOCH UP, 6 CHOCH DOWN, 7 SWEEP HIGH, 8 SWEEP LOW, 9 FVGs, 10 OBs, 11 aktuell aktive Zonen. Zählungen seit dem letzten Aufbau.
TSE_LastError und die Textfunktionen
TSE_LastError: Code des letzten Aufrufs. TSE_ErrorText, TSE_LabelText, TSE_EventText, TSE_ZoneText(kind, dir) und TSE_StateText liefern die unter Codes genannten Zeichenketten.
Funktionierendes Integrationsbeispiel
#import "Tectonic_Structure_Engine.ex4"
int TSE_Create(string symbol, int timeframe, int strength, int history_bars);
void TSE_Release(int handle);
int TSE_Update(int handle);
int TSE_Trend(int handle);
bool TSE_GetEvent(int handle, int index, int &type, double &level, datetime &swing_time, datetime &break_time);
int TSE_NearestZone(int handle, int kind, int dir, double price, double &top, double &bottom);
string TSE_EventText(int type);
#import
int h = -1, htf = -1;
int OnInit()
{
h = TSE_Create("", 0, 3, 1000); // chart timeframe
htf = TSE_Create("", PERIOD_H4, 3, 1000); // higher-timeframe bias
return (h >= 0 && htf >= 0) ? INIT_SUCCEEDED : INIT_FAILED;
}
void OnDeinit(const int reason) { TSE_Release(h); TSE_Release(htf); }
void OnTick()
{
TSE_Update(htf);
int n = TSE_Update(h);
for(int i = n - 1; i >= 0; i--)
{
int type; double level; datetime st, bt;
if(TSE_GetEvent(h, i, type, level, st, bt))
Print(TSE_EventText(type), " at ", level, ", H4 trend ", TSE_Trend(htf));
}
double top, bottom;
if(n > 0 && TSE_NearestZone(h, 2, 1, 0, top, bottom) >= 0)
Print("nearest bullish OB ", bottom, " - ", top);
} Typische Einstellungen
- Interne und externe Struktur: zwei Handles auf einem Chart, strength 2 und 8.
- Multi-Timeframe-Bias: Chart-Handle für Einstiege, H4- oder D1-Handle als TSE_Trend-Filter.
- Dochtbrüche: TSE_Configure(h, 1, 0, 0.10, 0.25, 14); in diesem Modus keine Sweeps.
- Weniger, größere Zonen und Swings: fvg_min_atr 0.5-1.0, min_swing_atr 1.0.
Architektur und Hinweise
- Eine Engine pro Handle, bis zu 32 Handles pro Programm; jedes importierende Programm hat eigene. Die Daten liegen im Speicher und werden nach einem Neustart aus der Historie neu aufgebaut.
- Nur geschlossene Bars, jeder einmal gelesen, vom ältesten zum jüngsten: nichts wird neu gezeichnet und Bar 0 wird nie verwendet.
- Der Aufbau von 20.000 Bars dauerte im MT4-Strategietester etwa 80 ms.
- Andere Symbole oder Zeitrahmen werden mit iHigh, iLow, iOpen, iClose und iTime gelesen; NO HISTORY ist normal, solange das Terminal sie lädt. Verwenden Sie im Strategietester das getestete Symbol (beliebiger Zeitrahmen).
- Pro Handle: bis zu 2000 Swings, 2000 Ereignisse und 500 Zonen; wenn voll, werden die ältesten 10% verworfen.
- MetaTrader 4 Build 600 oder neuer. Sicher im Strategietester und bei der Optimierung. Keine DLLs, Dateien, globalen Variablen, Chartobjekte, Timer, Alarme oder Trades.
Risikohinweis
Die Bibliothek beschreibt die Preisstruktur. Sie sagt keine Preise voraus und garantiert keine Gewinne. Testen Sie jede darauf aufbauende Strategie zuerst auf einem Demokonto.
