Tectonic Structure Engine
- librerie
-
Syarief Azman Bin Rosli
Ciao e benvenuto sul mio profilo ufficiale MQL5!
Sono Syarief Azman Bin Rosli, sviluppatore di sistemi di trading algoritmico e ingegnere software quantitativo con oltre dieci anni di esperienza nello sviluppo di soluzioni automatizzate per MetaTrader 5 e MetaTrader 4. - Versione: 1.0
- Attivazioni: 5
Libreria MQL4 che mappa la struttura di mercato per il vostro EA, indicatore o script: swing confermati con etichette HH, HL, LH, LL, EQH ed EQL, rottura di struttura (BOS), cambio di carattere (CHoCH), sweep di liquidità, order block e fair value gap con monitoraggio del riempimento, e la posizione del prezzo nel range operativo. Legge solo barre chiuse e non ridisegna mai. Non apre operazioni, non disegna e non invia avvisi. Ricevete il file compilato Tectonic_Structure_Engine.ex4; questa pagina è il riferimento completo dell'API.
Avvio rapido
- Copiate Tectonic_Structure_Engine.ex4 in MQL4/Libraries (File > Apri cartella dati).
- Incollate il blocco #import qui sotto nel vostro programma.
- In OnInit: h = TSE_Create("", 0, 3, 1000); facoltativamente TSE_Configure.
- Chiamate TSE_Update(h) in OnTick o OnCalculate. Senza una nuova barra restituisce 0 in circa un microsecondo.
- Leggete TSE_Trend, TSE_GetEvent, TSE_NearestZone e le altre; TSE_Release(h) in OnDeinit.
- Verifica: eseguite l'esempio qui sotto nello Strategy Tester (qualsiasi simbolo, M15). Il diario elenca ogni evento; il primo aggiornamento elenca tutto lo storico.
Dichiarazione di import (pronta da copiare)
#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
Codici
- Etichette swing: 1 HH, 2 LH, 3 EQH (massimi); -1 LL, -2 HL, -3 EQL (minimi); 0 FIRST (nessuno swing precedente su quel lato).
- Tipi di evento: 1 BOS UP, -1 BOS DOWN, 2 CHOCH UP, -2 CHOCH DOWN, 3 SWEEP HIGH, -3 SWEEP LOW.
- Tipo di zona (kind): 1 fair value gap, 2 order block. dir: 1 rialzista (supporto), -1 ribassista (resistenza). Testi: BULL FVG, BEAR FVG, BULL OB, BEAR OB.
- Stato della zona: 0 FRESH (intatta), 1 TESTED (il prezzo è entrato), 2 FILLED (FVG attraversato), 3 BROKEN (OB chiuso oltre).
- Errori: 0 OK, -1 BAD HANDLE, -2 BAD PARAMETERS, -3 NO HISTORY, -4 NO FREE SLOT, -5 BAD INDEX. Le funzioni di testo restituiscono UNKNOWN per altri codici.
Come viene letta ogni barra chiusa
- Zone: un minimo dentro una zona rialzista (un massimo dentro una ribassista) imposta TESTED e aumenta fill, la penetrazione più profonda in % dell'altezza della zona. Un FVG diventa FILLED quando il prezzo raggiunge il bordo opposto; un OB diventa BROKEN con una chiusura oltre il bordo opposto (fill può arrivare al 100% mentre l'OB resta attivo).
- Swing: la barra strength barre indietro è uno swing alto se il suo massimo supera le strength barre precedenti e non è inferiore alle strength barre successive (minimi speculari). Uno swing viene segnalato con strength barre di ritardo e non si sposta mai. Con min_swing_atr maggiore di 0, il massimo meno il minimo più basso delle 2 x strength + 1 barre deve essere almeno min_swing_atr x ATR. Etichetta rispetto allo swing precedente dello stesso lato: entro equal_tol_atr x ATR è EQH o EQL, altrimenti HH o LH, LL o HL. Lo swing alto e lo swing basso più recenti sono i livelli di rottura.
- Rotture: break_mode 0 richiede una chiusura oltre il livello, 1 uno stoppino. Rompere lo swing alto dà CHOCH UP se il trend era -1, altrimenti BOS UP; il trend diventa 1 e il livello è consumato. Minimi speculari. In modalità chiusura, uno stoppino oltre con chiusura rientrata è uno SWEEP, una volta per livello.
- Order block: a ogni BOS o CHoCH, l'ultima candela opposta (ribassista per una rottura al rialzo) all'estremo della gamba tra swing e rottura o fino a 10 barre prima; la zona è il suo range massimo-minimo.
- Fair value gap: minimo della terza candela sopra il massimo della prima (rialzista), oppure massimo della terza sotto il minimo della prima (ribassista), alto almeno fvg_min_atr x ATR.
L'ATR è la media semplice del true range su atr_period barre.
Riferimento API
TSE_Create
symbol: "" o NULL = simbolo del grafico; deve esistere. timeframe: 0 = periodo del grafico, altrimenti da PERIOD_M1 a PERIOD_MN1. strength: 1-50. history_bars: 100-20000, costruite al primo aggiornamento. Restituisce un handle 0-31, oppure -1 con BAD PARAMETERS o NO FREE SLOT. Predefiniti: 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 = disattivato), equal_tol_atr 0-5, fvg_min_atr 0-10, atr_period 1-500. Svuota l'handle; il prossimo TSE_Update lo ricostruisce. Qualsiasi valore fuori intervallo: false, BAD PARAMETERS, nulla cambia.
TSE_Release
Libera l'handle per il riutilizzo. Chiamatela in OnDeinit.
TSE_Update
Legge le barre chiuse non ancora viste; la prima chiamata costruisce history_bars. Restituisce il numero di nuovi eventi (indici da 0 a n-1 di TSE_GetEvent), 0 senza nuova barra, oppure -1: BAD HANDLE, o NO HISTORY finché sono caricate meno di 2 x strength + 4 barre (richiamate al tick successivo). Se l'ultima barra letta scompare (storico ricaricato), l'handle si ricostruisce da solo.
int n = TSE_Update(h); if(n > 0) Print(n, " new events");
TSE_Trend
1 dopo una rottura al rialzo, -1 dopo una rottura al ribasso, 0 prima della prima rottura o con un handle non valido.
TSE_SwingCount e TSE_GetSwing
Swing memorizzati, il più recente all'indice 0: side (1 massimo, -1 minimo), price, orario della barra dello swing, label. Il conteggio è -1 con un handle non valido; fuori da 0 a conteggio-1, TSE_GetSwing restituisce false con BAD INDEX.
TSE_EventCount e TSE_GetEvent
Eventi memorizzati, il più recente all'indice 0: type, level (il prezzo dello swing), swing_time, break_time (la barra che lo ha rotto o spazzato).
TSE_GetLevels
Lo swing alto e lo swing basso più recenti (0.0 se non ancora presenti) e se ciascuno è già rotto. Un livello intatto è il prossimo innesco di BOS o CHoCH.
TSE_RangePosition
Dove si trova il prezzo tra questi due livelli: 0 = swing basso, 50 = equilibrio, 100 = swing alto, sotto 0 o sopra 100 fuori dal range. price 0 = Bid del simbolo dell'handle. EMPTY_VALUE se manca un livello o se l'alto non è sopra il basso. La demo mostra DISCOUNT sotto 45 e PREMIUM sopra 55.
TSE_ZoneCount e TSE_GetZone
Zone memorizzate di ogni stato, la più recente all'indice 0: kind, dir, top, bottom, time (FVG: candela centrale; OB: la candela stessa), state, fill 0-100.
TSE_NearestZone
Zona FRESH o TESTED più vicina al prezzo (0 = Bid); distanza 0 dentro una zona, a parità vince la zona più recente. kind: 0 qualsiasi, 1 FVG, 2 OB. dir: 0 qualsiasi, 1, -1. Restituisce il suo indice per TSE_GetZone e riempie top e bottom; -1 se nessuna (errore OK) o BAD PARAMETERS.
double top, bottom; int z = TSE_NearestZone(h, 2, 1, 0, top, bottom); // nearest bullish order block
TSE_GetStats
Passate un array int dinamico; viene ridimensionato a 12 e viene restituito 12: 0 barre lette, 1 swing alti, 2 swing bassi, 3 BOS UP, 4 BOS DOWN, 5 CHOCH UP, 6 CHOCH DOWN, 7 SWEEP HIGH, 8 SWEEP LOW, 9 FVG, 10 OB, 11 zone attive ora. Conteggi dall'ultima costruzione.
TSE_LastError e le funzioni di testo
TSE_LastError: codice dell'ultima chiamata. TSE_ErrorText, TSE_LabelText, TSE_EventText, TSE_ZoneText(kind, dir) e TSE_StateText restituiscono le stringhe elencate in Codici.
Esempio di integrazione funzionante
#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);
} Configurazioni tipiche
- Struttura interna ed esterna: due handle sullo stesso grafico, strength 2 e 8.
- Bias multi-timeframe: handle del grafico per gli ingressi, handle H4 o D1 come filtro TSE_Trend.
- Rotture con stoppino: TSE_Configure(h, 1, 0, 0.10, 0.25, 14); nessuno sweep in questa modalità.
- Meno zone e swing, più ampi: fvg_min_atr 0.5-1.0, min_swing_atr 1.0.
Architettura e note
- Un motore per handle, fino a 32 handle per programma; ogni programma che importa ha i propri. I dati restano in memoria e vengono ricostruiti dallo storico dopo un riavvio.
- Solo barre chiuse, ciascuna letta una volta, dalla più vecchia alla più recente: nulla viene ridisegnato e la barra 0 non viene mai usata.
- Costruire 20.000 barre ha richiesto circa 80 ms nello Strategy Tester di MT4.
- Altri simboli o timeframe vengono letti con iHigh, iLow, iOpen, iClose e iTime; NO HISTORY è normale mentre il terminale li scarica. Nello Strategy Tester usate il simbolo testato (qualsiasi timeframe).
- Per handle: fino a 2000 swing, 2000 eventi e 500 zone; a pieno carico viene scartato il 10% più vecchio.
- MetaTrader 4 build 600 o successiva. Sicura nello Strategy Tester e nell'ottimizzazione. Nessuna DLL, file, variabili globali, oggetti grafici, timer, avvisi o operazioni.
Avviso sui rischi
La libreria descrive la struttura del prezzo. Non prevede i prezzi e non garantisce profitti. Testate qualsiasi strategia basata su di essa prima su un conto demo.
