English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
preview
Apprenez à concevoir un système de trading basé sur l’OBV

Apprenez à concevoir un système de trading basé sur l’OBV

MetaTrader 5Trading | 5 décembre 2022, 08:55
753 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

Introduction

Dans ce nouvel article, nous découvrirons un nouvel indicateur technique qui utilise le volume et qui peut nous aider à avoir une perspective différente : nous parlerons en détail de l'indicateur On-Balance Volume (OBV). Voici les sujets que nous allons aborder :

  1. Définition de l’OBV
  2. Stratégie basée sur l’OBV
  3. Plan de la stratégie basée sur l’OBV
  4. Système de trading basé sur l’OBV
  5. Conclusion

Nous découvrirons en détail l'OBV au travers de sa définition. Nous identifierons comment il est mesuré et comment le calculer au travers d’un exemple. Nous pourrons ensuite identifier et en apprendre davantage sur cet indicateur pour savoir comment l'utiliser correctement. Nous apprendrons à utiliser l'indicateur OBV en utilisant des stratégies simples basées dessus. Et après avoir identifié comment l'utiliser au travers de stratégies simples, nous concevrons un plan pour ces stratégies qui nous aidera à écrire le code d’un Expert Advisor en MQL5. Après avoir conçu le plan des stratégies, nous serons prêts à écrire notre code en MQL5 pour créer notre Expert Advisor et l'utiliser dans MetaTrader 5 afin d’exécuter nos stratégies de trading automatiquement.

Je dois mentionner que nous utiliserons dans cet article le langage MQL5 (MetaQuotes Language) pour écrire et créer nos Expert Advisors. Nous les exécuterons ensuite sur la plateforme de trading MetaTrader 5. Si vous voulez en savoir plus sur l'installation de MetaTrader 5, comment utiliser le langage MQL5 intégré à MetaTrader 5, vous pouvez consulter ce précédent article sur l’écriture de code MQL5 dans MetaEditor. Je recommande d'appliquer vous-même ce que vous lisez pour maîtriser ce que vous apprenez. La pratique est un outil très important pour maîtriser quoi que ce soit.

Avertissement : Toutes les informations sont fournies "en l'état", uniquement à des fins d'information, et ne sont pas données à des fins de trading ou de conseil. Ces informations ne garantissent aucun type de résultat. Si vous utilisez le contenu de cet article sur l'un de vos comptes de trading, vous le faites à vos propres risques et vous en serez le seul responsable.

Approfondissons maintenant cet article pour apprendre un nouvel outil et l'ajouter à notre boîte à outils pour une expérience de trading améliorée.


Définition de l’OBV

Dans cette partie, nous allons en apprendre plus sur l'indicateur On-balance Volume (OBV). Mais parlons d'abord du volume (car cet indicateur fait partie des indicateurs de volume). Le volume est le nombre d'actions ou de contrats qui se négocient pendant une période de temps spécifique. Un volume élevé signifie que l’instrument est négocié activement. Et vice versa, un faible volume signifie que l'instrument n'est pas activement négocié.

La notion de volume est très importante car si le prix d’un instrument monte ou descend et est accompagné d'un volume élevé, le mouvement sera plus fort que s’il était accompagné d'un volume faible. Le volume doit évoluer avec la tendance. Lorsque nous avons une tendance à la hausse, il est préférable que le volume augmente. Et lors d’une tendance à la baisse, nous pouvons constater que le volume augmente avec une baisse mouvements et diminue avec des corrections à la hausse.

Le volume confirme également si les cassures sont réelles ou s'il s'agit simplement de fausses cassures : lorsque les cassures se font avec un volume élevé, ce sera un signal que ces cassures continueront. 

Si cette relation entre la tendance et le volume continue de la même façon, ce sera un signe de force pour la tendance actuelle et si elle change, ce sera un signe de faiblesse. Si vous ne savez pas quelle est la tendance, vous pouvez lire cet article précédent sur la définition de la tendance.

