English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Graphique Liquide

Graphique Liquide

MetaTrader 5Trading | 13 janvier 2022, 15:55
241 0
Serhii Shevchuk
Serhii Shevchuk

Introduction

Une fois, j'ai remarqué que les graphiques avec la période H4 et supérieure semblaient différents chez chaque broker. La raison en était que les brokers étaient situés dans des fuseaux horaires différents. Dans certains cas, certaines parties des mêmes graphiques étaient significativement différentes malgré une petite différence entre les fuseaux horaires. Sur un graphique, il y avait un modèle d'inversion distinct et la même partie de l'autre ne représentait aucun modèle précis.

Ensuite, il m'est venu à l'esprit d'écrire un indicateur qui redessinerait le graphique H1 de sorte qu'il y ait toujours une barre de fermeture complète à droite. La période M1 a été choisie comme source de prix. En conséquence, un graphique horaire était redessiné toutes les minutes et en une heure j'avais 60 variétés du même graphique horaire. Sa forme changeait de manière fluide, révélant des motifs cachés sur lesquels le motif initial n'avait même pas d'indice.

J'ai appelé cet indicateur «graphique liquide» pour son apparence spécifique. Selon le mode de traçage, le graphique « s'écoule » (est redessiné) soit lorsqu'une nouvelle barre de la période de base apparaît, soit lorsque la valeur du décalage statique est modifiée. Dans cet article, nous examinerons les principes de traçage d'un «graphique liquide», puis écrirons un indicateur et comparerons l'efficacité de l'utilisation de cette technologie pour les experts négociant par indicateurs et les experts négociant par modèles.



1. Principe du tracé

Avant de commencer, nous allons définir les termes.

Le décalage est une différence entre les prix d'ouverture des barres du graphique résultant et les prix d'ouverture des barres du graphique source.

La période actuelle est la période du graphique source.

La période de base est un délai avec les prix que nous allons utiliser pour former les barres du graphique résultant.

La période de base ne peut pas dépasser celle en cours. La période courante doit être divisée par la période de base sans reste. Plus le rapport entre la période actuelle et la période de base est élevé, plus nous pouvons obtenir de variations différentes du graphique résultant. Cependant, si le rapport est trop grand, les données historiques de la période de base peuvent ne pas être suffisantes pour dessiner le nombre nécessaire de barres de graphique résultantes.

Il existe trois types de tracé d'un graphique.

  • Graphique avec un décalage statique (Static Shift ou SS).
  • Graphique avec un décalage dynamique dans le mode d'ouverture (Dynamic Shift, just Open ou DSO
  • Graphique avec un décalage dynamique dans le mode de fermeture (Dynamic Shift, expected Close ou DSC).

En mode décalage statique, les heures d'ouverture des bars sont décalées de l'heure définie. Le changement dynamique dans le mode d'ouverture donne l'impression qu'un bar vient d'être ouvert et dans le mode de fermeture, comme si le bar sera bientôt fermé.

Regardons de plus près.


1.1. Graphique avec décalage statique

Dans ce mode, l'heure d'ouverture de chaque bar est décalée du nombre de minutes équivalent au nombre défini de plages horaires de base. Nous appellerons cela un décalage. De cette façon, si le décalage défini est égal à 0, alors le graphique est exactement le même que celui de la source. Le décalage 1, à condition que le délai de base soit de 15 minutes, est égale à 15 minutes. Le décalage 2 est égale à 30 minutes et ainsi de suite.

Le décalage ne peut pas dépasser (k-1), où k est un rapport entre la période actuelle et la période de base. Cela signifie qu'avec l'horizon temporel actuel H1 et celui de base M1, le décalage maximum autorisé est de 60/1 - 1 = 59 des échéances de base, soit 59 minutes. Si le délai de base est M5, alors le décalage maximum autorisé est de 60/5 - 1 = 11 des délais de base, soit 55 minutes.

L'heure d'ouverture des bars pour la tranche horaire actuelle H1 et le décalage de 15 minutes, est 00h15, 01h15, 02h15 et ainsi de suite. Pour la tranche horaire actuelle M15 et le décalage de 1 minute, l'heure d'ouverture des bars est 00:16, 00:31, 00:46, 01:01 et ainsi de suite.

Lorsque les décalages sont proches des valeurs limites, un tel graphique est rarement différent de celui source. Des différences significatives apparaissent lorsqu'une valeur de décalage est proche du milieu de la plage admissible.

Graphique avec décalage statique

Fig. 1. Exemple de formation de barres horaires sur l'horizon de base de M15 avec la valeur de décalage égale à 1


1.2. Graphique avec un changement dynamique en mode d'ouverture

Dans ce mode, le décalage est recalculé chaque fois qu'une nouvelle barre de la période de base apparaît. Dans le même temps, le décalage est calculé de manière à ce que le temps d'existence de la barre à la fin du graphique (les derniers prix) ne dépasse pas la valeur de la période de base. Si la période actuelle est H1 et la période de base est M5, il semblera que la barre la plus à droite ait été ouverte il y a moins de cinq minutes.

Graphique avec décalage dynamique, début de la barre

Fig. 2. Exemple de formation de barres horaires sur l'horizon temporel de base M15 avec décalage dynamique en mode ouverture


1.3. Graphique avec un changement dynamique en mode de fermeture

Dans ce mode, le décalage est recalculé à chaque fois qu'une nouvelle barre apparaît, comme dans le mode ouverture. La seule différence est que le décalage est calculé de la manière dont le temps d'existence de la barre à la fin du graphique (les derniers prix) était supérieur ou égal à la différence entre les périodes actuels et de base. Sur la période actuelle de H1 et celle de base de M5, il semble que la barre d'extrême droite se fermera au plus tard dans cinq minutes.

Graphique avec décalage dynamique, complétion de la barre

Fig. 3. Exemple de formation de barres horaires sur l'horizon temporel de base M15 et décalage dynamique en mode fermeture


2. Transformation des données

La fonction GetRatesLC() a été écrite pour convertir les données historiques en tenant compte du décalage défini. Il écrit les données historiques modifiées dans le tableau de structures de type MqlRates, similaire à la fonction CopyRates().

int GetRatesLC(
   int             start_pos    // source for copying
   int             len,         // amount to copy
   MqlRates&       rates[],     // target array
   ENUM_TIMEFRAMES base_period, // basic timeframe
   int&            shift        // shift
   );

Paramètres

  start_pos

   [in] Index du premier élément dans la période actuelle. C'est le point de départ de la conversion et de la copie des données dans un tampon.

  len

   [in] Nombre d'éléments copiés.

  taux[]

   [out] Tableau de type MqlRates.

  période_base

   [in] Délai de base. 

  décalage

   [entrée] [sortie] Décalage. Il peut accepter les valeurs suivantes :

ValeurDescription
 -2
 Calculer le décalage dans le mode d'ouverture (début de la formation de la barre)
 -1
 Calculer le décalage dans le mode de fermeture (fin de la formation de la barre)
 0 ... N
 Appliquer le décalage défini. Peut accepter les valeurs de 0 à N.
 N = Tcur/Tbase - 1. Où Tcur est la période actuelle, Tbase est une base.

