Directional Movement Index (dmi)
[[dmi]] est un indicateur de tendance qui compare la composante haussière et la composante baissière du mouvement des prix. Il repose sur deux lignes : +DI et −DI. La première mesure la force du mouvement directionnel haussier récent, la seconde mesure la force du mouvement directionnel baissier récent.
La lecture du DMI consiste avant tout à observer le rapport entre ces deux lignes. Quand +DI est au‑dessus de −DI, la dynamique récente est dominée par les acheteurs. Quand −DI passe au‑dessus de +DI, la dynamique devient dominée par les vendeurs. Plus l’écart entre les deux lignes est net, plus cette domination directionnelle est marquée.
Le bloc DMI peut aussi exposer l’ADX en complément. L’ADX est calculé à partir de +DI et −DI, mais il répond à une autre question : non pas dans quel sens le marché se déplace, mais avec quelle force il le fait. Le DMI permet donc de travailler à la fois la direction avec +DI et −DI, et, si nécessaire, la qualité de cette direction avec l’ADX.
Déclaration du bloc
Une stratégie peut contenir plusieurs blocs [[dmi]]. Chaque bloc peut exposer :
- uniquement +DI,
- uniquement –DI,
- +DI et –DI,
- ou +DI, –DI et ADX ensemble.
Au moins une sortie doit être déclarée. Si vous exposez l’ADX, vous devez également exposer à la fois +DI et –DI.
Exemples
Configuration minimale
Ce bloc DMI expose uniquement les lignes +DI et –DI. L’ADX n’est pas calculé ni stocké. Si vous n’indiquez pas di_length, le bloc utilise par défaut une fenêtre de 14 périodes.
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"DMI complet (+DI, –DI, ADX)
Ce bloc expose les trois séries : +DI, –DI et ADX.
Le paramètre di_length contrôle le lissage des lignes DI. Le paramètre adx_length contrôle le lissage de la ligne ADX et n’est accepté que lorsque adx_id est défini.
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"
adx_id = "adx"Longueurs fixes personnalisées
Ce bloc utilise des valeurs personnalisées pour di_length et adx_length.
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"
adx_id = "adx"
di_length = 12
adx_length = 18Recherche des longueurs optimales de DI et d’ADX
Ce bloc explore des plages de valeurs pour di_length et adx_length afin d’identifier la combinaison la plus performante.
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"
adx_id = "adx"
di_length.start = 7
di_length.stop = 21
adx_length.start = 7
adx_length.stop = 21Filtre de dominance haussière confirmée
Cet exemple utilise le DMI pour filtrer les phases où +DI domine −DI et où l’ADX dépasse un seuil minimal. Le bloc [[dmi]] expose di_plus, di_minus et adx. Le bloc [[constant]] permet d’optimiser le seuil adx_threshold selon le symbole, le timeframe et la stratégie.
Un seuil plus bas rend le filtre plus permissif. Un seuil plus élevé le rend plus strict et ne conserve que les tendances les plus nettes.
[[constant]]
id = "adx_threshold"
start = 15
stop = 30
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"
adx_id = "adx"
di_length = 14
adx_length = 14
[[condition]]
id = "long_trend_filter"
condition = "di_plus > di_minus and adx > adx_threshold"
next_block_id = "..."Croisement haussier +DI / −DI
Ce bloc DMI sert à détecter le passage d’une domination baissière à une domination haussière. Le bloc [[dmi]] calcule +DI et −DI sans exposer l’ADX, et fait varier la fenêtre di_length entre 7 et 21 périodes pour rechercher le meilleur compromis entre réactivité du signal et robustesse des croisements. Dans cette configuration, adx_length n’est pas accepté et aucune variable <id>.adx_length n’est exposée.
La condition teste un croisement : à la bougie courante, +DI est au‑dessus de −DI, alors qu’à la bougie précédente il était en dessous ou égal.
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"
di_length.start = 7
di_length.stop = 21
[[condition]]
id = "bullish_dmi_cross"
condition = "di_plus > di_minus and di_plus[1] <= di_minus[1]"
next_block_id = "..."Affaiblissement de tendance via ADX
Dans cet exemple, le DMI est configuré pour exposer +DI, −DI et l’ADX, mais la condition n’utilise que la série adx. Le seuil à partir duquel la tendance est considérée comme affaiblie n’est pas fixé : il est exploré entre 15 et 30 pour trouver une zone où la sortie intervient ni trop tôt, ni trop tard.
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"
adx_id = "adx"
di_length = 14
adx_length = 14
[[constant]]
id = "adx_cutoff"
start = 15
stop = 30
[[condition]]
id = "trend_weakening"
condition = "adx[1] > adx_cutoff and adx < adx_cutoff"
next_block_id = "..."Paramètres
| Paramètre | Description |
|---|---|
plus_idTexte Optionnel | Identifiant de la série +DI. Si renseigné, le bloc expose une série numérique portant ce nom et représentant l’indicateur directionnel positif. |
minus_idTexte Optionnel | Identifiant de la série –DI. Si renseigné, le bloc expose une série numérique portant ce nom et représentant l’indicateur directionnel négatif. |
adx_idTexte Optionnel | Identifiant de la série ADX. Si renseigné, le bloc expose une série numérique portant ce nom et représentant la force globale de la tendance. Contrainte : adx_id nécessite que plus_id et minus_id soient tous deux présents. |
di_lengthEntier Optionnel | Fenêtre utilisée pour lisser +DM, –DM et le True Range avant normalisation en +DI/–DI ; doit être ≥ 1 lorsqu’elle est renseignée. Si di_length est omis, la valeur par défaut est utilisée.Usage : • Fixe : di_length = valeur• Grille : – di_length.start = valeur_minimale– di_length.stop = valeur_maximale– di_length.step = valeur (optionnel, par défaut 1) |
adx_lengthEntier Optionnel (obligatoire si adx_id est défini) | Fenêtre utilisée pour lisser la série DX (écart entre +DI et –DI) en ADX ; doit être ≥ 1 lorsque l’ADX est exposé. Contrainte : adx_length n’est accepté que si adx_id est défini.Usage : • Fixe : adx_length = valeur• Grille : – adx_length.start = valeur_minimale– adx_length.stop = valeur_maximale– adx_length.step = valeur (optionnel, par défaut 1) |
symbolTexte ou Tableau Optionnel | Symbole de marché à partir duquel le bloc DMI lit les bougies (prix high, low, close). Pour le format et les règles d’alignement, voir le guide Exchanges, Symboles et Timeframes. |
timeframeTexte ou Tableau Optionnel | Timeframe sur lequel cet indicateur est calculé. Si timeframe est omis, le calcul se fait sur le timeframe principal de la grille défini dans [backtest].Pour les formats acceptés et les règles d’alignement entre timeframes, voir Exchanges, Symboles et Timeframes. |
Variables disponibles
Vous pouvez utiliser directement les identifiants ci‑dessous dans vos expressions.
Le bloc DMI expose jusqu’à trois séries numériques (+DI, –DI, ADX), les longueurs de lissage applicables et les métadonnées habituelles : sources d’entrée, symbole et timeframe.
Supposons le bloc configuré ainsi :
[[dmi]]
plus_id = "di_plus"
minus_id = "di_minus"
adx_id = "adx"Alors :
| Variable | Description |
|---|---|
di_plus ou di_plus[0]Décimal | Valeur actuelle de +DI (pourcentage de mouvement directionnel haussier). |
di_plus[n]Décimal | Valeur de +DI il y a n bougies. |
di_minus ou di_minus[0]Décimal | Valeur actuelle de –DI (pourcentage de mouvement directionnel baissier). |
di_minus[n]Décimal | Valeur de –DI il y a n bougies. |
adx ou adx[0]Décimal | Valeur actuelle de l’ADX (force de tendance). |
adx[n]Décimal | Valeur de l’ADX il y a n bougies. |
<id>.di_lengthDécimal | Fenêtre de lissage DI utilisée pour la série <id>. |
<id>.adx_lengthDécimal | Fenêtre de lissage ADX utilisée pour la série <id>. Disponible uniquement lorsque adx_id est défini. |
<id>.high_source<id>.low_source<id>.close_sourceTexte | Nom de la série d’entrée high.Nom de la série d’entrée low.Nom de la série d’entrée close.Disponible pour chaque série exposée : di_plus, di_minus, adx. |
<id>.symbolTexte | Symbole utilisé pour cette série. |
<id>.timeframeTexte | Timeframe utilisé pour cette série. |