Le On-balance Volume (OBV) a été développé par Joseph Granville. Il mesure le flot volumique positif et négatif. Maintenant, nous devons voir comment le calculer. Les étapes de calcul sont les suivantes :

  1. Vérifier le cours de clôture - s'il est en hausse ou en baisse.
  2. Ajouter le volume des jours à la hausse à la valeur précédente de l’OBV.
  3. Soustraire le volume des jours à la baisse de la valeur précédente de l’OBV.
  4. Si le prix de clôture d'aujourd'hui est égal au prix de clôture d'hier, alors la valeur de l’OBV d'aujourd'hui sera égale à la valeur de l’OBV d'hier.

Voyons donc un exemple de ces étapes et calculons l'indicateur OBV. Supposons que nous ayons les données suivantes pour un instrument :

Jour Clôture Volume
1 54
2 55 10 000
3 60 15 000
4 65 20 000
5 60 10 000
6 55 5 000
7 60 7 000
8 50 7 500
9 48,75 8 000
10 49 5 000
11 48 6 000
12 47,75 7 500
13 48 9 000
14 47,50 10 000
15 48 7 000
16 47 7 500
17 46 6 000
18 44 5 000
19 45 15 000

Calculons l'indicateur OBV à partir des données précédentes :

Nous vérifierons les cours de clôture et déciderons s'ils sont supérieurs ou non au cours de clôture précédent. S'il est supérieur au prix de clôture du jour précédent, nous ajouterons à côté "Positif" pour indiquer que ce jour a un mouvement à la hausse. S'il est inférieur au prix de clôture du jour précédent, nous ajouterons à côté "Négatif" pour indiquer que ce jour a un mouvement à la baisse.

Calcul de l’OBV 1

Ensuite, nous ajouterons le volume des jours positifs et nous soustrairons le volume des jours négatifs à la valeur précédente de l’OBV.

Calcul de l’OBV 2

Les valeurs de l’OBV sont maintenant calculées et elles apparaissent sous forme de courbe pour mesurer le débit volumique positif et négatif. Heureusement, nous n'avons pas besoin de calculer cet indicateur manuellement car vous pouvez le trouver parmi les indicateurs intégrés dans MetaTrader 5. L'image suivante montre comment insérer cet indicateur sur le graphique :

Insertion de l’OBV

Une fois l'indicateur sélectionné, la fenêtre de paramètres de l'indicateur suivante s'ouvrira :

Insertion de l’OBV 1

1 - le type de volumes

2 - la couleur de la courbe de l’OBV

3 - le style de la courbe de l’OBV

4 - l'épaisseur de la courbe de l’OBV

Après avoir défini les paramètres souhaités et cliqué sur OK, l'indicateur sera attaché au graphique :

OBV attaché au graphique


Stratégie basée sur l’OBV

Dans cette partie, nous allons apprendre à utiliser l'indicateur OBV d’après son concept. Nous allons voir des stratégies simples. Mais veuillez noter que ces stratégies peuvent tout de même ne pas convenir à tout le monde. Par conséquent, quelque soit la stratégie que vous choisissez, vous devez toujours la tester avant de l'utiliser. Nous considérons ici toutes ces stratégies avec comme objectif principal d'apprendre les bases de l'indicateur OBV et de voir comment cela fonctionne.

  • 1ère stratégie : Mouvement OBV simple

Pour cette stratégie, nous devons identifier la direction de la courbe de l’OBV en comparant la valeur actuelle de l’OBV avec sa valeur précédente et voir si la valeur actuelle est supérieure à la précédente, ce qui signifie que l'OBV augmente. Inversement, si la valeur actuelle est inférieure à la valeur précédente, l'OBV diminue.

Vous pouvez modifier la longueur des données dont vous avez besoin pour comparer l'OBV actuel avec plus de données précédentes. Mais ici, nous partageons simplement la façon dont nous pouvons utiliser l'indicateur et comment nous pouvons coder cette utilisation dans MQL5. Vous pourrez l'optimiser par la suite selon vos préférences.

OBV actuel > OBV précédent --> OBV en hausse

OBV actuel < OBV précédent --> OBV est en baisse

  • 2ème stratégie : Force OBV Simple