Table 1. Valeurs admissibles du paramètre shift

Si la fonction est implémentée avec succès, shift recevra la valeur du décalage calculé si les valeurs de -2 ou -1 ont été passées.

Valeur renvoyée

Nombre d'éléments copiés ou code d'erreur :

CodeDescription
 -1
 Délai de base spécifié de manière incorrecte
 -2
 Décalage spécifié de manière incorrecte

Table 2. Codes d'erreur renvoyés

Vous trouverez ci-dessous le code de la fonction GetRatesLC() du fichier liquidchart.mqh.

int GetRatesLC(int start_pos,int len,MqlRates &rates[],ENUM_TIMEFRAMES base_period,int& shift)
  {
   //--- number of basic timeframes contained in the current one  
   int k=PeriodSeconds()/PeriodSeconds(base_period);
   if(k==0)
      return(-1);//basic timeframe specified incorrectly
   //---
   MqlRates r0[];
   ArrayResize(rates,len);
   if(CopyRates(_Symbol,_Period,start_pos,1,r0)<1)
      return(0);// no data
   //---
   int sh;
   if(shift>=0)
     {
      //--- fixed shift
      if(shift<k)
         sh=shift;
      else
         return(-2);//--- shift specified incorrectly   
     }
   else if(shift==-1)
     {
      //--- shift to be calculated (dynamic, beginning of the bar formation)
      sh=int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
     }
   else if(shift==-2)
     {
      //--- shift to be calculated (dynamic, end of the bar formation)
      sh=1+int((TimeCurrent()-r0[0].time)/PeriodSeconds(base_period));
      if(sh>=k)
         sh = 0;
     }
   else
      return(-2);//shift specified incorrectly       
   //--- opening time of the basic period bar, which is the beginning of the current period bar formation
   //--- synchronization of the time of opening bars takes place relative to the tO time
   datetime tO;
   //--- closing time of the bar under formation, i.e. opening time of the last bar of basic timeframe in the series
   datetime tC;
   tO=r0[0].time+sh*PeriodSeconds(base_period);
   if(tO>TimeCurrent())
      tO-=PeriodSeconds();
   tC=tO+PeriodSeconds()-PeriodSeconds(base_period);
   if(tC>TimeCurrent())
      tC=TimeCurrent();
   int cnt=0;
   while(cnt<len)
     {
      ArrayFree(r0);
      int l=CopyRates(_Symbol,base_period,tC,k,r0);
      if(l<1)
         break;
      //--- time of the bar with the (l-1) index does not have to be equal to tC
      //--- if there is no bar with the tC time, it can be the nearest bar
      //--- in any case its time is assigned to the tC time
      tC=r0[l-1].time;
      //--- check if tO has the correct value and modify if needed.
      while(tO>tC)
         tO-=PeriodSeconds();
      //--- the time values of tO and tC have actual meaning for the bar under formation  
      int index=len-1-cnt;
      rates[index].close=0;
      rates[index].open=0;
      rates[index].high=0;
      rates[index].low=0;
      rates[index].time=tO;
      for(int i=0; i<l; i++)
         if(r0[i].time>=tO && r0[i].time<=tC)
           {
            if(rates[index].open==0)
              {
               rates[index].open= r0[i].open;
               rates[index].low = r0[i].low;
               rates[index].high= r0[i].high;
                 }else{
               if(rates[index].low > r0[i].low)
                  rates[index].low=r0[i].low;
               if(rates[index].high < r0[i].high)
                  rates[index].high=r0[i].high;
              }
            rates[index].close=r0[i].close;
           }
      //--- specifying closing time of the next bar in the loop
      tC=tO-PeriodSeconds(base_period);
      //
      cnt++;
     }
   if(cnt<len)
     {
      //-- less data than required, move to the beginning of the buffer
      int d=len-cnt;
      for(int j=0; j<cnt; j++)
         rates[j]=rates[j+d];
      for(int j=cnt;j<len;j++)
        {
         //--- fill unused array elements with zeros
         rates[j].close=0;
         rates[j].open=0;
         rates[j].high=0;
         rates[j].low=0;
         rates[j].time=0;
        }
     }
   shift = sh;  
   return(cnt);
  }

Quelques points importants doivent être soulignés.

  • La fonction ne renvoie pas les volumes de ticks. La raison en est qu'en mode DSC, la fonction ne renvoie jamais le volume égal à un comme cela se produit à l'ouverture du bar. C'est assez logique. Si votre Expert Advisor utilise le volume de tick égal à un comme signal d'une nouvelle formation de barre, il ne recevra jamais ce signal. Cette méthode est utilisée dans la Moyenne mobile de Expert Advisor. Vous pourriez ajouter un comptage des volumes de ticks à la fonction mais cela ne fonctionnerait pas correctement. Pour éviter toute confusion, je ne mesure pas du tout les volumes de tick.
  • La fonction renvoie le nombre de barres demandé mais cela ne signifie pas que le temps entre la première et la dernière barre sera proportionnel à l'intervalle de temps correspondant sur le graphique source. Sur un segment continu de données historiques bien qu'il y aura correspondance. Si le segment spécifié contient des weekends, des «barres fantômes» peuvent apparaître sur les bordures.

La figure ci-dessous représente un exemple de «barre fantôme». Ce bar a été formé pour la première minute du 27 octobre, qui a été inclus dans le bar avec l'heure d'ouverture de 23h01 le 26 octobre. Il est à noter qu'après de telles barres le graphique de l'indicateur sera décalé vers la gauche par rapport au graphique source. Les barres avec l'heure correspondant à l'heure initiale (par exemple, 21:00 -> 21:01), auront des index différents.

Barre fantôme

Fig. 4. Barre fantôme 2014.10.26 à 23:01



3. Indicateur Mise en œuvre

Écrivons un indicateur affichant un «graphique liquide» dans une fenêtre séparée. L'indicateur doit fonctionner dans les trois modes : le mode de décalage statique, le décalage dynamique dans le mode d'ouverture de barre et le décalage dynamique dans le mode de fermeture de barre. L'indicateur doit également avoir des éléments de contrôle pour changer les modes et la valeur de décalage sans qu'il soit nécessaire d'appeler la boîte de dialogue des paramètres de l'indicateur.

Pour commencer, nous utiliserons la fonction GetRatesLC() du fichier liquidchart.mqh. Nous l'appellerons depuis la fonction RefreshBuffers(), elle-même appelée depuis la fonction OnCalculate. Il peut également être appelé depuis OnChartEvent, à condition que certaines modifications du mode ou le décalage et le recalcul des tampons indicateurs soient nécessaires. La fonction OnChartEvent gérera l'appui sur les boutons et la modification des valeurs du décalage et du mode.

Paramètres d'entrée de l'indicateur :

input ENUM_TIMEFRAMES   BaseTF=PERIOD_M1;       // LC Base Period
input int               Depth=100;              // Depth, bars
input ENUM_LC_MODE      inp_LC_mode=LC_MODE_SS; // LC mode
input int               inp_LC_shift=0;         // LC shift

où Profondeur est le nombre de barres du graphique résultant et ENUM_LC_MODE est le type décrivant les modes de tracé de l'indicateur :

