
Comment créer un indicateur True Strength Index personnalisé à l'aide de MQL5
Introduction
Les indicateurs techniques peuvent être très utiles si nous les utilisons correctement, car ils peuvent fournir des informations supplémentaires qu'il est difficile de détecter en se contentant d'observer l'évolution des prix. Il existe de nombreux indicateurs techniques prêts à l'emploi que nous pouvons utiliser. Mais il peut arriver que nous ayons besoin de les personnaliser pour qu'ils nous indiquent ou nous donnent un aperçu spécifique, ou que nous ayons besoin d'en créer un nouveau sur la base de nos idées gagnantes. Il est possible de créer de tels indicateurs personnalisés dans MQL5 et de les utiliser sur la plateforme de trading MetaTrader 5. Dans cet article, je vais vous expliquer comment créer l'indicateur True Strength Index à partir de zéro. Nous allons apprendre les spécificités de cet indicateur et voir comment le calculer dans notre code. Nous allons également apprendre comment utiliser cet indicateur personnalisé dans un système de trading basé sur une stratégie de trading en créant un Expert Advisor. Nous couvrirons tous ces aspects à travers les thèmes suivants :
- Définition de l'Indice de Solidité Réelle, ou True Strength Index (TSI)
- Un indicateur Simple TSI personnalisé
- Un EA TSI personnalisé
- Système EA TSI
- Conclusion
Après avoir compris les sujets mentionnés précédemment, nous serons en mesure de bien comprendre comment utiliser et interpréter l'indicateur True Strength Index. Nous serons en mesure de le calculer et de coder cet indicateur en tant qu'indicateur personnalisé dans le langage MQL5 à utiliser dans MetaTrader 5. Vous pourrez également implémenter l'indicateur dans d'autres systèmes de trading ou dans d’autres EA. Si vous souhaitez développer vos compétences en développement, je vous conseille d'essayer de coder le contenu ici par vous-même. Cette pratique est une étape très importante dans tout processus d'apprentissage ou dans votre feuille de route. Nous utiliserons MetaTrader 5 pour écrire notre code MQL5 dans son IDE intégré au terminal de trading MetaTrader 5. Si vous ne disposez pas de la plateforme ou si vous ne savez pas comment la télécharger et l'utiliser, vous pouvez lire la rubrique "Ecrire du code MQL5 dans MetaEditor" dans mes articles précédents.
Définition de l'Indice de Solidité Réelle, ou True Strength Index (TSI)
Dans cette partie, nous allons identifier l'indicateur technique True Strength Index (TSI) pour bien le comprendre. Il a été développé par William Blau en tant qu'indicateur technique qui mesure le momentum de l'action du prix, c'est-à-dire qu'il mesure la force de l'instrument, s'il est fort ou faible. Il oscille autour de la ligne 0. Il s'agit donc d'un indicateur d'oscillation du momentum. Une ligne de signal peut être utilisée en plus pour obtenir des signaux d'achat ou de vente supplémentaires basés sur le croisement de ces lignes. Mais nous pouvons obtenir des signaux basés sur la ligne TSI uniquement, en fonction de son croisement avec le niveau 0. S'il est au-dessus de la ligne 0, cela signifie une dynamique haussière et s'il est en dessous de 0, cela signifie une dynamique baissière. Il peut être utilisé pour détecter les zones de sur-achat et de sur-vente ainsi que les divergences haussières et baissières. Comme nous savons que nous devons confirmer ses signaux afin d'augmenter le poids de la preuve, il est préférable de l'utiliser avec d'autres outils techniques, que nous devrions utiliser dans le même contexte que l'action du prix pour obtenir de meilleurs aperçus.
Voyons maintenant comment calculer cet indicateur. Le calcul s'effectue en plusieurs étapes :
Calcul du momentum, doublement lissé :
- Calculer le momentum (changement de prix) en soustrayant le prix précédent du prix actuel.
- Calculer le premier lissage avec l'EMA à 25 périodes du momentum calculé
- Calculer le second lissage avec l'EMA à 13 périodes du premier lissage (EMA à 25 périodes du momentum calculé)
Calcul du momentum absolu, doublement lissé :
- Calculer le momentum absolu en soustrayant le prix absolu précédent du prix absolu actuel.
- Calculer le premier lissage avec l'EMA à 25 périodes du moment absolu calculé
- Calculer le second lissage avec l'EMA à 13 périodes du premier lissage (EMA à 25 périodes du momentum absolu calculé).
Calcul du TSI = 100*( momentum doublement lissé / momentum absolu doublement lissé)
Ce calcul aboutira à une ligne oscillante autour de 0, mesurant le momentum de l'action du prix et détectant les zones de sur-achat et de sur-vente comme nous l'avons mentionné.
Un indicateur Simple TSI Personnalisé
Le langage de programmation MQL5 dispose d'un grand nombre d'indicateurs techniques prédéfinis et nous pouvons les utiliser dans nos systèmes en utilisant la fonction prédéfinie. Nous avons déjà parlé d'un grand nombre de ces indicateurs dans les articles précédents de cette série, en discutant de la façon dont nous pouvons concevoir un système de trading basé sur ces indicateurs techniques populaires. Vous pouvez consulter les articles précédents et peut-être y trouver quelque chose d'utile. La question est maintenant de savoir comment créer un indicateur s'il n'existe pas en standard de la plateforme ou, même s'il existe, comment créer un indicateur personnalisé pour obtenir les signaux ou les déclencheurs souhaités. La réponse courte est de créer un indicateur personnalisé en utilisant le langage de programmation. C'est ce que nous allons faire dans cette partie.
Nous allons apprendre à créer notre indicateur True Strength Index personnalisé à l'aide de MQL5. Nous utiliserons ensuite ses fonctionnalités dans d'autres systèmes ou dans d’autres EA. Les étapes suivantes permettent de créer cet indicateur personnalisé.
Ajout de paramètres supplémentaires grâce à la propriété # avec son identifiant et sa valeur :
- indicator_separate_window — pour afficher l'indicateur dans une fenêtre séparée.
- indicator_buffers — pour spécifier le nombre de buffers de l'indicateur, nous spécifierons 8.
- indicator_plots — pour spécifier le nombre de séries graphiques dans l'indicateur, nous spécifierons 1.
- indicator_label1 — pour définir le nom de la série graphique, nous spécifierons TSI.
- indicator_type1 — pour spécifier le type de tracé graphique en spécifiant une valeur parmi les valeurs de ENUM_DRAW_TYPE, nous spécifierons DRAW_LINE.
- indicator_color1 — pour spécifier la couleur de la ligne de l'indicateur affichée, nous spécifierons clrBlue.
- indicator_style1 — pour spécifier le style de la ligne de l'indicateur, on spécifiera STYLE_SOLID.
- indicator_width1 — pour spécifier l'épaisseur de la ligne de l'indicateur, nous spécifierons 3.
#property indicator_separate_window #property indicator_buffers 8 #property indicator_plots 1 #property indicator_label1 "TSI" #property indicator_type1 DRAW_LINE #property indicator_color1 clrBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 3
Nous devons inclure le fichier MovingAverage.mqh pour utiliser ses fonctions dans notre calcul. Ce fichier est ajouté en utilisant la directive #include. Veillez à écrire le nom du fichier de la même manière que le nom du fichier.
#include <MovingAverages.mqh>
Nous devons définir 2 entrées de périodes de lissage, que nous utiliserons dans le calcul de l'indicateur, en utilisant la classe d'entrée pour que l’utilisateur puisse saisir ces valeurs s'il a besoin de modifier les valeurs par défaut spécifiées dans le programme. Nous déterminerons ensuite le type de données des variables InpSmPeriod1 et InpSmPeriod2 que nous devons déclarer comme type uint (entier non signé). Nous attribuerons ensuite 25 à InpSmPeriod1 et 13 à InpSmPeriod2 comme valeurs par défaut.
input uint InpSmPeriod1 = 25; // Smoothing period 1 input uint InpSmPeriod2 = 13; // Smoothing period 2
Création de 2 variables entières pour les périodes de lissage (smperiod1,smperiod2).
int smperiod1; int smperiod2;
Création de 7 tableaux pour les buffers de calcul des indicateurs
double indBuff[]; double momBuff[]; double momSmBuff1[]; double momSmBuff2[]; double absMomBuff[]; double absMomSmBuff1[]; double absMomSmBuff2[];
Dans la fonction OnInit (), nous effectuerons les étapes suivantes :
Déclarer des variables smperiod1 et smperiod2 en renvoyant la valeur 2 si l'utilisateur a saisir des valeurs pour InpSmPeriod1 et InpSmPeriod2 inférieure à 2, ou en renvoyant InpSmPeriod1 et InpSmPeriod2 dans le cas contraire.
smperiod1=int(InpSmPeriod1<2 ? 2 : InpSmPeriod1); smperiod2=int(InpSmPeriod2<2 ? 2 : InpSmPeriod2);
Lier des buffers des indicateurs à des tableaux avec la fonction SetIndexBuffer. Ses paramètres sont :
index : pour définir le numéro du buffer mémoire de l'indicateur, de 0 à 7 dans notre programme.
buffer[] : pour spécifier le tableau déclaré dans l'indicateur personnalisé.
data_type : pour spécifier le type de données stockées dans le tableau de l'indicateur.
SetIndexBuffer(0,indBuff,INDICATOR_DATA); SetIndexBuffer(2,momBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(3,momSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(4,momSmBuff2,INDICATOR_CALCULATIONS); SetIndexBuffer(5,absMomBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(6,absMomSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(7,absMomSmBuff2,INDICATOR_CALCULATIONS);
Fixer la valeur de la propriété correspondante de l’indicateur, cette propriété de l'indicateur (prop_value) doit être de type chaîne de caractères, en utilisant la fonction IndicatorSetString avec la variante d'appel avec spécification de l'identifiant de la propriété uniquement. Cette étape permet de donner un nom court à l'indicateur et de déterminer les périodes à afficher dans la partie supérieure gauche de la fenêtre de l'indicateur. Ses paramètres sont :
- prop_id : pour spécifier l'identifiant de la propriété de l'indicateur correspondante à l'une des valeurs de l'énumération ENUM_CUSTOMIND_PROPERTY_STRING. Ce sera INDICATOR_SHORTNAME dans notre programme.
- prop_value : pour spécifier la valeur de la propriété, qui sera un type de données de type chaîne de caractères. Il s'agira de "True Strength Index ("+(string)smperiod1+", "+(string)smperiod2+")".
IndicatorSetString(INDICATOR_SHORTNAME,"True Strength Index ("+(string)smperiod1+","+(string)smperiod2+")");
Définir une autre propriété de l'indicateur de type entier pour normaliser la valeur de l'indicateur avec la fonction IndicatorSetInteger et avec la variante d'appel en spécifiant uniquement l'identifiant de la propriété. Ses paramètres sont :
- prop_id : pour spécifier l'identifiant de la propriété de l'indicateur qui sera l'une des valeurs de l'énumération ENUM_CUSTOMIND_PROPERTY_INTEGER. Ce sera INDICATOR_DIGITS dans notre programme.
- prop_value : pour spécifier la valeur de la propriété, qui sera un type de données entier. Ce sera Digits().
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
Attribuer l'indicateur AS_SERIES au tableau à l'aide de la fonction ArraySetAsSeries.
ArraySetAsSeries(indBuff,true); ArraySetAsSeries(momBuff,true); ArraySetAsSeries(momSmBuff1,true); ArraySetAsSeries(momSmBuff2,true); ArraySetAsSeries(absMomBuff,true); ArraySetAsSeries(absMomSmBuff1,true); ArraySetAsSeries(absMomSmBuff2,true);
Après la fonction OnCalculate,
- Nous attribuerons l'indicateur AS_SERIES au tableau des prix de clôtures à partir de la partie OnCalculate, puis nous vérifierons si rates_total est inférieur à 2 pour renvoyer 0.
- Création d'une variable entière (limit) égale à rates_total - prev_calculated.
- Vérification si la variable limit est supérieure à 1, auquel cas nous devons effectuer les étapes suivantes :
- Mise à jour de la variable limit avec le résultat de rates_total - 2.
- Initialisation des tableaux numériques de type double avec une valeur prédéfinie à l'aide de la fonction ArrayInitialize. Ses paramètres sont array[] pour spécifier le tableau qui doit être initialisé, l'autre paramètre est value pour spécifier la nouvelle valeur qui doit être définie.
ArraySetAsSeries(close,true); if(rates_total<2) return 0; int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-2; ArrayInitialize(indBuff,EMPTY_VALUE); ArrayInitialize(momBuff,0); ArrayInitialize(momSmBuff1,0); ArrayInitialize(momSmBuff2,0); ArrayInitialize(absMomBuff,0); ArrayInitialize(absMomSmBuff1,0); ArrayInitialize(absMomSmBuff2,0); }
Création d'une boucle pour mettre à jour momBuff[i] et absMomBuff[i]. Les nouvelles fonctions utilisées dans cette étape sont les suivantes :
- Une boucle for avec ses trois expressions et un opérateur exécutable.
- IsStopped() pour vérifier s'il y a un arrêt forcé du programme mql5.
- MathAbs pour retourner la valeur absolue (module), nous pouvons utiliser la fonction fabs() pour le même résultat.
for(int i=limit; i>=0 && !IsStopped(); i--) { momBuff[i]=close[i]-close[i+1]; absMomBuff[i]=MathAbs(momBuff[i]); }
Vérification de ce qui suit à l'aide de la fonction ExponentialMAOnBuffer du fichier inclus MovingAverage.
if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,momBuff,momSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,absMomBuff,absMomSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,momSmBuff1,momSmBuff2)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,absMomSmBuff1,absMomSmBuff2)==0) return 0;
Création d'une autre boucle for pour mettre à jour la variable indBuff[i] :
for(int i=limit; i>=0 && !IsStopped(); i--) indBuff[i]=(absMomSmBuff2[i]!=0 ? 100.0*momSmBuff2[i]/absMomSmBuff2[i] : 0);
A la fin du programme, il y a la fonction return (rates_total)
return(rates_total);
Nous avons maintenant terminé le code pour créer notre indicateur personnalisé TSI. Vous pouvez également modifier vos préférences dans le code pour plus de personnalisation. Voici le code complet en un seul bloc de l'indicateur créé :
//+------------------------------------------------------------------+ //| simple TSI.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 8 #property indicator_plots 1 #property indicator_label1 "TSI" #property indicator_type1 DRAW_LINE #property indicator_color1 clrBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 3 #include <MovingAverages.mqh> input uint InpSmPeriod1 = 25; // Smoothing period 1 input uint InpSmPeriod2 = 13; // Smoothing period 2 int smperiod1; int smperiod2; double indBuff[]; double momBuff[]; double momSmBuff1[]; double momSmBuff2[]; double absMomBuff[]; double absMomSmBuff1[]; double absMomSmBuff2[]; int OnInit() { smperiod1=int(InpSmPeriod1<2 ? 2 : InpSmPeriod1); smperiod2=int(InpSmPeriod2<2 ? 2 : InpSmPeriod2); SetIndexBuffer(0,indBuff,INDICATOR_DATA); SetIndexBuffer(2,momBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(3,momSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(4,momSmBuff2,INDICATOR_CALCULATIONS); SetIndexBuffer(5,absMomBuff,INDICATOR_CALCULATIONS); SetIndexBuffer(6,absMomSmBuff1,INDICATOR_CALCULATIONS); SetIndexBuffer(7,absMomSmBuff2,INDICATOR_CALCULATIONS); IndicatorSetString(INDICATOR_SHORTNAME,"True Strength Index ("+(string)smperiod1+","+(string)smperiod2+")"); IndicatorSetInteger(INDICATOR_DIGITS,Digits()); ArraySetAsSeries(indBuff,true); ArraySetAsSeries(momBuff,true); ArraySetAsSeries(momSmBuff1,true); ArraySetAsSeries(momSmBuff2,true); ArraySetAsSeries(absMomBuff,true); ArraySetAsSeries(absMomSmBuff1,true); ArraySetAsSeries(absMomSmBuff2,true); return(INIT_SUCCEEDED); } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { ArraySetAsSeries(close,true); if(rates_total<2) return 0; int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-2; ArrayInitialize(indBuff,EMPTY_VALUE); ArrayInitialize(momBuff,0); ArrayInitialize(momSmBuff1,0); ArrayInitialize(momSmBuff2,0); ArrayInitialize(absMomBuff,0); ArrayInitialize(absMomSmBuff1,0); ArrayInitialize(absMomSmBuff2,0); } for(int i=limit; i>=0 && !IsStopped(); i--) { momBuff[i]=close[i]-close[i+1]; absMomBuff[i]=MathAbs(momBuff[i]); } if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,momBuff,momSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,0,smperiod1,absMomBuff,absMomSmBuff1)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,momSmBuff1,momSmBuff2)==0) return 0; if(ExponentialMAOnBuffer(rates_total,prev_calculated,smperiod1,smperiod2,absMomSmBuff1,absMomSmBuff2)==0) return 0; for(int i=limit; i>=0 && !IsStopped(); i--) indBuff[i]=(absMomSmBuff2[i]!=0 ? 100.0*momSmBuff2[i]/absMomSmBuff2[i] : 0); return(rates_total); }
Après avoir compilé ce code sans erreur, l'indicateur sera disponible dans le dossier Indicators du Navigateur. Vous pouvez le glisser et le déposer sur le graphique désiré. La fenêtre de l'indicateur sera affichée avec des entrées identiques à ce qui suit :
Nous avons donc deux entrées que l'utilisateur peut modifier. Les valeurs par défaut sont 25 pour la période de lissage 1 et 13 pour la période de lissage 2. Mais l'utilisateur peut les modifier en fonction de ses préférences, comme nous l'avons mentionné.
Nous pouvons voir dans l'image précédente que l'utilisateur peut choisir la couleur, la largeur et le style de la ligne TSI dans l'onglet des couleurs. Après avoir déterminé nos préférences et le style de l'indicateur comme nous l'avons mentionné, nous pouvons trouver l'indicateur sur le graphique comme suit :
Comme nous pouvons le voir dans le graphique précédent, la ligne de l'indicateur TSI se trouve dans une fenêtre séparée sous les prix et cette ligne oscille autour de 0. Nous avons le libellé de l'indicateur, ses périodes de lissage et la valeur de l'indicateur.
Un EA TSI personnalisé
Dans cette partie, nous allons apprendre de manière très simple comment utiliser notre indicateur personnalisé dans un système automatisé afin qu'il puisse générer un signal ou une action spécifique une fois qu'une condition spécifique est déclenchée. Nous commencerons par créer un système très simple en créant un Expert Advisor, qui générera un commentaire sur le graphique avec la valeur actuelle du TSI, avant de développer un EA qui exécute des instructions plus complexes.
Voici donc les étapes nécessaires à la création de notre Expert Advisor :
- Création d'une variable entière pour la valeur du TSI.
- Définition du TSI avec la fonction iCustom qui renvoie le handle de l'indicateur. Ses paramètres sont les suivants :
- symbol : pour spécifier le nom du symbole, nous utiliserons _Symbol pour le symbole actuel.
- period : pour spécifier la période, nous utiliserons _period pour utiliser la période en cours.
- name : pour spécifier le chemin d'accès à l'indicateur personnalisé.
- Affichage du texte "TSI System Removed" dans la partie OnDeinit(const int reason) une fois que l'EA est supprimé.
- Création du tableau tsiVal[]
- Récupération des données du buffer de l'indicateur TSI avec la fonction CopyBuffer et avec la variante d'appel par la première position et le nombre d'éléments requis. Ses paramètres sont :
- indicator_handle : pour spécifier l'indicateur retourné par l'indicateur, nous utiliserons TSI.
- buffer_num : pour spécifier le numéro du buffer de l'indicateur à utiliser, nous utiliserons 0.
- start_pos : pour spécifier la position de départ à copier, nous utiliserons 0.
- count : pour spécifier le nombre de données à copier, nous utiliserons 1.
- buffer[] : pour spécifier le tableau à copier, nous utiliserons tsiVal.
- La fonction Comment permet d'afficher la valeur actuelle du TSI convertie en chaîne de caractères avec la fonction DoubleToString, avec la valeur actuelle du TSI et le nombre de décimales à afficher, nous utiliserons _Digits dans ce cas.
Voici le code complet :
//+------------------------------------------------------------------+ //| customSimpleTSI-EA.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" int TSI; int OnInit() { TSI=iCustom(_Symbol,_Period,"My Files\\TSI\\simpleTSI"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("TSI System Removed"); } void OnTick() { double tsiVal[]; CopyBuffer(TSI,0,0,1,tsiVal); Comment("TSI Value ",DoubleToString(tsiVal[0],_Digits)); }
Après avoir compilé ce code sans erreur et l'avoir exécuté, il sera attaché au graphique. Voici un exemple de son signal lors d'un test :
Comme nous pouvons le voir, nous avons un commentaire dans le graphique en haut à gauche avec la valeur actuelle du TSI. Si nous voulons nous assurer que le signal est le même que celui basé sur l'indicateur, nous pouvons attacher l'EA et insérer l'indicateur en même temps pour être sûrs des valeurs. C'est pour cela qu'il faut s'assurer de notre travail :
Comme nous pouvons le voir en haut à droite, l'EA est attaché et son signal apparaît dans le coin supérieur gauche avec la valeur actuelle du TSI. En même temps, l'indicateur TSI est inséré dans le graphique dans une fenêtre séparée sous les prix et sa valeur au-dessus de sa ligne dans le coin gauche est la même que le signal de l'EA.
Système EA TSI
Dans cette partie, nous allons développer un EA basé sur l'indicateur TSI personnalisé créé pour obtenir des signaux basés sur une stratégie spécifique. Veuillez noter que la stratégie dont nous allons parler est uniquement destinée à des fins éducatives. En tout état de cause, elle devra être optimisée, comme n'importe quelle autre stratégie. Vous devez donc le tester avant de l'utiliser pour un compte réel afin de vous assurer qu'il vous est utile.
Nous utiliserons l'indicateur TSI personnalisé combiné aux deux moyennes mobiles pour obtenir des signaux d'achat et de vente sur la base d'une stratégie spécifique :
Nous utiliserons 2 moyennes mobiles simples, l'une rapide avec une période de 10 et l'autre lente avec une période de 20, en plus de notre indicateur TSI personnalisé. Si la valeur précédente de la MA rapide est inférieure à celle de la MA lente et que, dans le même temps, la MA rapide actuelle est supérieure à la MA lente actuelle, cela signifie que nous avons un croisement de MA haussier. Nous vérifierons ensuite si la valeur du TSI actuel est supérieure à zéro, nous devons obtenir un signal d'achat sous forme de commentaire sur le graphique. Si la valeur précédente de la MA rapide est supérieure à celle de la MA lente et, qu'en même temps la MA rapide actuelle est inférieure à la MA lente actuelle, cela signifie que nous avons un croisement de MA baissier. Nous vérifierons ensuite si la valeur du TSI actuel est inférieure à zéro, nous devons obtenir un signal de vente en commentaire sur le graphique.
Plus simplement :
Si fastMA[1] > slowMA[1] && fastMA[0] < slowMA[0] && tsiVal[0] < 0 ==> Signal de vente
Voici le code complet pour créer ce type de système :
//+------------------------------------------------------------------+ //| TSI System EA.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" input ENUM_MA_METHOD inpMAType = MODE_SMA; //Moving Average Type input ENUM_APPLIED_PRICE inpPriceType = PRICE_CLOSE; //Price type input int inpFastMAPeriod = 10; // Fast moving average period input int inpSlowMAPeriod = 20; //Slow moving average period int tsi; double fastMAarray[], slowMAarray[]; int OnInit() { tsi=iCustom(_Symbol,_Period,"My Files\\TSI\\simpleTSI"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { Print("TSI System Removed"); } void OnTick() { double tsiVal[]; CopyBuffer(tsi,0,0,1,tsiVal); int fastMA =iMA(_Symbol,_Period,inpFastMAPeriod,0,inpMAType,inpPriceType); int slowMA =iMA(_Symbol,_Period,inpSlowMAPeriod,0,inpMAType,inpPriceType); ArraySetAsSeries(fastMAarray,true); ArraySetAsSeries(slowMAarray,true); CopyBuffer(fastMA,0,0,3,fastMAarray); CopyBuffer(slowMA,0,0,3,slowMAarray); if(fastMAarray[1]<slowMAarray[1]&&fastMAarray[0]>slowMAarray[0]) { if(tsiVal[0]>0) { Comment("Buy Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } } if(fastMAarray[1]>slowMAarray[1]&&fastMAarray[0]<slowMAarray[0]&&tsiVal[0]<0) { if(tsiVal[0]<0) { Comment("Sell Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } } }
Les différences dans ce code sont les suivantes :
Créez 4 entrées pour l'utilisateur pour le type de moyenne mobile, le type de prix appliqué, la période de la moyenne mobile rapide et la période de la moyenne mobile lente, et attribuez-leur des valeurs par défaut.
input ENUM_MA_METHOD inpMAType = MODE_SMA; //Moving Average Type input ENUM_APPLIED_PRICE inpPriceType = PRICE_CLOSE; //Price type input int inpFastMAPeriod = 10; // Fast moving average period input int inpSlowMAPeriod = 20; //Slow moving average period
Création de 2 tableaux pour le tableau MA rapide et le tableau MA lente.
double fastMAarray[], slowMAarray[];
Définition des 2 moyennes mobiles à l'aide de la fonction iMA prédéfinie qui renvoie le handle de la moyenne mobile et dont les paramètres sont les suivants :
- symbol : nous utiliserons _Symbol pour l'appliquer au symbole actuel.
- period : nous utiliserons _period pour l'appliquer à la période actuelle.
- ma_period : nous utiliserons les données fournies par l'utilisateur pour les MA rapides et lentes.
- ma_shift : nous utiliserons 0 car il n'y a pas besoin de décalage.
- ma_method : nous utiliserons les données fournies par l'utilisateur pour le type des MA.
- applied_price : nous utiliserons les données saisies par l'utilisateur pour le type de prix.
int fastMA =iMA(_Symbol,_Period,inpFastMAPeriod,0,inpMAType,inpPriceType); int slowMA =iMA(_Symbol,_Period,inpSlowMAPeriod,0,inpMAType,inpPriceType);
Activation de l'indicateur AS_SERIES à l'aide de la fonction ArraySetAsSeries pour les MA lente et rapide
ArraySetAsSeries(fastMAarray,true); ArraySetAsSeries(slowMAarray,true);
Récupération des données des buffers des deux moyennes mobiles à l'aide de la fonction CopyBuffer
CopyBuffer(fastMA,0,0,3,fastMAarray); CopyBuffer(slowMA,0,0,3,slowMAarray);
Définition des conditions de la stratégie
En cas de signal d'achat :
Si la fastMA précédente est inférieure à la slowMA précédente, que la fastMA actuelle est supérieure à la slowMA actuelle et, qu'en même temps la valeur tsiVal actuelle est supérieure à zéro, l'EA doit renvoyer le signal d'achat sous forme de commentaire sur le graphique avec les valeurs suivantes :
- Signal d’Achat
- La valeur du TSI
- La valeur de fastMA
- La valeur de slowMA
if(fastMAarray[1]<slowMAarray[1]&&fastMAarray[0]>slowMAarray[0]) { if(tsiVal[0]>0) { Comment("Buy Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } }
En cas de signal de vente :
Si la fastMA précédente est supérieure à la slowMA précédente, que la fastMA actuelle est inférieure à la slowMA actuelle et, qu'en même temps la valeur tsiVal actuelle est inférieure à zéro, l'EA doit renvoyer le signal de vente sous forme de commentaire sur le graphique, avec les valeurs suivantes :
- Signal de Vente
- La valeur du TSI
- La valeur de fastMA
- La valeur de slowMA
if(fastMAarray[1]>slowMAarray[1]&&fastMAarray[0]<slowMAarray[0]&&tsiVal[0]<0) { if(tsiVal[0]<0) { Comment("Sell Signal", "\nTSI Value ",DoubleToString(tsiVal[0],_Digits), "\nfastMA ",DoubleToString(fastMAarray[0],_Digits), "\nslowMA ",DoubleToString(slowMAarray[0],_Digits)); } }
Après avoir compilé ce code sans erreur et l'avoir exécuté par glisser-déposer pour obtenir ses signaux, sa fenêtre sera affichée comme suit pour l'onglet Entrées :
Comme nous pouvons le voir, nous avons les 4 entrées du type de MA, du type de prix, de la période de MA rapide et de la période de MA lente. Après avoir défini nos préférences et appuyé sur OK, nous pouvons constater que l'EA est attaché au graphique et que ses signaux seront les mêmes que ceux décrits ci-dessous :
En cas de signal d'achat :
Comme nous pouvons le voir dans le graphique précédent, nous avons un signal d'achat sous la forme d'un commentaire dans le coin supérieur gauche, conformément aux conditions de notre stratégie, qui sont les mêmes que celles décrites ci-dessous :
- Signal d’Achat
- La valeur du TSI
- La valeur de fastMA
- La valeur de slowMA
En cas de signal de vente :
Comme nous pouvons le voir dans le graphique précédent, nous avons un signal de vente sous forme de commentaire dans le coin supérieur gauche, conformément aux conditions de notre stratégie :
- Signal de Vente
- La valeur du TSI
- La valeur de fastMA
- La valeur de slowMA
Conclusion
Dans cet article, nous avons appris comment vous pouvez créer votre propre indicateur technique True Strength Index afin de mettre en œuvre vos paramètres et préférences spécifiques. Nous avons vu quelles informations et quels aperçus cet indicateur fournit, ce qui peut s'avérer très utile dans le cadre du trading. Nous avons également appris comment utiliser cet indicateur personnalisé dans un système de trading simple pour générer la valeur actuelle de l'indicateur TSI sous forme de commentaire sur le graphique. Nous avons également vu comment utiliser l'indicateur dans un système de trading automatisé en créant l'EA qui utilise les données du TSI combinées à un autre outil technique, qui dans notre cas est la moyenne mobile. Cette combinaison du TSI personnalisé et de deux moyennes mobiles a généré des signaux d'achat et de vente basés sur une stratégie spécifique, que nous avons examinée en détail dans la rubrique TSI System EA.
J'espère que cet article vous sera utile pour votre apprentissage du trading et de la programmation. Si vous souhaitez lire d'autres articles sur les indicateurs et apprendre à créer des systèmes de trading basés sur les indicateurs techniques les plus populaires, veuillez consulter mes articles précédents, dans lesquels j'aborde des indicateurs populaires tels que la moyenne mobile, les bandes de Bollinger, le RSI, le MACD, le Stochastique, le SAR parabolique, l'ATR, et d'autres encore.
Traduit de l’anglais par MetaQuotes Ltd.
Article original : https://www.mql5.com/en/articles/12570
Avertissement: Tous les droits sur ces documents sont réservés par MetaQuotes Ltd. La copie ou la réimpression de ces documents, en tout ou en partie, est interdite.
Cet article a été rédigé par un utilisateur du site et reflète ses opinions personnelles. MetaQuotes Ltd n'est pas responsable de l'exactitude des informations présentées, ni des conséquences découlant de l'utilisation des solutions, stratégies ou recommandations décrites.





- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Tout d'abord, merci pour cet article.
Mais corrigez si je me trompe, je ne voyais que 7 tampons d'indicateurs créés, mais il y en a 8 de déclarés
Avez-vous mal calculé ?
Bonjour, très bon article,
pourquoi remplir la période 1 dans les 2 fonctions inférieures et non la période 0.