Pour cette stratégie, nous devons identifier la force de la valeur actuelle de l’OBV en la comparant à la moyenne des 4 valeurs précédentes de l’OBV. Si la valeur actuelle de l’OBV est supérieure à la moyenne des 4 valeurs précédentes, l'OBV est fort. Et vice versa. Si la valeur actuelle de l’OBV est inférieure à la moyenne des 4 valeurs précédentes, alors l'OBV est faible.

Vous pouvez également augmenter la longueur de la moyenne pour la comparer avec les données actuelles, mais l'objectif ici est de voir comment utiliser l'indicateur. Vous pouvez ensuite ajuster ce que vous voulez en fonction de vos préférences et des résultats des tests. 

OBV actuel > AVG des 4 valeurs précédentes --> OBV fort

OBV actuel < AVG des 4 valeurs précédentes --> OBV faible

  • 3ème stratégie : OBV Simple - tendance haussière

En tendance haussière, comme nous le savons, il est préférable de voir le volume évoluer avec la tendance. L'OBV devrait donc augmenter avec le mouvement ascendant. Cette stratégie permet donc d'évaluer si le mouvement est fort ou non. Nous comparerons la valeur actuelle de l’OBV avec sa valeur précédente et nous comparerons le haut actuel avec le haut précédent. Lorsque la valeur actuelle de l’OBV est supérieure à la valeur précédente et que le sommet actuel est supérieur au sommet précédent, le mouvement à la hausse est fort pendant la tendance haussière.

OBV actuel > OBV précédent et plus haut actuel > plus haut précédent --> Fort mouvement pendant la tendance haussière

  • Quatrième stratégie : OBV Simple - tendance baissière

Pendant la tendance baissière, il est préférable de voir le volume évoluer avec la tendance. L'OBV devrait augmenter avec le mouvement vers le bas. Cela permet de déterminer si le mouvement est fort ou non. Nous allons comparer la valeur actuelle de l’OBV avec la valeur précédente et comparer également le bas actuel avec le bas précédent. Lorsque la valeur actuelle de l’OBV est inférieure à la valeur précédente et que le bas actuel est inférieur au bas précédent, le mouvement à la baisse est fort pendant la tendance à la baisse.

OBV actuel < OBV précédent et plus bas actuel < plus bas précédent --> Fort mouvement pendant la tendance baissière


Plan de la stratégie basée sur l’OBV

Dans cette partie, nous allons maintenant concevoir un plan pour chaque stratégie. Il fournira une description claire, étape par étape, de la façon de concevoir un système de trading pour chaque stratégie. Tout d'abord, nous devons concevoir un OBV simple affichant un commentaire sur le graphique avec la valeur actuelle de l’OBV. Voici le plan :

Plan OBV Simple

  • 1ère stratégie : Mouvement OBV simple

Dans cette stratégie, nous devons connaître la direction de la courbe de l’OBV en fonction de la valeur actuelle de l’OBV et de la valeur précédente. Ainsi, pour chaque tick, nous devons vérifier l'OBV actuel et sa valeur précédente. Lorsque la valeur actuelle est supérieure à la précédente, c’est le signe que l'OBV augmente. Et vice versa, lorsque la valeur actuelle est inférieure à la précédente, c’est le signe que l'OBV est en baisse.

Ce qui suit est un plan, étape par étape, pour cette stratégie afin de nous aider à concevoir un système de trading :

Plan du mouvement OBV Simple

  • 2ème stratégie : Force OBV Simple

Dans cette stratégie, nous devons mesurer la force de l'OBV actuel en le comparant à la moyenne des 4 valeurs précédentes. Si l'OBV actuel est supérieur à la moyenne des 4 valeurs précédentes, l'OBV est fort. Et inversement, si l'OBV actuel est inférieur à la moyenne des 4 valeurs précédentes, l'OBV est faible.

Voici le plan étape par étape pour créer ce système de trading :

Plan Force OBV Simple

  • 3ème stratégie : OBV Simple - tendance haussière