enum ENUM_LC_MODE
  {//plotting mode
   LC_MODE_SS=0,  // Static Shift
   LC_MODE_DSO=1, // Dynamic Shift, just Open
   LC_MODE_DSC=2  // Dynamic Shift, expected Close
  };
Les paramètres inp_LC_mode et inp_LC_shift sont dupliqués par LC_mode et LC_shift en conséquence. Cette conception permet de changer leurs valeurs en appuyant sur le bouton. Dessiner les boutons et manipuler les boutons ne seront pas pris en compte car ils ne sont pas pertinents pour le sujet de cet article. Considérons la fonction RefreshBuffers() en détail.
bool RefreshBuffers(int total,
                    double &buff1[],
                    double &buff2[],
                    double &buff3[],
                    double &buff4[],
                    double &col_buffer[])
  {
   MqlRates rates[];
   ArrayResize(rates,Depth);
//---
   int copied=0;
   int shift=0;
   if(LC_mode==LC_MODE_SS)
      shift = LC_shift; //static shift
   else if(LC_mode==LC_MODE_DSO)
      shift = -1;       //calculate shift (beginning of the bar formation)
   else if(LC_mode==LC_MODE_DSC)
      shift = -2;       //calculate shift (end of the bar formation)
   else
      return(false);
//---
   copied=GetRatesLC(0,Depth,rates,BaseTF,shift);
//---
   if(copied<=0)
     {
      Print("No data");
      return(false);
     }
   LC_shift = shift;
   refr_keys();
//--- initialize buffers with empty values
   ArrayInitialize(buff1,0.0);
   ArrayInitialize(buff2,0.0);
   ArrayInitialize(buff3,0.0);
   ArrayInitialize(buff4,0.0);
//---
   int buffer_index=total-copied;
   for(int i=0;i<copied;i++)
     {
      buff1[buffer_index]=rates[i].open;
      buff2[buffer_index]=rates[i].high;
      buff3[buffer_index]=rates[i].low;
      buff4[buffer_index]=rates[i].close;
      //---
      if(rates[i].open<=rates[i].close)
         col_buffer[buffer_index]=1;//bullish or doji
      else
         col_buffer[buffer_index]=0;//bearish
      //
      buffer_index++;
     }
//
   return(true);
  }

Dans un premier temps, une valeur pertinente de la variable shift doit être transmise à la fonction GetRatesLC() selon le mode. Dans le mode statique ce sera une copie du paramètre LC_shift et dans les modes d'ouverture ou de fermeture de la barre ce sera -1 ou -2 en conséquence. Après une exécution réussie de la fonction, GetRatesLC() renvoie la valeur actuelle du décalage à la variable de décalage. Il est soit recalculé, soit laissé tel quel. Dans tous les cas, nous affectons sa valeur à la variable LC_shift puis appelons le redécoupage des éléments graphiques par la fonction refr_keys().

Après cela, nous renouvelons les valeurs OHLC et les couleurs des barres dans les tampons indicateurs.

Le code complet de l'indicateur se trouve dans le fichier liquid_chart.mq5. Après le lancement, l'indicateur se présente comme suit :

Indicateur de graphique liquide, décalage 0

Fig. 5. Indicateur de graphique liquide

Quelques mots sur les éléments de contrôle.

  • Le bouton SS fait passer l'indicateur en mode décalage statique. Les boutons avec des flèches sont actifs dans ce mode et ils peuvent être utilisés pour régler la valeur requise du décalage.
  • Le bouton DSO fait passer l'indicateur en mode décalage dynamique, début de la formation de la barre. Dans ce mode, la valeur de décalage est calculée et ne peut pas être modifiée manuellement.
  • Le bouton DSC commute l'indicateur du mode décalage dynamique, fin de la formation de la barre. Dans ce mode, la modification manuelle du décalage n'est pas non plus disponible.

En mode SS, lorsque la valeur de décalage est 0, l'indicateur duplique les valeurs du graphique initial. Si vous modifiez le décalage, vous verrez le redécoupage du graphique. Une différence notable apparaît déjà à la valeur de 28. Au lieu de «rails» faibles, il y a un «marteau» distinct. Est-il temps d'acheter?

L'indicateur de graphique liquide, décalage 28

Fig. 6. L'indicateur de graphique liquide, décalage 28

Basculez l'indicateur en mode DSO et une barre nouvellement formée sera toujours à droite. En mode DSC, une barre se fermera au plus tard à une valeur de base.


4. Création d'un expert

Nous allons créer deux Experts. Le premier se négociera par moyenne mobile et le second par le modèle «barre à épingles».

Prenons l'expert Moyenne mobile des exemples standard (le dossier Experts\Exemples\Moyenne mobile) comme modèle. De cette façon, nous serons en mesure de comparer les résultats d'optimisation de deux stratégies essentiellement différentes pour comprendre lorsque l'utilisation du décalage statique ou dynamique est pertinente et important.


4.1. Trading d'experts par moyenne mobile

Dans un premier temps, les paramètres d'entrée doivent être définis. Il y en a quatre :

input double MaximumRisk    = 0.1// Maximum Risk in percentage
input double DecreaseFactor = 3;    // Decrease factor
input int    MovingPeriod   = 12;   // Moving Average period
input int    MovingShift    = 6;    // Moving Average shift

Trois autres paramètres seront ajoutés après la modernisation :

input ENUM_TIMEFRAMES  BaseTF=PERIOD_M1;  // LC Base Period
input bool             LC_on = true;      // LC mode ON
input int              LC_shift = 0;      // LC shift

Le paramètre LC_on sera utile pour vérifier si GetRatesLC() fonctionne correctement. La combinaison (LC_on == true && LC_shift == 0) doit avoir le même résultat que (LC_on == false).

Pour la modernisation de la moyenne mobile experte prête à l'emploi avec le décalage, le fichier liquidchart.mqh doit être inclus et les fonctions CopyRates() doivent être remplacées par les fonctions GetRatesLC() pour les cas où la fonction de décalage est activée (paramètre d'entrée LC_on est vrai) :

   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      copied=GetRatesLC(0,2,rt,BaseTF,shift);
     }
   else
      copied = CopyRates(_Symbol,_Period,0,2,rt);
   if(copied!=2)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }

Cela doit être fait à la fois dans les fonctions CheckForOpen() et CheckForClose(). Nous devons refuser d'utiliser les poignées d'indicateur et calculerons les moyennes mobiles manuellement. Pour cela nous avons ajouté la fonction CopyMABuffer() :

int CopyMABuffer(int len,double &ma[])
  {
   if(len<=0)
      return(0);
   MqlRates rates[];
   int l=len-1+MovingPeriod;
   int copied;
   if(LC_on==true)
     {
      int shift = LC_shift;
      ArrayResize(rates,l);
      copied=GetRatesLC(MovingShift,l,rates,BaseTF,shift);
     }
   else
      copied=CopyRates(_Symbol,_Period,MovingShift,l,rates);
//      
   if(copied<l)
      return(0);
//
   for(int i=0;i<len;i++)
     {
      double sum=0;
      for(int j=0;j<MovingPeriod;j++)
        {
         if(LC_on==true)
            sum+=rates[j+i].close;
         else
            sum+=rates[copied-1-j-i].close;
        }
      ma[i]=sum/MovingPeriod;
     }
   return(len);
  }

