Tectonic Structure Engine
- Bibliothèque
-
Syarief Azman Bin Rosli
Bonjour et bienvenue sur mon profil officiel MQL5 !
Je suis Syarief Azman Bin Rosli, développeur de systèmes de trading algorithmique et ingénieur quantitatif avec plus de dix ans d'expérience spécialisée dans la création de solutions de trading automatisées pour MetaTrader 5 et MetaTrader 4. - Version: 1.0
- Activations: 5
Bibliothèque MQL4 qui cartographie la structure du marché pour votre EA, indicateur ou script : swings confirmés étiquetés HH, HL, LH, LL, EQH et EQL, cassure de structure (BOS), changement de caractère (CHoCH), balayages de liquidité, order blocks et fair value gaps avec suivi du remplissage, et position du prix dans le range de négociation. Elle ne lit que des barres clôturées et ne repeint jamais. Elle ne trade pas, ne dessine pas et n'envoie pas d'alertes. Vous recevez le fichier compilé Tectonic_Structure_Engine.ex4 ; cette page est la référence complète de l'API.
Démarrage rapide
- Copiez Tectonic_Structure_Engine.ex4 dans MQL4/Libraries (Fichier > Ouvrir le dossier des données).
- Collez le bloc #import ci-dessous dans votre programme.
- Dans OnInit : h = TSE_Create("", 0, 3, 1000); TSE_Configure en option.
- Appelez TSE_Update(h) dans OnTick ou OnCalculate. Sans nouvelle barre, elle renvoie 0 en une microseconde environ.
- Lisez TSE_Trend, TSE_GetEvent, TSE_NearestZone et les autres ; TSE_Release(h) dans OnDeinit.
- Vérifiez : lancez l'exemple ci-dessous dans le testeur de stratégie (tout symbole, M15). Le journal liste chaque événement ; la première mise à jour liste tout l'historique.
Déclaration d'import (prête à copier)
#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
- Étiquettes de swing : 1 HH, 2 LH, 3 EQH (sommets) ; -1 LL, -2 HL, -3 EQL (creux) ; 0 FIRST (aucun swing précédent de ce côté).
- Types d'événement : 1 BOS UP, -1 BOS DOWN, 2 CHOCH UP, -2 CHOCH DOWN, 3 SWEEP HIGH, -3 SWEEP LOW.
- Type de zone (kind) : 1 fair value gap, 2 order block. dir : 1 haussier (support), -1 baissier (résistance). Textes : BULL FVG, BEAR FVG, BULL OB, BEAR OB.
- État de zone : 0 FRESH (intacte), 1 TESTED (le prix y est entré), 2 FILLED (FVG traversé), 3 BROKEN (OB clôturé au-delà).
- Erreurs : 0 OK, -1 BAD HANDLE, -2 BAD PARAMETERS, -3 NO HISTORY, -4 NO FREE SLOT, -5 BAD INDEX. Les fonctions de texte renvoient UNKNOWN pour les autres codes.
Lecture de chaque barre clôturée
- Zones : un plus bas dans une zone haussière (un plus haut dans une zone baissière) passe la zone à TESTED et augmente fill, la pénétration la plus profonde en % de la hauteur de la zone. Un FVG devient FILLED quand le prix atteint son bord opposé ; un OB devient BROKEN sur une clôture au-delà de son bord opposé (fill peut atteindre 100 % tant que l'OB reste actif).
- Swings : la barre située strength barres en arrière est un swing haut si son plus haut dépasse les strength barres précédentes et n'est pas inférieur aux strength barres suivantes (creux en miroir). Un swing est signalé avec strength barres de retard et ne bouge jamais. Avec min_swing_atr supérieur à 0, le plus haut moins le plus bas des 2 x strength + 1 barres doit valoir au moins min_swing_atr x ATR. Étiquette par rapport au swing précédent du même côté : à moins de equal_tol_atr x ATR c'est EQH ou EQL, sinon HH ou LH, LL ou HL. Le swing haut et le swing bas les plus récents sont les niveaux de cassure.
- Cassures : break_mode 0 exige une clôture au-delà du niveau, 1 une mèche. Casser le swing haut donne CHOCH UP si la tendance était -1, sinon BOS UP ; la tendance passe à 1 et le niveau est consommé. Creux en miroir. En mode clôture, une mèche au-delà avec une clôture revenue à l'intérieur est un SWEEP, une fois par niveau.
- Order block : à chaque BOS ou CHoCH, la dernière bougie opposée (baissière pour une cassure haussière) à l'extrême de la jambe entre swing et cassure ou jusqu'à 10 barres avant ; la zone est son range plus haut-plus bas.
- Fair value gap : plus bas de la troisième bougie au-dessus du plus haut de la première (haussier), ou plus haut de la troisième sous le plus bas de la première (baissier), d'une hauteur d'au moins fvg_min_atr x ATR.
L'ATR est la moyenne simple du true range sur atr_period barres.
Référence de l'API
TSE_Create
symbol : "" ou NULL = symbole du graphique ; il doit exister. timeframe : 0 = période du graphique, sinon de PERIOD_M1 à PERIOD_MN1. strength : 1-50. history_bars : 100-20000, construites à la première mise à jour. Renvoie un handle 0-31, ou -1 avec BAD PARAMETERS ou NO FREE SLOT. Valeurs par défaut : 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 = désactivé), equal_tol_atr 0-5, fvg_min_atr 0-10, atr_period 1-500. Vide le handle ; le prochain TSE_Update le reconstruit. Toute valeur hors plage : false, BAD PARAMETERS, rien ne change.
TSE_Release
Libère le handle pour réutilisation. Appelez-la dans OnDeinit.
TSE_Update
Lit les barres clôturées pas encore vues ; le premier appel construit history_bars. Renvoie le nombre de nouveaux événements (index 0 à n-1 de TSE_GetEvent), 0 sans nouvelle barre, ou -1 : BAD HANDLE, ou NO HISTORY tant que moins de 2 x strength + 4 barres sont chargées (rappelez au tick suivant). Si la dernière barre lue disparaît (historique rechargé), le handle se reconstruit seul.
int n = TSE_Update(h); if(n > 0) Print(n, " new events");
TSE_Trend
1 après une cassure haussière, -1 après une cassure baissière, 0 avant la première cassure ou pour un handle invalide.
TSE_SwingCount et TSE_GetSwing
Swings stockés, le plus récent à l'index 0 : side (1 sommet, -1 creux), price, heure de la barre du swing, label. Le compte vaut -1 pour un handle invalide ; hors de 0 à compte-1, TSE_GetSwing renvoie false avec BAD INDEX.
TSE_EventCount et TSE_GetEvent
Événements stockés, le plus récent à l'index 0 : type, level (le prix du swing), swing_time, break_time (la barre qui l'a cassé ou balayé).
TSE_GetLevels
Le swing haut et le swing bas les plus récents (0.0 s'il n'y en a pas encore) et si chacun est déjà cassé. Un niveau intact est le prochain déclencheur de BOS ou CHoCH.
TSE_RangePosition
Position du prix entre ces deux niveaux : 0 = swing bas, 50 = équilibre, 100 = swing haut, sous 0 ou au-dessus de 100 hors du range. price 0 = Bid du symbole du handle. EMPTY_VALUE si un niveau manque ou si le haut n'est pas au-dessus du bas. La démo affiche DISCOUNT sous 45 et PREMIUM au-dessus de 55.
TSE_ZoneCount et TSE_GetZone
Zones stockées de tous états, la plus récente à l'index 0 : kind, dir, top, bottom, time (FVG : bougie du milieu ; OB : la bougie elle-même), state, fill 0-100.
TSE_NearestZone
Zone FRESH ou TESTED la plus proche du prix (0 = Bid) ; distance 0 dans une zone, en cas d'égalité la zone la plus récente. kind : 0 toutes, 1 FVG, 2 OB. dir : 0 toutes, 1, -1. Renvoie son index pour TSE_GetZone et remplit top et bottom ; -1 si aucune (erreur OK) ou BAD PARAMETERS.
double top, bottom; int z = TSE_NearestZone(h, 2, 1, 0, top, bottom); // nearest bullish order block
TSE_GetStats
Passez un tableau int dynamique ; il est redimensionné à 12 et 12 est renvoyé : 0 barres lues, 1 swings hauts, 2 swings bas, 3 BOS UP, 4 BOS DOWN, 5 CHOCH UP, 6 CHOCH DOWN, 7 SWEEP HIGH, 8 SWEEP LOW, 9 FVG, 10 OB, 11 zones actives. Comptes depuis la dernière construction.
TSE_LastError et les fonctions de texte
TSE_LastError : code du dernier appel. TSE_ErrorText, TSE_LabelText, TSE_EventText, TSE_ZoneText(kind, dir) et TSE_StateText renvoient les chaînes listées dans Codes.
Exemple d'intégration fonctionnel
#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);
} Réglages types
- Structure interne et externe : deux handles sur un graphique, strength 2 et 8.
- Biais multi-unités de temps : handle du graphique pour les entrées, handle H4 ou D1 comme filtre TSE_Trend.
- Cassures par mèche : TSE_Configure(h, 1, 0, 0.10, 0.25, 14) ; pas de balayages dans ce mode.
- Moins de zones et de swings, plus grands : fvg_min_atr 0.5-1.0, min_swing_atr 1.0.
Architecture et remarques
- Un moteur par handle, jusqu'à 32 handles par programme ; chaque programme importateur a les siens. Les données restent en mémoire et sont reconstruites depuis l'historique après un redémarrage.
- Barres clôturées uniquement, chacune lue une fois, de la plus ancienne à la plus récente : rien ne repeint et la barre 0 n'est jamais utilisée.
- Construire 20 000 barres a pris environ 80 ms dans le testeur de stratégie MT4.
- Les autres symboles ou unités de temps sont lus avec iHigh, iLow, iOpen, iClose et iTime ; NO HISTORY est normal pendant que le terminal les télécharge. Dans le testeur de stratégie, utilisez le symbole testé (toute unité de temps).
- Par handle : jusqu'à 2000 swings, 2000 événements et 500 zones ; une fois plein, les 10 % les plus anciens sont supprimés.
- MetaTrader 4 build 600 ou ultérieur. Sûr dans le testeur de stratégie et l'optimisation. Pas de DLL, fichiers, variables globales, objets graphiques, timers, alertes ni trading.
Avertissement sur les risques
La bibliothèque décrit la structure du prix. Elle ne prédit pas les prix et ne garantit aucun profit. Testez toute stratégie fondée sur elle d'abord sur un compte démo.