Dans cette stratégie, nous allons utiliser l’indicateur de volume OBV pour mesurer l'évolution actuelle des prix. Ainsi, pendant la tendance haussière, nous devons vérifier la valeur actuelle de l’OBV et la comparer avec la valeur précédente. Si la valeur actuelle est supérieure à la valeur précédente, nous devons vérifier le prix haut actuel et le comparer avec le prix élevé précédent. Si la valeur actuelle est supérieure à la valeur précédente, ce sera un signe que le mouvement ascendant actuel est fort pendant la tendance haussière.

Voici un plan étape par étape pour coder cette stratégie :

OBV Simple - Plan de tendance haussière

  • Quatrième stratégie : OBV Simple - tendance baissière

Dans cette stratégie, pendant la tendance à la baisse, nous devons vérifier la valeur actuelle de l’OBV et la comparer avec la valeur précédente. Si la valeur actuelle est inférieure à la valeur précédente, nous devons vérifier le prix bas actuel et le comparer avec le prix bas précédent. Si la valeur actuelle est inférieure à la valeur précédente, ce sera un signe que le mouvement baissier actuel est fort.

Voici un plan étape par étape pour coder cette stratégie :

OBV Simple - Plan de tendance baissière


Système de trading basé sur l’OBV

Dans cette partie, nous apprendrons comment créer un système de trading pour chaque stratégie afin de tirer parti de la programmation et de MQL5. La programmation est un outil magique qui peut nous faciliter la vie en créant un système automatique qui fera ce dont nous avons besoin avec précision et rapidité.

Nous allons maintenant commencer à créer un système de trading pour chaque stratégie. Nous allons tout d’abord créer un système de trading OBV Simple pour afficher un commentaire sur le graphique avec la valeur actuelle de l’OBV.

  • Création d'un tableau de "double" pour les valeurs de l’OBV. Le "double" est un type réel, ou un type à virgule flottante, représentant des valeurs avec une partie fractionnaire. Pour votre information, il existe deux types de virgule flottante : les doubles et les flottants. Le type "double" représente les nombres avec la double précision du type flottant :
double OBVArray[];
  • Tri du tableau de l’OBV à l'aide de la fonction "ArraySetAsSeries" qui renvoie true ou false :
ArraySetAsSeries(OBVArray,true);

  • Définition de l'OBV avec la fonction "iOBV" après avoir créé une variable de type "integer" pour la variable OBVDef. La fonction "iOBV" renvoie le handle de l'indicateur On Balance Volume. Ses paramètres sont : symbole, période et volume appliqué :
int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
  • Remplissage du tableau OBVArray avec OBVDef en utilisant la fonction "CopyBuffer" qui renvoie le nombre de données copiées. Ses paramètres sont : handle de l'indicateur, indice du buffer, heure de début, heure d'arrêt, buffer :
CopyBuffer(OBVDef,0,0,3,OBVArray);
  • Calcul de la valeur actuelle de l’OBV après avoir créé une variable de type "double" pour OBVValue :
double OBVValue=OBVArray[0];
  • Création d'un commentaire en utilisant la fonction "comment" pour afficher un commentaire sur le graphique avec la valeur actuelle de l’OBV :
Comment("OBV Value is: ",OBVValue);

Voici le code complet du système de trading affichant la valeur actuelle de l’OBV sous forme de commentaire :

//+------------------------------------------------------------------+
//|                                                   Simple OBV.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an array for OBV
   double OBVArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(OBVArray,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray);
   
   //calculating current OBV value
   double OBVValue=OBVArray[0];
   
   //creating a comment with OBV value
   Comment("OBV Value is: ",OBVValue);  
  }
//+------------------------------------------------------------------+

Après avoir compilé ce code, nous le trouverons dans la fenêtre du Navigateur de MetaTrader 5 :

OBV dans le Navigator 1

Pour l’exécuter, nous devons double-cliquer sur le fichier ou le glisser-déposer sur le graphique. La fenêtre suivante apparaît :

Fenêtre OBV Simple

Après avoir appuyé sur "OK", l’Expert Advisor sera alors attaché au graphique :