Il renvoie un nombre requis de valeurs ou 0 dans le tampon ma[] si, pour une raison quelconque, elles n'ont pas pu être obtenues.

Le contrôle de l'ouverture des barres est un autre point important à considérer. Dans la version originale du Moyenne mobile Expert Advisor, il a été implémenté en utilisant des valeurs de coche :

   if(rt[1].tick_volume>1)
      return;

Dans notre cas, il n'y a pas de volume de ticks et nous allons donc écrire la fonction newbar() pour contrôler l'ouverture de la barre :

bool newbar(datetime t)
  {
   static datetime t_prev=0;
   if(t!=t_prev)
     {
      t_prev=t;
      return(true);
     }
   return(false);
  }

Le principe de fonctionnement réside dans la comparaison du temps d'ouverture de la barre avec sa valeur précédente. Substituons la vérification du volume de tick à l'appel de la fonction newbar() dans les fonctions CheckForOpen() et CheckForClose() :

   if(newbar(rt[1].time)==false)
      return;

Le code complet de l'Expert prêt à l'emploi se trouve dans le fichier moving_average_lc.mq5.


4.2. Expert Advisor Trading par le modèle «Pin Bar»

Pin Bar ou Pinocchio bar est un motif composé de trois barres. La barre du milieu doit avoir une ombre longue ou «nez», indiquant un renversement probable du mouvement des prix. Les barres sur le côté sont appelées «yeux». Leurs points extrêmes ne doivent pas sortir de l'ombre du bar voisin. Ce modèle est populaire auprès des traders qui négocient par modèles de chandeliers.

Notre pin bar doit remplir les conditions suivantes pour inverser le prix à la baisse :

  • La barre r[0] doit être haussière.
  • La barre r[2] doit être baissière.
  • La valeur la plus élevée des prix A et C ne doit pas dépasser B, où A et C sont respectivement les valeurs élevées des barres r[0] et r[2]. B est le prix élevé de la barre r[1].
  • Le corps de la barre du milieu, c'est-à-dire le module de différence entre Ouvrir et Fermer(OC sur la figure) de la barre r[1], ne doit pas dépasser le nombre de points fixé par le paramètre externe.
  • L'ombre de la barre du milieu, ou la différence entre le prix haut et la plus grande des valeurs d'ouverture et de fermeture de la barre r[1], ne doit pas être inférieure au nombre de points défini par le paramètre externe.
  • Le rapport entre l'ombre de la barre du milieu et son corps ne doit pas être inférieur à la valeur définie par le paramètre externe.

La vérification du motif sera effectuée au moment de l'ouverture de la barre r[3].

Pinbar

Fig. 7. Le motif «Pin Bar»

Le code définissant la présence de la barre à broches pour l'inversion vers le bas devrait ressembler à :

   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
     //--- eyes of the upper pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }

Idem pour le renversement vers le haut. Ainsi, la fonction de vérification de la présence de la barre d'épingle se présentera comme suit :

int IsPinbar(MqlRates &r[])
  {
   //--- there must be 4 values in the r[] array
   if(ArraySize(r)<4)
      return(0);
   if(r[0].open<r[0].close && r[2].open>r[2].close && r[1].high>MathMax(r[0].high,r[2].high))
     {
      //--- eyes of the upper pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(r[1].high-MathMax(r[1].open,r[1].close))/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(1);
     }
   else if(r[0].open>r[0].close && r[2].open<r[2].close && r[1].low<MathMin(r[0].low,r[2].low))
     {
      //--- eyes of the lower pin bar
      double oc=MathAbs(r[1].open-r[1].close)/_Point;
      if(oc>inp_pb_max_OC)
         return(0);
      double shdw=(MathMin(r[1].open,r[1].close)-r[1].low)/_Point;
      if(shdw<inp_pb_min_shdw)
         return(0);
      if(oc!=0)
        {
         if((shdw/oc)<inp_pb_min_ratio)
            return(0);
        }
      return(-1);
     }
   return(0);
  }

Le tableau transmis de données historiques ne doit pas comporter moins de quatre éléments. Dans le cas où la barre à broches supérieure est détectée (c'est-à-dire la barre à broches indiquant l'inversion vers le bas), la fonction renverra la valeur de 1. Dans le cas où il y a une barre à broches inférieure (inversion supposée vers le haut), la fonction renverra la valeur de -1. La fonction renverra 0 s'il n'y avait aucune barre d'épingle. La fonction utilise également les paramètres d'entrée suivants :

input uint   inp_pb_min_shdw     = 40;    // Pin bar min shadow, point
input uint   inp_pb_max_OC       = 20;    // Pin bar max OC, point
input double inp_pb_min_ratio    = 2.0;   // Pin bar shadow to OC min ratio

Nous allons trader par la stratégie de trading la plus simple par la barre d'épingle. Nous vendrons si un retournement à la baisse est attendu et achèterons si le retournement est à la hausse. Normalement, des confirmations d'indicateurs sont requises, mais cette fois, nous n'allons pas les utiliser pour maintenir l'intégrité expérimentale. Nous allons utiliser uniquement la barre à broches.

Le trading de l'Expert Advisor par le modèle «Pin Bar» sera basé sur le trading de l'Expert par Moyenne mobile. La fonction CopyMABuffer() doit être supprimée de ce dernier ainsi que l'appel de cette fonction à partir des fonctions CheckForOpen() et CheckForClose(). Le nombre de données historiques demandées doit être augmenté de deux à quatre. L'heure de la barre r[3] sera utilisée dans la vérification de l'ouverture de la nouvelle barre.

   int copied;
   if(LC_on==true)
   {
      int shift = LC_shift;
      copied=GetRatesLC(0,4,rt,BaseTF,shift);
   }
   else
      copied = CopyRates(_Symbol,_Period,0,4,rt);
   if(copied!=4)
     {
      Print("CopyRates of ",_Symbol," failed, no history");
      return;
     }
   if(newbar(rt[3].time)==false)
      return;

Le contrôle d'un signal pour l'ouverture de la position ressemblera à :

   int pb=IsPinbar(rt);
   if(pb==1)       // upper pin bar
      signal=ORDER_TYPE_SELL; // sell conditions
   else if(pb==-1) // lower pin bar
      signal=ORDER_TYPE_BUY// buy conditions

Pour fermer la position par la barre à broches opposée :

   if(type==(long)POSITION_TYPE_BUY && pb==1)
      signal=true;
   if(type==(long)POSITION_TYPE_SELL && pb==-1)
      signal=true;

Veuillez noter que dans des conditions strictes de paramètres d'entrée, la barre d'épingle se produit rarement. Par conséquent, lors de la fermeture d'une position uniquement par une barre à broches opposée, il existe un risque de perdre du profit ou de fermer à perte.

