Explication du Code MQL5:
V100_Sniper_SMC_MTF_V2
Ce document fournit une analyse détaillée du code MQL5 de l'indicateur
V100_Sniper_SMC_MTF_V2 , conçu pour la plateforme de trading MetaTrader 5. Cet
indicateur est un outil d'analyse technique multi-timeframe (MTF) qui implémente une
stratégie basée sur les concepts de Smart Money Concepts (SMC), tels que les Order
Blocks (OB), les Breaker Blocks et les Fair Value Gaps (FVG), pour identifier des
opportunités de trading sur l'indice de Volatilité 100 de Deriv.
1. Vue d'ensemble de l'Indicateur
L'indicateur V100_Sniper_SMC_MTF_V2 est un indicateur personnalisé qui s'affiche
dans une fenêtre de graphique séparée. Il est conçu pour aider les traders à visualiser
les zones clés de support/résistance (Order Blocks), les tendances sur différentes
unités de temps, et les signaux d'entrée potentiels (Buy/Sell) basés sur la confluence
de plusieurs facteurs. Il intègre également des fonctionnalités visuelles pour dessiner
ces zones sur le graphique et des alertes pour notifier les traders.
2. Propriétés et Buffers
Le code commence par définir les propriétés de l'indicateur et les buffers utilisés pour
stocker les données calculées:
#property strict : Active le mode de compilation strict, qui aide à détecter les
erreurs potentielles.
#property indicator_chart_window : Indique que l'indicateur s'affichera dans
une fenêtre de graphique séparée.
#property indicator_buffers 4 : Déclare quatre buffers pour les calculs de
l'indicateur.
#property indicator_plots 2 : Déclare deux plots pour l'affichage des signaux
d'achat et de vente.
Les plots sont configurés pour afficher des flèches (DRAW_ARROW) sur le graphique:
plot 0 : `short_name=
"BUY", draw_type=DRAW_ARROW , color=clrLime , style=STYLE_SOLID , width=2 . *
plot 1: short_name="SELL" , draw_type=DRAW_ARROW , color=clrRed ,
style=STYLE_SOLID , width=2 .
Les buffers BuySig , SellSig , BuyAux , et SellAux sont déclarés pour stocker les
signaux d'achat et de vente, ainsi que des données auxiliaires pour les calculs.
3. Paramètres d'Entrée (Inputs)
L'indicateur est hautement configurable via une série de paramètres d'entrée,
permettant à l'utilisateur d'ajuster son comportement en fonction de ses préférences
de trading et des conditions du marché. Ces paramètres sont regroupés en plusieurs
catégories:
3.1. Paramètres de Timeframe (Unités de Temps)
TF_Dir_1 = PERIOD_D1 : ENUM_TIMEFRAMES . Définit la première unité de temps
pour l'analyse de la direction et de la structure principale du marché (par défaut:
Daily - D1).
TF_Dir_2 = PERIOD_H4 : ENUM_TIMEFRAMES . Définit la deuxième unité de temps
pour la confirmation et la confluence (par défaut: 4 Heures - H4).
TF_Entry = PERIOD_M15 : ENUM_TIMEFRAMES . Définit l'unité de temps pour les
entrées de trading (par défaut: 15 Minutes - M15).
3.2. Paramètres de Logique SMC
SwingLen = 3 : int . Longueur du fractal utilisé pour identifier les points de
swing (hauts et bas) sur le graphique.
LookbackBars = 1500 : int . Nombre de barres à analyser pour les calculs de
l'indicateur.
MaxOBLookback = 40 : int . Fenêtre de recherche maximale pour les Order
Blocks (OB).
DisplacementATR = 1.5 : double . Facteur multiplicateur de l'Average True
Range (ATR). Le corps d'une bougie doit être supérieur ou égal à k*ATR pour être
considéré comme un
"displacement" (mouvement impulsif). * ATR_Period = 14 : int . Période utilisée
pour le calcul de l'Average True Range (ATR). * VolMAPeriod = 20 : int . Période de la
moyenne mobile sur le volume de tick (utilisé comme proxy pour le volume réel). *
RequireFVG = true : bool . Indique si un Fair Value Gap (FVG) est requis autour du
Break of Structure (BOS) pour valider un Order Block. * UseTickVolFilter = true :
bool . Active ou désactive le filtre basé sur le volume de tick. * UseBreakerBlock =
true : bool . Active ou désactive la logique de détection des Breaker Blocks. *
MinOBHeightPts = 5.0 : double . Hauteur minimale d'un Order Block en points.
Utilisé pour filtrer les rectangles d'OB trop fins. * MaxOBHeightPts = 400.0 : double .
Hauteur maximale d'un Order Block en points.
3.3. Paramètres de Score de Qualité OB
UseOBQualityScore = true : bool . Active ou désactive le calcul du score de
qualité pour les Order Blocks.
MinOBScoreToTrade = 70 : int . Seuil minimal de score de qualité (sur 100)
qu'un Order Block doit atteindre pour être considéré comme valide pour le
trading.
3.4. Paramètres de Gestion des Risques (Guides RR)
RR_to_Secure = 1.0 : double . Ratio Risque/Récompense pour sécuriser une
partie des profits.
RR_to_Add = 1.5 : double . Ratio Risque/Récompense pour ajouter à une
position existante.
RR_to_Exit = 2.5 : double . Ratio Risque/Récompense pour la sortie complète
de la position.
3.5. Paramètres Anti-Spam et Visuels
MinBarsBetweenSignals = 10 : int . Nombre minimal de barres entre deux
signaux consécutifs pour éviter le
"spam" de signaux. * ArrowCodeBuy = 233 : int . Code Wingdings pour la flèche
d'achat (flèche vers le haut). * ArrowCodeSell = 234 : int . Code Wingdings pour la
flèche de vente (flèche vers le bas).
3.6. Paramètres d'Alertes
PushAlerts = true : bool . Active ou désactive les notifications push.
OnlyWhenAllConditions = true : bool . Si activé, les alertes ne sont envoyées
que si toutes les conditions sont remplies.
3.7. Paramètres Visuels
DrawOBZones = true : bool . Dessine les zones d'Order Blocks sur le graphique.
DrawBreaker = true : bool . Dessine les Breaker Blocks.
DrawFVG = true : bool . Dessine les Fair Value Gaps.
DrawMTFLabels = true : bool . Affiche les labels multi-timeframe.
DrawZoneVolume = true : bool . Affiche le volume de tick dans la zone.
OB_Bull_Color = clrSeaGreen : color . Couleur des Order Blocks haussiers.
OB_Bear_Color = clrTomato : color . Couleur des Order Blocks baissiers.
BRK_Color = clrDarkSlateBlue : color . Couleur des Breaker Blocks.
FVG_Bull_Color = clrAqua : color . Couleur des FVG haussiers.
FVG_Bear_Color = clrOrange : color . Couleur des FVG baissiers.
RectBorderWidth = 1 : int . Largeur des bordures des rectangles.
3.8. Paramètres des Boutons de Contrôle
ShowControlButtons = true : bool . Affiche des boutons sur le graphique pour
activer/désactiver certaines fonctionnalités à l'exécution.
4. Structures de Données (STRUCTS)
Le code définit deux structures personnalisées pour organiser les données:
SwingPoint : Représente un point de swing (haut ou bas) sur le graphique.
int index : L'index de la barre où le swing est détecté.
double price : Le prix du swing (haut ou bas de la barre).
OBZone : Représente une zone d'Order Block.
int index : L'index de la barre où l'OB est détecté.
double high : Le prix haut de l'OB.
double low : Le prix bas de l'OB.
bool bullish : Indique si l'OB est haussier (true) ou baissier (false).
bool breaker : Indique si l'OB est un Breaker Block.
int score : Le score de qualité de l'OB (0-100).
ENUM_TIMEFRAMES sourceTF : L'unité de temps sur laquelle l'OB a été
détecté.
5. Variables Globales (GLOBALS)
Plusieurs variables globales sont utilisées pour maintenir l'état de l'indicateur et
stocker des données accessibles à travers différentes fonctions:
CArrayObj *g_d1Highs, *g_d1Lows : Pointeur vers des objets CArrayObj pour
stocker les points hauts et bas des swings sur l'unité de temps D1.
CArrayObj *g_h4Highs, *g_h4Lows : Pointeur vers des objets CArrayObj pour
stocker les points hauts et bas des swings sur l'unité de temps H4.
OBZone g_obD1, g_obH4 : Objets OBZone pour stocker les Order Blocks détectés
sur D1 et H4.
bool g_hasObD1=false, g_hasObH4=false : Drapeaux indiquant si un Order
Block a été détecté sur D1 et H4 respectivement.
int hATR_D1, hATR_H4, hATR_LTF : Handles (identifiants) pour les indicateurs
ATR sur différentes unités de temps.
int hVolMA_LTF : Handle pour l'indicateur de moyenne mobile du volume de
tick sur l'unité de temps d'entrée.
int lastBuyBar, lastSellBar : Index des dernières barres où des signaux
d'achat/vente ont été générés (pour la fonction anti-spam).
datetime lastAlertTime : Horodatage de la dernière alerte envoyée.
bool t_DrawOB, t_DrawBreaker, t_DrawFVG, t_DrawVolume, t_Alerts,
t_StrictGate : Variables de type bool qui peuvent être activées/désactivées via
les boutons de l'interface utilisateur pour contrôler le dessin des objets, les
alertes et la stricte application des conditions.
6. Fonctions Auxiliaires (HELPERS)
Le code utilise plusieurs fonctions auxiliaires pour effectuer des calculs et des
opérations répétitives:
double BodySize(int i, ENUM_TIMEFRAMES tf) : Calcule la taille du corps
d'une bougie (différence absolue entre le prix d'ouverture et de clôture) pour une
barre et une unité de temps données.
double CandleHigh(int i, ENUM_TIMEFRAMES tf) : Retourne le prix haut d'une
bougie pour une barre et une unité de temps données.
double CandleLow(int i, ENUM_TIMEFRAMES tf) : Retourne le prix bas d'une
bougie pour une barre et une unité de temps données.
double GetATR(int i, int handle) : Récupère la valeur de l'ATR pour une
barre donnée à partir d'un handle d'indicateur ATR.
double GetVolMA(int i) : Récupère la valeur de la moyenne mobile du volume
de tick pour une barre donnée.
void FindSwings(ENUM_TIMEFRAMES tf, int swingLen, CArrayObj &highs,
CArrayObj &lows, int barsToScan) : Identifie les points de swing (hauts et bas
fractals) sur une unité de temps donnée. Elle remplit les tableaux highs et lows
avec les objets SwingPoint .
int TrendFromSwings(CArrayObj &highs, CArrayObj &lows) : Détermine la
tendance du marché (haussière, baissière ou neutre) en comparant les deux
derniers points de swing hauts et bas.
bool HasFVG(ENUM_TIMEFRAMES tf, int bosIndex, bool bullish) : Vérifie la
présence d'un Fair Value Gap (FVG) autour d'un Break of Structure (BOS). Un FVG
est une zone où il y a un déséquilibre entre l'offre et la demande, souvent
identifié par un espace entre les mèches de trois bougies consécutives.
int OBQualityScore(ENUM_TIMEFRAMES tf, int obIndex, int bosIndex,
bool bullish) : Calcule un score de qualité pour un Order Block basé sur
plusieurs critères, tels que la taille du corps de la bougie de déplacement, la
présence de FVG, la taille des mèches de l'OB, et le volume de tick.
bool FindOB(ENUM_TIMEFRAMES tf, int maxLookback, bool bullish, OBZone
&zone) : Recherche et identifie un Order Block (OB) valide en fonction des
critères définis (déplacement, FVG, hauteur minimale/maximale). Si un OB est
trouvé, il remplit la structure OBZone correspondante.
void DrawZoneRect(const string name, OBZone &z, color border, color
fill) : Dessine un rectangle sur le graphique pour représenter une zone d'Order
Block. Il ajoute également des labels pour indiquer l'unité de temps, le type de
zone (support/résistance, breaker) et le score de qualité.
void DrawFVGs(int barsToScan) : Dessine les Fair Value Gaps sur le graphique
de l'unité de temps d'entrée.
void MarkBreakerIfNeeded(OBZone &z) : Vérifie si un Order Block doit être
marqué comme un Breaker Block. Un Breaker Block se forme lorsque le prix
casse un Order Block et clôture au-delà de son côté opposé.
void CreateButton(const string name, const string label, int x, int
y) : Crée un bouton interactif sur le graphique pour permettre à l'utilisateur de
contrôler certaines fonctionnalités de l'indicateur à l'exécution.
void UpdateButtons() : Met à jour le texte des boutons pour refléter leur état
actuel (ON/OFF).
7. Fonctions d'Initialisation et de Désinitialisation
(INIT/DEINIT)
Ces fonctions gèrent le cycle de vie de l'indicateur:
int OnInit() : Cette fonction est appelée une fois lorsque l'indicateur est
initialisé.
Elle configure les buffers de l'indicateur ( SetIndexBuffer ).
Elle définit les symboles des flèches pour les signaux d'achat/vente
( PlotIndexSetInteger ).
Elle initialise les objets CArrayObj pour stocker les swings.
Elle obtient les handles des indicateurs ATR et de la moyenne mobile du
volume de tick.
Si ShowControlButtons est activé, elle crée les boutons de contrôle sur le
graphique.
Elle retourne INIT_SUCCEEDED si l'initialisation est réussie.
void OnDeinit(const int reason) : Cette fonction est appelée lorsque
l'indicateur est désinitialisé (par exemple, lorsque le graphique est fermé ou
l'indicateur est supprimé).
Elle libère la mémoire allouée aux objets CArrayObj .
8. Gestion des Événements du Graphique
(OnChartEvent)
void OnChartEvent(const int id, const long &lparam, const double
&dparam, const string &sparam) : Cette fonction est un gestionnaire
d'événements qui est appelé lorsque des événements se produisent sur le
graphique (par exemple, un clic de souris).
Elle détecte les clics sur les boutons de contrôle et bascule l'état des
variables t_DrawOB , t_DrawBreaker , etc.
Elle appelle UpdateButtons() pour mettre à jour l'affichage des boutons.
9. Logique Principale de Calcul (OnCalculate)
La fonction OnCalculate est le cœur de l'indicateur. Elle est appelée à chaque
nouveau tick ou à chaque nouvelle barre, en fonction des paramètres de l'indicateur.
Elle effectue les calculs principaux et génère les signaux.
int OnCalculate(const int rates_total, const int prev_calculated,
const int begin, const double &price[]) :
barsToScan : Détermine le nombre de barres à analyser, limité par
LookbackBars .
1) Détection des Swings et Tendances (D1/H4):
Appelle FindSwings pour détecter les points de swing sur les unités
de temps D1 et H4.
Appelle TrendFromSwings pour déterminer la tendance sur D1 et H4.
2) Détection des Order Blocks (OBs):
Appelle FindOB pour rechercher les Order Blocks haussiers ou
baissiers sur D1 et H4, en fonction de la tendance détectée.
3) Marquage des Breaker Blocks:
Appelle MarkBreakerIfNeeded pour marquer les OBs comme Breaker
Blocks si les conditions sont remplies.
4) Dessin des Zones:
Si DrawOBZones est activé, appelle DrawZoneRect pour dessiner les
rectangles des Order Blocks sur le graphique avec les couleurs et
labels appropriés.
5) Dessin des FVG sur l'unité de temps d'entrée:
Appelle DrawFVGs pour dessiner les Fair Value Gaps sur l'unité de
temps d'entrée ( TF_Entry ).
6) Logique d'Entrées LTF (Low Timeframe):
Initialise les buffers de signaux BuySig et SellSig à zéro.
Parcourt les barres de l'unité de temps d'entrée ( TF_Entry ).
Pour chaque barre, il vérifie plusieurs conditions pour générer un
signal d'achat ou de vente:
Displacement: Vérifie si la bougie actuelle montre un
mouvement impulsif significatif (corps de bougie >=
DisplacementATR * ATR ).
Filtre de Volume: Si UseTickVolFilter est activé, vérifie si le
volume de tick de la bougie actuelle est supérieur à la moyenne
mobile du volume de tick.
Confluence des Zones OB: Vérifie si la bougie actuelle se trouve
à l'intérieur des zones d'Order Blocks détectées sur D1 et/ou H4.
Alignement de la Tendance: Vérifie si la tendance sur D1 et H4
est alignée avec le signal potentiel.
Score de Qualité OB: Si UseOBQualityScore est activé, vérifie si
le score de qualité des OBs pertinents est supérieur ou égal à
MinOBScoreToTrade .
Anti-Spam: S'assure qu'il y a un nombre minimal de barres
( MinBarsBetweenSignals ) depuis le dernier signal du même
type.
Si toutes les conditions sont remplies, il place une flèche d'achat ou
de vente sur le graphique ( BuySig[i] ou SellSig[i] ) et met à jour
lastBuyBar ou lastSellBar .
Alertes: Si PushAlerts est activé et les conditions d'alerte sont
remplies, il envoie une notification push avec les détails du signal
(symbole, tendance D1/H4, confluence, score OB, heure).
Conclusion
L'indicateur V100_Sniper_SMC_MTF_V2 est un outil d'analyse technique sophistiqué
pour MetaTrader 5, conçu pour les traders qui utilisent les Smart Money Concepts. Il
combine l'analyse multi-timeframe des Order Blocks, des Breaker Blocks et des Fair
Value Gaps avec des filtres de volume et des règles de gestion des signaux pour
identifier des opportunités de trading. Sa modularité, grâce à ses nombreux
paramètres d'entrée et ses boutons de contrôle, en fait un outil flexible et puissant
pour l'analyse du marché et la génération de signaux.
Auteur: Manus AI