OBV Simple attaché

Le signal généré apparaît comme prévu :

Signal de test OBV Simple

Pour nous assurer que la valeur que l'indicateur On Balance Volume intégré à Meta Trader 5 retourne la même valeur, nous pouvons insérer l'indicateur On Balance Volume comme mentionné précédemment. Nous pouvons voir que les valeurs sont les mêmes :

OBV Simple - même valeur que l'indicateur

 Maintenant, nous devons créer un système de trading pour chaque stratégie mentionnée. Voici comment procéder.

  • 1ère stratégie : Mouvement OBV simple

Pour cette stratégie, nous devons comparer deux valeurs : la valeur actuelle de l’OBV avec la valeur précédente de l’OBV. Si la valeur actuelle est supérieure à la valeur précédente, un signal doit apparaître sous la forme d’un commentaire sur le graphique indiquant "OBV en hausse", la valeur actuelle de l'OBV et la valeur précédente de l'OBV. Voici le code complet de cette stratégie :

//+------------------------------------------------------------------+
//|                                          Simple OBV movement.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
//creating an two arrays for OBV
   double OBVArray1[];
   double OBVArray2[];

//sorting the array from the current data
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);

//defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

//defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
   CopyBuffer(OBVDef,0,0,3,OBVArray2);

//getting the value of current and previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
   double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

//creating conditions of rising and declining OBV based on its values   
   if(OBVCurrentValue>OBVPrevValue)
     {
      Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

   if(OBVCurrentValue<OBVPrevValue)
     {
      Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

  }
//+------------------------------------------------------------------+
  • Différences dans le code :
 Création de 2 tableaux pour l'OBV :
double OBVArray1[];
double OBVArray2[];

Tri de ces 2 tableaux à partir des données actuelles :

ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);

Remplissage de ces 2 tableaux :

CopyBuffer(OBVDef,0,0,3,OBVArray1);
CopyBuffer(OBVDef,0,0,3,OBVArray2);

Récupération des valeurs de l'OBV en utilisant la fonction "NormalizeDouble" qui renvoie un type de valeur double avec une précision prédéfinie, après avoir créé une variable pour OBVCurrentValue et OBVPrevValue. Les paramètres de "NormalizeDouble" sont : valeur, précision. La valeur sera le tableau OBVArray, et la précision sera 5 :

double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

Réglage des conditions de l'OBV croissant et décroissant à l'aide de la fonction "if" :

if(OBVCurrentValue>OBVPrevValue)
   {
    Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

if(OBVCurrentValue<OBVPrevValue)
   {
    Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

Après l’avoir compilé, l'Expert Advisor apparaîtra dans la fenêtre du Navigateur dans le dossier "Expert Advisors" de la plateforme de trading MetaTrader 5, comme suit :

OBV dans le Navigator 2

En double-cliquant sur l'Expert Advisor, la fenêtre suivante apparaît :

Fenêtre du Mouvement OBV Simple

Après avoir appuyé sur "OK", l'Expert Advisor sera attaché au graphique :

Mouvement OBV Simple attaché au graphique

Voici des exemples de tests de signaux générés avec cette stratégie :

OBV en hausse :

Signal de Mouvement OBV Simple en hausse

OBV en baisse :

Signal de Mouvement OBV Simple en baisse

  • 2ème stratégie : Force OBV Simple

Selon cette stratégie, nous devons comparer 2 valeurs : la valeur actuelle de l’OBV et la valeur moyenne des 4 valeurs précédentes de l’OBV. Si la valeur actuelle est supérieure à la moyenne, cela signifie que "l'OBV est fort" et inversement, si la valeur actuelle est inférieure à la moyenne cela signifie que "l'OBV est faible". Voici le code complet du système de trading de cette stratégie :

//+------------------------------------------------------------------+
//|                                          Simple OBV Strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating an six arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   double OBVArray2[];
   double OBVArray3[];
   double OBVArray4[];
   
   //sorting arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);
   ArraySetAsSeries(OBVArray3,true);
   ArraySetAsSeries(OBVArray4,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,5,OBVArray0);
   CopyBuffer(OBVDef,0,0,5,OBVArray1);
   CopyBuffer(OBVDef,0,0,5,OBVArray2);
   CopyBuffer(OBVDef,0,0,5,OBVArray3);
   CopyBuffer(OBVDef,0,0,5,OBVArray4);
   
   //getting the value of current OBV & previous 5 values
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
   double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
   double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
   double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);
   
   //calculating average of previous OBV value
   double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);
   
   if(OBVCurrentValue>OBVAVG)
   {
      Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
   if(OBVCurrentValue<OBVAVG)
   {
      Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
  }
//+------------------------------------------------------------------+
  • Différences dans le code :

Création de 5 tableaux pour les valeurs de l’OBV :

double OBVArray0[];
double OBVArray1[];
double OBVArray2[];
double OBVArray3[];
double OBVArray4[];

Tri de ces tableaux créés à partir des données actuelles :

ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);
ArraySetAsSeries(OBVArray3,true);
ArraySetAsSeries(OBVArray4,true);