A ce propos, nous ajoutons les niveaux Take Profit et Stop Loss. Ils vont être définis par les paramètres externes inp_tp_pp et inp_sl_pp respectivement :

   double sl=0,tp=0,p=0;
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(signal==ORDER_TYPE_SELL)
   {
     p=bid;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(ask+inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(ask-inp_sl_pp*_Point,_Digits);
   } else {
     p=ask;
     if(inp_sl_pp!=0)
       sl=NormalizeDouble(bid-inp_sl_pp*_Point,_Digits);
     if(inp_tp_pp!=0)
       tp=NormalizeDouble(bid+inp_sl_pp*_Point,_Digits);
   }
   CTrade trade;
   trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),p,sl,tp);

Si la valeur de inp_tp_pp ou inp_sl_pp est zéro, le niveau correspondant de Take Profit ou Stop Loss ne sera pas défini.

La modification est terminée. L'expert est prêt. Le code complet se trouve dans le fichier pinbar_lc.mq5.


5. Optimisation de l’Expert

Pour évaluer l'efficacité des graphiques avec un changement dans différentes stratégies, nous utiliserons l'optimisation Expert avec une comparaison plus poussée des meilleurs résultats. Les paramètres les plus importants ici sont le profit, le prélèvement et le nombre de transactions. Le trading Expert Advisor par moyenne mobile servira d'exemple de stratégie d'indicateur et le trading Expert par le modèle «Pin Bar» représentera un cas de stratégie sans indicateur.

L'optimisation sera effectuée par des devis pour le dernier semestre à partir du serveur MetaQuotes-Demo. L'expérience sera menée pour l'EURUSD, le GBPUSD et l'USDJPY. Le dépôt de départ est de 3000 USD avec un effet de levier de 1:100. Le mode de test est «Tous les ticks». Mode d'optimisation - rapide (algorithme générique), Balance Max.


5.1. Analyse des résultats d'optimisation d'un expert en trading par moyenne mobile

Comparons les résultats de l'optimisation d'un Expert lorsqu'il travaille dans différents modes : à décalage nul, à décalage statique et à décalage dynamique (DSO et DSC).

Le test sera effectué pour EURUSD, GBPUSD et USDJPY au cours de la période 2014.04.01 - 2014.10.25 (six derniers mois). PERIOD_H1

Paramètres d'entrée de l'Expert :

Paramètre
Valeur
 Risque maximum en pourcentage
 0.1
 Facteur de diminution
 3.0
 Période de moyenne mobile
 12
 Moyenne Mobile
 6
 BaseTF
 1 minute
 LC_on
 vrai
 LC_shift
 0

Table 3. Paramètres d'entrée du moyenne mobile Expert LC

5.1.1. Optimisation experte en mode Shift désactivé

Paramètres optimisés :

Paramètre
 Démarrage EtapeArrêter
 Période de moyenne mobile
 12
 1
 90
 Décalage Moyenne Mobile
 6
 1
 30

Table 4. Paramètres optimisés du moyenne mobile Expert LC en mode zéro décalage

Graphique illustrant l'optimisation Expert dans le mode de décalage désactivé, EURUSD :

Optimisation en mode zéro décalage, EURUSD

Fig. 8. Optimisation de la moyenne mobile LC Expert en mode zéro décalage, EURUSD

Meilleurs résultats :

 Résultat
 BénéficePrélèvement en %
Nombre de trades
MovingPeriod MovingShift
 3796,43 796,43 16,18 111 24 12
 3776,98 776,98 17,70 77 55
 22
 3767,45 767,45 16,10 74 59
 23
 3740,38 740,38 15,87 78 55
 17
 3641,16 641,16 15,97 105 12
 17

Table 5. Meilleurs résultats du moyenne mobile Expert LC pour EURUSD en mode zéro décalage

Graphique illustrant l'optimisation Expert en mode zéro décalage, GBPUSD :

Optimisation en mode zéro décalage, GBPUSD

Fig. 9. Optimisation de la moyenne mobile LC Expert en mode zéro décalage, GBPUSD

Meilleurs résultats :

 Résultat BénéficePrélèvement en %
 Nombre de trades
 MovingPeriodMovingShift
 4025,75 1025,75 8,08 80 18
 22
 3857,90 857,90 15,04 74 55
 13
 3851,40 851,40 18,16 80 13
 24
 3849,48 849,48 13,05 69 34
 29
 3804,70 804,70 16,57 137 25
 8

Table 6. Meilleurs résultats de l'optimisation de moyenne mobile LC Expert pour GBPUSD en mode zéro décalage

Graphique illustrant l'optimisation Expert en mode décalage désactivé, USDJPY :

Optimisation en mode zéro décalage, USDJPY

Fig. 10. Optimisation du moyenne mobile LC Expert en mode zéro décalage, USDJPY

Meilleurs résultats :

Résultat
Bénéfice
Prélèvement en %
Nombre de trades
 MovingPeriod MovingShift
5801,632801,6311,5448
65
23
5789,172789,1714,0350
44
27
5539,062539,0617,1446
67
27
5331,342331,3415,0561
70
9
5045,192045,1912,6148
83
15

Table 7. Meilleurs résultats du moyenne mobile LC Expert pour USDJPY en mode zéro décalage

5.1.2. Optimisation experte en mode Static Shift

Paramètres optimisés :

Paramètre
 Démarrage EtapeArrêter
 Période de moyenne mobile
 12
 1
 90
 Décalage Moyenne Mobile
 6
 1
 30
 LC_shift 1 1 59

Table 8. Paramètres optimisés du moyenne mobile LC Expert en mode de décalage statique

Graphique illustrant l'optimisation Expert en mode de décalage statique, EURUSD :

Optimisation en mode décalage statique, EURUSD

Fig. 11. Optimisation du moyenne mobile LC Expert en mode décalage statique, EURUSD

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
MovingPeriod
MovingShift
LC_shift
 4385,06
 1385,06
 12,87 100 32 11 8
 4149,63
 1149,63
 14,22 66 77 25 23
 3984,92
 984,92
 21,52 122 12 11 26
 3969,35
 969,35
 16,08 111 32 11 24
 3922,95
 922,95
 12,29 57 77 25 10

Table 9. Meilleurs résultats d'optimisation de l moyenne mobile LC Expert pour EURUSD en mode décalage statique

Graphique illustrant l'optimisation Expert en mode décalage statique, GBPUSD :

Optimisation en mode décalage statique, GBPUSD

Fig. 12. Optimisation de la moyenne mobile LC Expert en mode décalage statique, GBPUSD

Meilleurs résultats :

 Résultat BénéficePrélèvement en %
Nombre de trades
 MovingPeriod MovingShiftLC_shift
 4571,07 1571,07 14,90 79 12
 25
 42
 4488,90 1488,90 15,46 73 12
 25
 47
 4320,31 1320,31 9,59 107 12
 16
 27
 4113,47 1113,47 10,96 75 12
 25
 15
 4069,21 1069,21 15,27 74 12
 25
 50

Table 10. Meilleurs résultats d'optimisation de la moyenne mobile LC Expert pour GBPUSD en mode de décalage statique

Graphique illustrant l'optimisation Expert en mode décalage statique, USDJPY :

Optimisation en mode décalage statique, USDJPY

Fig. 13. Optimisation de la moyenne mobile LC Expert en mode décalage statique, USDJPY

Meilleurs résultats :

Résultat
Bénéfice
Prélèvement en %
Nombre de trades
MovingPeriod
 MovingShiftLC_shift
 6051,39 3051,39 15,94 53
 76
 12
 31
 5448,98 2448,98 10,71 54
 44
 30
 2
 5328,15 2328,15 11,90 50
 82
 13
 52
 5162,82 2162,82 10,46 71
 22
 26
 24
 5154,71 2154,71 14,34 54
 75
 14
 58

Table 11. Meilleurs résultats d'optimisation de la moyenne mobile LC Expert pour USDJPY en mode décalage statique

5.1.3. Optimisation experte en mode décalage dynamique

Paramètres optimisés :

Paramètre
 Démarrage EtapeArrêter
 Période de moyenne mobile
 12
 1
 90
 Décalage Moyenne Mobile
 6
 1
 30
 LC_shift -2 1 -1

Table 12. Paramètres optimisés de la Moyenne mobile LC Expert en mode décalage dynamique

Graphique illustrant l'optimisation Expert en mode décalage dynamique, EURUSD :

Optimisation en mode décalage dynamique, EURUSD

Fig. 14. Optimisation de la moyenne mobile LC Expert en mode décalage dynamique, EURUSD

Meilleurs résultats :

Résultat
Bénéfice
Prélèvement en %
Nombre de trades
MovingPeriod
MovingShift
LC_shift
 3392,64 392,64 27,95 594 15 13 -2
 3140,26 140,26 23,35 514 12 17 -2
 2847,12 -152,88 17,04 390 79 23 -1
 2847,12 -152,88 17,04 390 79 12 -1
 2826,25 -173,75 20,12 350 85 22 -1

Table 13. Meilleurs résultats d'optimisation de la Moyenne mobile LC Expert pour EURUSD en mode décalage dynamique

Graphique illustrant l'optimisation Expert en mode décalage dynamique, GBPUSD :

Optimisation en mode décalage dynamique, GBPUSD

Fig. 15. Optimisation de la moyenne mobile LC Expert en mode décalage dynamique, GBPUSD

Meilleurs résultats :

 RésultatBénéfice
 Prélèvement en %
Nombre de trades
MovingPeriod
 MovingShiftLC_shift
 5377,58 2377,58 19,73 391 12
 26
 -2
 3865,50 865,50 18,18 380 23
 23
 -2
 3465,63 465,63 21,22 329 48
 21
 -2
 3428,99 428,99 24,55 574 51
 16
 -1
 3428,99 428,99 24,55 574 51
 15
 -1

Table 14. Meilleurs résultats d'optimisation de la Moyenne mobile LC Expert pour GBPUSD en mode décalage dynamique

Graphique illustrant l'optimisation Expert en mode décalage dynamique, USDJPY :

Optimisation en mode décalage dynamique, USDJPY

Fig. 16. Optimisation de la moyenne mobile LC Expert en mode décalage dynamique, USDJPY

Meilleurs résultats :

Résultat
Bénéfice
Prélèvement en %
 Nombre de trades
MovingPeriod
MovingShift
 LC_shift
 6500,19 3500,19 17,45 244
 42
 28
 -2
 6374,18 3374,18 19,91 243
 54
 24
 -2
 6293,29 3293,29 19,30 235
 48
 27
 -2
 5427,69 2427,69 17,65 245
 90
 8
 -2
 5421,83 2421,83 16,30 301
 59
 12
 -2

Table 15. Meilleurs résultats d'optimisation de la moyenne mobile LC Expert pour USDJPY en mode décalage dynamique

5.2. Analyse des résultats d'optimisation du trading expert par le modèle «Pin Bar»

Comparons les résultats de l'optimisation d'un Expert lorsqu'il travaille dans différents modes : à décalage nul, à décalage statique et à décalage dynamique (DSO et DSC). Le test sera effectué pour EURUSD, GBPUSD et USDJPY, sur la période 2014.04.01 - 2014.10.25. PERIOD_H1

Paramètres d'entrée de l'Expert :

 ParamètreValeur
Risque maximum en pourcentage
0.1
Facteur baissier
3.0
Pin bar ombre min, points
40
Pin bar max OC, points
110
Ratio d'ombre de la barre d'épingle au OC min
1.4
SL, points (0 pour OFF)
150
TP, points (0 pour OFF)
300
Période de base LC
1 minute
Mode LC activé
vrai
décalage LC
0

Table 16. Paramètres d'entrée du Pin Bar LC Expert

Nous allons optimiser les paramètres définissant la forme du pin bar : longueur du «nez», rapport entre la longueur du «nez» et le corps de la barre médiane et la taille maximale du corps. Les niveaux Take Profit et Stop Loss sont également à optimiser.


5.2.1. Optimisation experte en mode Shift désactivé

Paramètres optimisés :

 Paramètre Démarrage Etape Arrêter
Pin bar ombre min, points
100
20
400
Pin bar max OC, points
20
20
100
Ratio d'ombre de la barre d'épingle au OC min
1
0.2
3
SL, points (0 pour OFF)
150
50
500
TP, points (0 pour OFF)
150
50
500

Table 17. Paramètres optimisés du Pin Bar LC Expert en mode décalage désactivé

Graphique illustrant l'optimisation Expert dans le mode de décalage désactivé, EURUSD :

Optimisation avec décalage zéro, EURUSD

Fig. 17. Optimisation du Pin Bar LC Expert en mode zéro décalage, EURUSD

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Barre d'épingle ombre min
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP
 3504,59
 504,59
 9,82
 33
 100
 60
 1.8
 450
 500
 3428,89
 428,89
 8,72
 21
 120
 60
 2.8
 450
 350
 3392,37
 392,37
 9,94
 30
 100
 60
 2,6
 450
 250
 3388,54
 388,54
 9,93
 31
 100
 80
 2,2
 450
 300
 3311,84
 311,84
 6,84
 13
 140
 60
 2,2
 300
 450

Table 18. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour EURUSD en mode zéro décalage

Graphique illustrant l'optimisation Expert en mode zéro décalage, GBPUSD :

Optimisation avec décalage zéro, GBPUSD

Fig. 18. Optimisation du Pin Bar LC Expert en mode zéro décalage, GBPUSD

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Ombre min de la barre d'épingles
 Pin Bar max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP
 3187,13
 187,13
 11,10
 13
 160
 60
 2,6
 500
 350
 3148,73
 148,73
 3,23
 4
 220
 40
 2,8
 400
 400
 3142,67
 142,67
 11,27
 17
 160
 100
 1,8
 500
 350
 3140,80
 140,80
 11,79
 13
 180
 100
 2
 500
 500
 3094,20
 94,20
 1,62
 1
 260
 60
 1,6
 500
 400

Table 19. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour GBPUSD en mode zéro décalage

Graphique illustrant l'optimisation Expert en mode décalage désactivé, USDJPY :

Optimisation avec zéro décalage, USDJPY

Fig. 19. Optimisation du Pin Bar LC Expert en mode zéro décalage, USDJPY

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Barre d'épingle ombre min
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP
 3531,99
 531,99
 9,00
 6
 160
 60
 2.2
 450
 500
 3355,91
 355,91
 18,25
 16
 120
 60
 1,6
 450
 400
 3241,93
 241,93
 9,11
 4
 160
 40
 2,8
 450
 500
 3180,43
 180,43
 6,05
 33
 100
 80
 1,8
 150
 450
 3152,97
 152,97
 3,14
 6
 160
 80
 2,8
 150
 500