Remplissage des tableaux avec OBVDef :

CopyBuffer(OBVDef,0,0,5,OBVArray0);
CopyBuffer(OBVDef,0,0,5,OBVArray1);
CopyBuffer(OBVDef,0,0,5,OBVArray2);
CopyBuffer(OBVDef,0,0,5,OBVArray3);
CopyBuffer(OBVDef,0,0,5,OBVArray4);

Récupération des valeurs de l'OBV actuel et des 4 précédentes :

double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);

Calcul de la moyenne des 4 valeurs précédentes de l’OBV après création d'une variable de type double pour OBVAVG :

double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);

Réglage des conditions de l'OBV fort et faible avec le commentaire :

if(OBVCurrentValue>OBVAVG)
{
 Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}
   
if(OBVCurrentValue<OBVAVG)
{
 Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}

Après compilation, nous retrouverons le même Expert Advisor que le suivant dans la fenêtre du Navigateur :

OBV dans le Navigator 3

Voici la fenêtre de l'Expert Advisor après avoir choisi le fichier à exécuter sur MetaTrader 5 :

Fenêtre de Force OBV Simple

Après avoir appuyé sur "OK", l'Expert Advisor sera attaché au graphique :

Force OBV Simple attaché

Voici des exemples de tests de signaux :

OBV fort :

Force OBV Simple - fort

OBV faible :

Force OBV Simple - faible

  • 3ème stratégie : OBV Simple - tendance haussière

Selon cette stratégie, en tendance haussière, nous devons vérifier si nous avons un prix haut plus élevé et une valeur de l’OBV plus élevée également. Nous devons donc vérifier si la valeur actuelle de l’OBV est supérieure à sa valeur précédente, et si le prix haut actuel est supérieur au prix haut précédent. Dans ce cas, nous avons un signal de "mouvement fort pendant la tendance haussière". Voici le code complet de cette stratégie :

//+------------------------------------------------------------------+
//|                                         Simple OBV - Uptrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //creating a string variable for signal
   string signal="";
   
   //creating two OBV arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill arrays with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current & the previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current high & the previous high
   double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 
      
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current high> previous high
   if(OBVCurrentValue > OBVPrevValue && PriceArray0[0].high>PriceArray0[1].high)
   {
      signal="Strong move during uptrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue);            
  }
//+------------------------------------------------------------------+

Différences dans le code :

Création d'une variable de type "string" (chaîne de caractères) pour "signal", pour stocker les chaînes de texte que nous calculerons plus tard :

string signal="";

Création de 2 tableaux d’éléments de type "double" pour l’OBV et de 2 tableaux pour les prix d’éléments de type "MqlRates" pour stocker les prix, le volume et l'écart :

//creating two OBV arrays for OBV
double OBVArray0[];
double OBVArray1[];
   
//creating two price arrays
MqlRates PriceArray0[];
MqlRates PriceArray1[];1[];

Tri de ces tableaux à partir des données actuelles :

//sorting OBV arrays from the current data
ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);   
   
//sorting Price arrays from the current data
ArraySetAsSeries(PriceArray0,true);
ArraySetAsSeries(PriceArray1,true);

Remplissage des tableaux de prix avec à l'aide de la fonction "CopyRates" qui obtient les données d'historique de la structure "MqlRates", après avoir créé des variables de type entier pour Data0 et Data1 pour chaque tableau :

int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);

Définition de l'OBV et remplissage des 2 tableaux OBVArray avec :

int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

CopyBuffer(OBVDef,0,0,3,OBVArray0);
CopyBuffer(OBVDef,0,0,3,OBVArray1);

Récupération des valeurs de l'OBV et des plus hauts :

//getting the value of current & the previous OBV
double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
//getting the value of current high & the previous high
double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 

Conditions de réglage du "Mouvement fort pendant la tendance haussière" et du commentaire :

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue); 

Une fois compilé, l’Expert Advisor se trouve dans la fenêtre du Navigateur :

OBV dans le Navigateur 4

La fenêtre de l’Expert Advisor après avoir choisi le fichier à exécuter sur MetaTrader 5 :

Fenêtre de OBV Simple - tendance haussière

Après avoir appuyé sur "OK", l'Expert Advisor sera attaché au graphique :

OBV Simple - Tendance haussière attaché

Voici des exemples de tests de signaux :

Signal avec la fenêtre des données pour les données actuelles :

OBV Simple - Signal de tendance à la hausse avec la fenêtre des données actuelles

Signal avec la fenêtre des données pour les données précédentes :

OBV Simple - Signal de tendance à la hausse avec la fenêtre des données précédentes

  • Quatrième stratégie : OBV Simple - tendance baissière

Pour cette stratégie, ce sera l'inverse de la stratégie OBV Simple - tendance haussière, car nous devons vérifier si nous avons un prix bas inférieur et une valeur inférieure de l'OBV. Nous devons donc vérifier si la valeur actuelle de l’OBV est inférieure à la valeur précédente et si le prix bas actuel est inférieur au prix bas précédent. Dans ce cas, nous avons un signal de "mouvement fort pendant la tendance baissière". Voici le code complet de cette stratégie :


//+------------------------------------------------------------------+
//|                                       Simple OBV - Downtrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   //create a string variable for signal
   string signal="";
   
   //creating two OBV arrays
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill array with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current OBV & the previous value
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current OBV & the previous value
   double CurrentLowValue=NormalizeDouble(PriceArray0[0].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray1[1].low,5); 
       
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current low> previous low
   if(OBVCurrentValue < OBVPrevValue && PriceArray0[0].low<PriceArray0[1].low)
   {
      signal="Strong move during downtrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue);            
  }
//+------------------------------------------------------------------+
  • Différences dans le code :

Condition de réglage du "Mouvement fort pendant la tendance baissière" et le commentaire :

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue); 

Nous pouvons maintenant le compiler, puis nous pourrons trouver l'Expert Advisor dans la fenêtre du Navigateur comme suit :

OBV dans le Navigateur 5

Après avoir glissé et déposé ce fichier sur le graphique, la fenêtre suivante sera affichée :

OBV Simple - Fenêtre de tendance baissière

En appuyant sur le bouton "OK", l'Expert Advisor sera attaché de la même manière que l'image suivante :

OBV Simple - Tendance baissière attaché

Voici un exemple de signaux générés :

Signal avec la fenêtre des données actuelles :

OBV Simple - Signal de tendance à la baisse avec la fenêtre des données actuelles

Signal avec la fenêtre des données précédentes :

OBV Simple - Signal de tendance à la baisse avec la fenêtre des données précédentes


Conclusion