Table 20. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour USDJPY en mode zéro décalage

5.2.2. Optimisation experte en mode Static Shift

Paramètres optimisés :

 Paramètre Démarrage Etape Arrêter
 Pin bar ombre min, points
 100
 20
 400
 Pin bar max OC, points
 20
 20
 100
 Ratio d'ombre de la barre d'épingle au OC min
 1
 0.2
 3
 SL, points (0 pour OFF)
 150
 50
 500
 TP, points (0 pour OFF)
 150
 50
 500
 décalage LC
 1 1 59

Table 21. Paramètres optimisés du Pin Bar LC Expert en mode statique

Graphique illustrant l'optimisation Expert en mode de décalage statique, EURUSD :

Optimisation en mode décalage statique, EURUSD

Fig. 20. Optimisation du Pin Bar LC Expert en mode décalage statique, EURUSD

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Barre d'épingle ombre min
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP décalage LC
 4843,54
 1843,54
 10,14
 19
 120
 80
 1,6
 500
 500
 23
 4714,81
 1714,81
 10,99
 28
 100
 100
 1,6
 500
 500
 23
 4672,12
 1672,12
 10,16
 18 120
 80
 1,8
 500
 500
 23
 4610,13
 1610,13
 9,43
 19
 120
 80
 1,6
 450
 450
 23
 4562,21
 1562,21
 13,94
 27
 100
 100
 1,6
 500
 400
 25

Table 22. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour EURUSD en mode décalage statique

Graphique illustrant l'optimisation Expert en mode décalage statique, GBPUSD :

Optimisation en mode décalage statique, GBPUSD

Fig. 21. Optimisation du Pin Bar LC Expert en mode décalage statique, GBPUSD

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Barre d'épingle ombre min
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP décalage LC
 4838,10
 1838,10
 5,60
 34
 100
 40
 2,4
 450
 500
 24
 4797,09
 1797,09
 5,43
 35
 100
 40
 2,6
 400
 500
 24
 4755,57
 1755,57
 7,36
 42
 100
 100
 2
 400
 500
 24
 4725,41
 1725,41
 8,35
 45
 100
 80
 1
 400
 500
 24
 4705,61
 1705,61
 8,32
 41
 100
 100
 2
 450
 500
 24

Table 23. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour GBPUSD en mode décalage statique

Graphique illustrant l'optimisation Expert en mode décalage statique, USDJPY :

Optimisation en mode décalage statique, USDJPY

Fig. 22. Optimisation du Pin Bar LC Expert en mode décalage statique, USDJPY

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Ombre min de la barre d'épingles
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP décalage LC
 4108,83
 1108,83
 6,45
 9
 140
 40
 1,4
 500
 450
 55
 3966,74
 966,74
 7,88
 12
 140
 60
 2,8
 450
 500
 45
 3955,32
 955,32
 9,91
 21
 120
 80
 2
 500
 500
 45
 3953,80
 953,80
 6,13
 10
 140
 60
 2,8
 450
 450
 47
 3944,33
 944,33
 6,42
 6
 160
 100
 2,6
 500
 400
 44

Table 24. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour USDJPY en mode décalage statique

5.2.3. Optimisation experte en mode décalage dynamique

Paramètres optimisés :

 Paramètre Démarrage Etape Arrêter
 Pin bar ombre min, points
 100
 20
 400
 Pin bar max OC, points
 20
 20
 100
 Ratio d'ombre de la barre d'épingle au OC min
 1
 0.2
 3
 SL, points (0 pour OFF)
 150
 50
 500
 TP, points (0 pour OFF)
 150
 50
 500
 décalage LC
 -2 1 -1

Table 25. Paramètres optimisés du Pin Bar LC Expert en mode décalage dynamique

Graphique illustrant l'optimisation Expert en mode décalage dynamique, EURUSD :

Optimisation en mode décalage dynamique, EURUSD

Fig. 23. Optimisation du Pin Bar LC Expert en mode décalage dynamique, EURUSD

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Barre d'épingle ombre min
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP décalage LC
 4185,65
 1185,65
 13,22
 49
 200
 100
 1,8
 450
 500
 -2
 4011,80
 1011,80
 13,75
 49
 200
 100
 2
 400
 500
 -2
 3989,28
 989,28
 12,01
 76
 140
 20
 1,2
 350
 200
 -1
 3979,50
 979,50
 16,45
 157
 100
 20
 1
 450
 500
 -1
 3957,25
 957,25
 16,68
 162
 100
 20
 1
 400
 500
 -1

Table 26. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour EURUSD en mode décalage statique

Graphique illustrant l'optimisation Expert dans le mode de décalage dynamique pour GBPUSD :

Optimisation en mode décalage dynamique, GBPUSD

Fig. 24. Optimisation du Pin Bar LC Expert en mode décalage dynamique, GBPUSD

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Barre d'épingle ombre min
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP décalage LC
 4906,84
 1906,84
 10,10
 179
 120
 40
 1,8
 500
 500
 -2
 4316,46
 1316,46
 10,71
 151
 120
 20
 2,4
 450
 500
 -1
 4250,96
 1250,96
 12,40
 174
 120
 40
 1,8
 500
 500
 -1
 4040,82
 1040,82
 12,40
 194
 120
 60
 2
 500
 200
 -2
 4032,85
 1032,85
 11,70
 139
 140
 40
 2
 400
 200
 -1

Table 27. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour GBPUSD en mode décalage dynamique

Graphique illustrant l'optimisation Expert en mode décalage dynamique, USDJPY :

Optimisation en mode décalage dynamique, USDJPY

Fig. 25. Optimisation du Pin Bar LC Expert en mode décalage dynamique, USDJPY

Meilleurs résultats :

Résultat
Bénéfice
 Prélèvement en %
 Nombre de trades
 Barre d'épingle ombre min
 Barre de broche max OC
 Ombre de barre d'épingle
rapport OC min
 SL TP décalage LC
 5472,67
 2472,67
 13,01
 138
 100
 20
 2,4
 500
 500
 -1
 4319,84
 1319,84
 15,87
 146
 100
 20
 2,2
 400
 500
 -1
 4259,54
 1259,54
 19,71
 137
 100
 20
 2,4
 500
 500
 -2
 4197,57
 1197,57
 15,98
 152
 100
 20
 1
 350
 500
 -1
 3908,19
 908,19
 16,79
 110
 120
 40
 3
 400
 400
 -1

Table 28. Meilleurs résultats d'optimisation du Pin Bar LC Expert pour USDJPY en mode décalage dynamique


6. Comparaison des résultats d'optimisation

Pour créer un tableau de comparaison, sélectionnons les valeurs maximales de profit, de tirage et un certain nombre de transactions dans chaque tableau des meilleurs résultats. A côté de la valeur reçue dans les modes de décalage statique ou dynamique, on écrira la variation (en pourcentage) ou cette valeur par rapport à la même valeur dans le mode de décalage zéro.


6.1. Trading d'experts par moyenne mobile

Profit :

 Pas de décalage
 Décalage
statique
Statique
dynamique
 EURUSD
 796,43
 1385,06 (+74%)
 392,64 (-51%)
 GBPUSD
 1025,75
 1571,07 (+53%)
 2377,58 (+132%)
 USDJPY
 2801,63
 3051,39 (+9%)
 3500,19 (+25%)

Table 29. Comparaison des valeurs de profit maximum du tableau des meilleurs résultats d'optimisation de l'Expert Moyenne Mobile LC

Prélèvement :

 Pas de décalage
 Décalage
statique
Dynamic
statique
 EURUSD
 17,7
 21,52 (+22%)   
 27,95 (+58%)      
 GBPUSD
 18,16
 15,46 (-15%)
 24,55 (+35%)
 USDJPY
 17,14
 15,94 (-7%)
 19,91 (+16%)

Table 30. Comparaison des valeurs de prélèvement maximum du tableau des meilleurs résultats d'optimisation de l'Expert Moyenne Mobile LC

Nombre de trades :

 Pas de décalage
 Décalage
statique
Statique
statique
 EURUSD
 111
 122 (+10%)     
 594 (+435%)       
 GBPUSD
 137
 107 (-22%)
 574 (+319%)
 USDJPY
 61
 71 (+16%)
 301 (+393%)

Table 31. Comparaison des valeurs maximales du nombre de trades du tableau des meilleurs résultats d'optimisation de la Moyenne Mobile LC Expert

La première chose qui attire tout de suite l'attention est une augmentation significative des points d'entrée dans le mode de changement de vitesse dynamique. Dans le même temps, cependant, le Prélèvement a sensiblement augmenté et le bénéfice a diminué deux fois pour l'EURUSD.

Le mode de décalage statique est plus rentable pour cet Expert Advisor. Ici, nous pouvons voir la diminution du prélèvement pour GBPUSD et USDJPY et une augmentation significative du profit pour EURUSD et GBPUSD.


6.2. Trading d'experts par le modèle «Pin Bar»

Profit :

 Pas de décalage
 Décalage
statique
Statique
statique
 EURUSD
504,59
1843,54 (+265%)
1185,65 (+135%)
 GBPUSD
187,13
1838,10 (+882%)
1906,84 (+919%)
 USDJPY
531,99
1108,83 (+108%)2472,67 (+365%)

Table 32. Comparaison des valeurs de profit maximum à partir des tableaux des meilleurs résultats d'optimisation du Pin Bar LC Expert

Prélèvement :

 Pas de décalage
 Décalage
statique
Statique
statique
 EURUSD
9,94
13,94 (+40%)
16,68 (+68%)
 GBPUSD
11,79
8,35 (-29%)
12,4 (+5%)
 USDJPY
18,25
9,91 (-46%)
19,71 (+8%)

Table 33. Comparaison des valeurs de prélèvement maximales du tableau des meilleurs résultats d'optimisation du Pin Bar LC Expert

Nombre de trades :

 Pas de décalage
 Décalage
statique
Statique
statique
 EURUSD
33
28 (-15%)
162 (+391%)
 GBPUSD
17
45 (+165%)
194 (+1041%)
 USDJPY
33
21 (-36%)
152 (+361%)

Table 34. Comparaison des valeurs maximales du nombre de transactions du tableau des meilleurs résultats d'optimisation du Pin Bar LC Expert

Ici, nous voyons également une augmentation substantielle du nombre de transactions dans le mode de décalage dynamique. Dans ce cas cependant, une augmentation significative du prélèvement, comme dans le cas similaire avec la Moyenne mobile LC Expert, ne concerne que l'EURUSD. Pour les autres paires, le prélèvement augmente de manière insignifiante, d'environ 5 à 8 %.

En mode décalage statique, l'optimisation a montré un profit limité pour GBPUSD et USDJPY. Néanmoins, nous pouvons voir une baisse significative du prélèvement pour les mêmes paires et sa hausse pour l'EURUSD. Le mode de décalage statique semble moins rentable pour cet Expert Advisor.


Conclusion

Dans cet article, nous avons considéré les principes de traçage du « graphique liquide » et comparé l'influence de ses modes de fonctionnement sur le résultat d'optimisation de l'expert en fonction des stratégies indicatrices et non indicatrices.

D'où les conclusions suivantes :

  • Pour les experts utilisant des stratégies d'indicateurs (par exemple le trading par moyenne mobile), le mode de décalage statique est plus approprié. Il assure une entrée sur le marché plus précise, ce qui entraîne une diminution du tirage et une augmentation du profit.
  • Le mode de décalage dynamique est meilleur pour les experts qui négocient par modèles. Ce mode augmente le nombre de points d'entrée bien que le prélèvement augmente en même temps.
  • Le mode de changement dynamique associé à une gestion de l'argent bien organisée peut donner des résultats impressionnants.
  • Bien qu'il semble très prometteur pour les stratégies d'indicateurs, le mode de décalage statique présente un inconvénient important. La valeur de décalage fournissant le meilleur résultat est une autre variable dans la liste des paramètres d'entrée qui doit être devinée correctement.

Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/1208

Fichiers joints |
liquid_chart.mq5 (27.15 KB)
pinbar_lc.mq5 (18.61 KB)
liquidchart.mqh (8.32 KB)
Les bases de la programmation MQL5 : Variables globales du terminal Les bases de la programmation MQL5 : Variables globales du terminal
Cet article met en évidence les capacités orientées objet du langage MQL5 pour créer des objets facilitant le travail avec les variables globales du terminal. Comme exemple pratique, je considère un cas où des variables globales sont utilisées comme points de contrôle pour la mise en œuvre des étapes du programme.
Tracer des lignes de tendance basées sur des fractales à l’aide de MQL4 et MQL5 Tracer des lignes de tendance basées sur des fractales à l’aide de MQL4 et MQL5
L’article décrit l’automatisation du traçage des lignes de tendance en fonction de l’indicateur Fractals à l’aide de MQL4 et MQL5. La structure de l’article fournit une vue comparative de la solution pour deux langues. Les courbes de tendance sont tracées à l’aide de deux dernières fractales connues.
Le livre de recettes statistique du trader : Hypothèses Le livre de recettes statistique du trader : Hypothèses
Cet article considère l'hypothèse - l'une des idées de base de la statistique mathématique. Diverses hypothèses sont examinées et vérifiées à l'aide d'exemples utilisant des méthodes de statistiques mathématiques. Les données réelles sont généralisées à l'aide de méthodes non paramétriques. Le progiciel Statistica et la bibliothèque d'analyse numérique portée ALGLIB MQL5 sont utilisés pour le traitement des données.
Le MQL5 Cookbook : Manipulation BookEvent Le MQL5 Cookbook : Manipulation BookEvent
Cet article considère BookEvent - une profondeur d'événement du marché, et le principe de son traitement. Un programme MQL, gérant les états de Profondeur du marché comme exemple. Il est écrit en utilisant l'approche orientée objet. Les résultats de la manipulation sont affichés à l'écran sous forme de panneau et de niveaux de profondeur de marché.