En conclusion, nous avons appris un nouvel indicateur technique qui utilise le volume dans son calcul. Ceci permet d’obtenir une autre perspective dans le graphique pour améliorer nos décisions de trading. Cet indicateur est le On Balance Volume (OBV). Nous avons pu le voir en détail, ce qu’il est, ce qu'il mesure et comment le calculer. Nous avons également vu comment l'utiliser et appris quelques stratégies simples qui peuvent être utiles ou peuvent nous aider à concrétiser de nouvelles idées. C'est l'objectif principal de cet article et des autres articles de cette série. Nous avons conçu un plan pour chaque stratégie. Celui-ci nous aide à écrire le code de chaque stratégie afin de créer un système de trading. Après cela, nous avons créé un Expert Advisor en MQL5 (MetaQuotes Language) pour chaque stratégie afin de les exécuter dans la plateforme de trading MetaTrader 5 pour générer des signaux automatiquement et avec précision.

Je tiens à mentionner que l'une des choses les plus bénéfiques dans l'analyse technique est que nous pouvons voir plus d'une perspective sur l'instrument financier selon l'outil que nous utilisons. Nous pouvons également combiner plus d'un outil ou indicateur pour avoir une vue d'ensemble de l'instrument financier afin de pouvoir prendre clairement la décision appropriée. Cette approche nous aide à créer un système de trading fiable. Gardez cette approche lorsque vous lisez ou apprenez quelque chose. Cela vous permettra de réaliser quel outil peut être utilisé avec un autre pour vous donner des informations plus claires et de meilleurs résultats.

Je dois vous redire à nouveau que cet article et les autres de cette série sont uniquement à des fins éducatives et conçus pour les débutants uniquement afin d’apprendre que la programmation en MQL5 peut vous aider énormément. Vous devez toujours tester toute stratégie avant de l'utiliser, car il n'existe rien qui puisse convenir à tout le monde. Vous devez faire votre travail en les testant et en les validant pour vous. Je vous conseille de tout appliquer par vous-même pour approfondir votre apprentissage et votre compréhension.

J'espère que vous avez trouvé cet article utile. Et j'espère que vous avez également appris quelque chose, que ce soit sur le sujet de cet article ou sur tout autre sujet connexe dans le monde du trading. Si vous avez trouvé cet article utile et que vous souhaitez lire des articles similaires, vous pouvez lire mes articles précédents de cette série pour apprendre à concevoir un système de trading basé sur les indicateurs techniques les plus populaires.

Traduit de l’anglais par MetaQuotes Ltd.
Article original : https://www.mql5.com/en/articles/10961

Apprenez à concevoir un système de trading utilisant l’Accumulation/Distribution (AD) Apprenez à concevoir un système de trading utilisant l’Accumulation/Distribution (AD)
Bienvenue dans ce nouvel article de notre série sur l'apprentissage de la conception de systèmes de trading basés sur les indicateurs techniques les plus populaires. Dans cet article, nous découvrirons un nouvel indicateur technique appelé indicateur d'Accumulation/Distribution et découvrirons comment concevoir un système de trading en MQL5 basé sur des stratégies de trading AD Simples.
Développer un Expert Advisor à partir de zéro (partie 11) : Système d’ordre croisés Développer un Expert Advisor à partir de zéro (partie 11) : Système d’ordre croisés
Dans cet article, nous allons créer un système d’ordres croisés. Il existe un type d'actifs qui rend la vie des traders très difficile : les contrats à terme. Mais pourquoi ?
Opérations sur les Matrices et les Vecteurs en MQL5 Opérations sur les Matrices et les Vecteurs en MQL5
Les matrices et les vecteurs ont été introduits en MQL5 pour améliorer les opérations mathématiques. De nouvelles méthodes sont intégrées avec ces nouveaux types pour créer un code concis et compréhensible, proche de la notation mathématique. Les tableaux offrent des possibilités étendues, mais il existe de nombreux cas dans lesquels les matrices sont beaucoup plus efficaces.
Développer un Expert Advisor à partir de zéro (partie 10) : Accéder aux indicateurs personnalisés Développer un Expert Advisor à partir de zéro (partie 10) : Accéder aux indicateurs personnalisés
Comment accéder aux indicateurs personnalisés directement depuis un Expert Advisor ? Un EA de trading ne peut être vraiment utile que s'il peut utiliser des indicateurs personnalisés ; sinon, ce n'est qu'un ensemble de lignes de codes et d'instructions.