English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Création d’un indicateur avec des Options de Contrôle Graphique

Création d’un indicateur avec des Options de Contrôle Graphique

MetaTrader 5Exemples | 15 novembre 2021, 15:04
206 0
Vasily
Vasily

Introduction

Ceux qui sont familiers avec les attitudes du marché, connaissent l’indicateur MACD (son nom complet les Moyennes Mobiles de Divergence/ Convergence), comme un outil puissant pour une analyse des mouvements de prix qui est utilisé par les traders depuis les premiers instants de l’apparition des méthodes d’analyse informatique.

Pendant longtemps, j’ai étudié l’indicateur MACD qui a gagné sa place dans le graphique. J’ai vu de nombreux types différents de cet indicateur avec différentes options et différents algorithmes de calcul, j’ai donc décidé de combiner tous les types que je connais dans un seul indicateur.

Types d’indicateurs MACD

L’indicateur aura les lignes MACD conventionnelles et l’histogramme oSMA.  Définissons les principales modifications de MACD:
  1. MACD d’Elder, également connu sous le nom de système d’impulsion;
  2. MACD d’Elder sans vérification par la ligne mobile;
  3. L’oSMA, tracé avec différentes couleurs pour les cas en croissance et en chute;
  4. Seul l’histogramme oSMA est tracé;
  5. Seules les lignes MACD sont tracées ;

Paramètres initiaux de l’indicateur

Nous aurons besoin des paramètres suivants pour le calcul:

  1. La valeur d’une ligne MACD rapide;
  2. Valeur d’une ligne MACD lente ;
  3. La valeur d’une ligne MACD de signal;
  4. La valeur de la ligne de vérification des tendances selon la méthode Elder;

Pour tracer cet indicateur, nous aurons besoin des éléments suivants:

  1. La ligne MACD;
  2. Ligne de signal
  3. L’histogramme OSMA 3 couleurs.

Accédez au menu de l’Assistant MQL5 :

Figure 1. Création de à l’aide de l’Assistant MQL5


Figure 2. Définition des paramètres d’indicateur communs dans l’Assistant MQL5


Figure 3. Définition des propriétés de dessin de l’indicateur dans l’Assistant MQL5

Supprimer un Indicateur

Nous avons un modèle initial de l’indicateur. Tout d’abord, nous devons calculer la ligne MACD de notre indicateur.

Nous n’approfondirons pas la formule exacte pour le calcul de cette ligne - nous utiliserons la fonction iMACD:  

int iMACD (
   string symbol,           // symbol name
   ENUM_TIMEFRAMES period,   // time period
   int fast_ema_period,    // fast averaging period
   int slow_ema_period,    // slow averaging period
   int signal_period,      // averaging period of a signal line
   ENUM_APPLIED_PRICE applied_price // type of price or a handle
   )

Cette fonction renvoie une poignée de la copie appropriée de l’indicateur. En utilisant cette poignée, il est possible d’obtenir les données, calculées par cet indicateur. Les données d’un tampon d’indicateur (les indicateurs techniques comportent les données calculées dans leurs propres tampons internes, qui peuvent aller jusqu’à 5, selon l’indicateur), peuvent être copiées à l’aide de la fonction CopyBuffer(). 

Ensuite, nous générons une demande de données MACD à l’aide de la fonction iMACD:

int MACDhadling =  iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);

Il nous renverra une poignée de la copie de l’indicateur.

Copiez les données dans la mémoire tampon nécessaire via la fonction CopyBuffer :

int  CopyBuffer(
   int       indicator_handle,     // indicator's handle
   int       buffer_num,           // buffer number of the indicator
   int       start_pos,            // start position 
   int       count,                // number of data to copy
   double    buffer[]              // target array for the data to copy
   );

Demandons maintenant la ligne MACD de l’indicateur:

CopyBuffer(MACDhadling,0,0,NewData,MACDlineBuffer);

Nous obtenons la ligne de signal de l’indicateur

CopyBuffer(MACDhadling,1,0,NewData,SignallineBuffer);

Rassemblons tout cela et voyons ce que nous avons:

int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer);
CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);

Maintenant, nous avons la MACD calculée et les lignes de signal.

Continuons.

En raison du fait que les données de

MACDlineBuffer

et

SignallineBuffer

buffers ont été obtenu par copie, leur indexation se fait à partir de la fin du graphique.

Historiquement, un accès aux données du tableau de prix est effectué à partir de la fin des données. Physiquement, les nouvelles données sont toujours écrites à la fin du tableau, mais l’index de la barre actuelle (inachevée) est toujours égal à zéro. L’index égal à 0 dans le tableau des séries chronologiques signifie que les données de la barre actuelle, qui correspond à l’intervalle de temps inachevé de cette période.

Afin d’utiliser le même sens d’indexation dans tous les tampons, nous devons définir les autres tampons comme des séries chronologiques.

ArraySetAsSeries(HistogramBuffer,false);
ArraySetAsSeries(HistogramColors,false);

Nous devons obtenir les données d’un histogramme, il est calculé en utilisant la soustraction de la ligne de signal de la ligne MACD:

for(int i=0;i<rates_total;i++)
  {
   HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];
  }

Combinons tous ensemble:

ArraySetAsSeries(HistogramBuffer,false);
ArraySetAsSeries(HistogramColors,false);

int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer);
CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);

for(int i=0;i<rates_total;i++)
  {
   HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];
   HistogramColors[i]=1; 
  }


Création d’un système graphique du contrôle d’indicateur

Nous avons 5 variétés de cet indicateur.

Tout d’abord, nous implémentons les points No3 et No4.

    3. Seul l’histogramme oSMA est tracé;
    4. Seules les lignes MACD sont tracées.

Créons les boutons appropriés.

Pour le point 4 :

ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100);   //creating the button
ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75);              //assign the coordinates
ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5);
ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER);  // and an anchor point
ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD");            // button label 
ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70);                 // size of buttons 
ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false);         // to make it selectable

Pour un cas de suppression accidentelle du bouton ou de son décalage à la prochaine coche, le bouton reviendra.

Pour l’article n° 3 :

ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
ObjectSetString (0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA");
ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false);

Créons l’implémentation pour le cas du bouton enfoncé et non enfoncé pour la condition 4.

Cela nécessite l’affichage des index de mémoire tampon.

SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA);
SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA);
SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA);
SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX);
if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1)
  {
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 0 isn't plotted
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE); // the buffer with index 1 isn't plotted
  }
else
  {
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 0 is plotted as line
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); // the buffer with index 1 is plotted as line
  }

Les lignes MACD sont tracées du bouton est enfoncé, et ne sont pas tracées ce n’est pas le cas.

Créons l’implémentation pour le cas du bouton enfoncé et non enfoncé pour la condition 3.

if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1)
  {
   //the buffer with index 2 isn't plotted
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE);
  }
else
  {
   //the buffer with index 2 is plotted as a color histogram
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
  }

Créons deux boutons : « 2color » et « Impulse » et localisez-les dans le coin inférieur droit du graphique.

ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100);
ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75);
ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50);
ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false);
ObjectSetString (0,"2color",OBJPROP_TEXT,"MultiColor");

ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100);
ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75);
ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25);
ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8);
ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70);
ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20);
ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false);

Pour la vérification Impuse selon le système Elder, nous devons ajouter un nouveau tableau où les valeurs EldersMA seront situées.

Pour ce faire, nous devons augmenter le nombre total de tampons d’un.+

#property indicator_buffers 4

devrait être remplacé par :

#property indicator_buffers 5

et nous déclarons un nouveau tampon.

double EldersiEMA[];

Nous le définissons comme un tampon pour les calculs internes :

SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS);

Copions maintenant les valeurs de moyenne mobile exponentielle dans le tampon :

// you can do all in single line
CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA); 

Étant donné que le tampon a été obtenu par la fonction de copie, son indexation est la même que pour les autres tampons de notre graphique - à partir du graphique ent.

Rédigeons maintenant les conditions pour l’OsMA 2 couleurs:

if (ObjectGetInteger(0,"2color",OBJPROP_STATE))
  {
   for(int i=1;i<rates_total;i++)
     {
      // if the histogram rises, the color is set to 0
      if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0;
      // if the histogram falls, the color is set to 1
      if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1;
     }
  }
else
  {
   ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
   // Here are the conditions for multi-color OSMA
  }

Les index de couleur sont indiqués dans les lignes :

#property indicator_label3  "Histogram"
#property indicator_type3   DRAW_COLOR_HISTOGRAM
#property indicator_color3  DeepSkyBlue,Red,Green

L’indice de la première couleur est égal à 0, l’indice de la seconde est 1, et ainsi de suite.

Rédigeons maintenant les conditions pour les variations du Système d’Impulsion:

if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) // // "Impulse" button is checked
  {
   ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");  // checking for a trend using the MACD-Line
   for(int i=1;i<rates_total;i++)
     {
      // the histogram rises and MACD-line rises
      if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0;
      else
        {
         // the histogram falls and MACD-line falls 
         if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1;
         else HistogramColors[i]=2; // if there isn't any conditions satisfied
        }
     }
  }
else 
  {
   ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's");  // checking for a trend using the EMA-line
   for(int i=1;i<rates_total;i++)
     {
      // the histogram rises and EMA-line rises
      if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0;
      else
        {
         // the histogram falls and EMA-line falls
         if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1;
         else HistogramColors[i]=2;// if there isn't any conditions satisfied
        }
     }
  }

Ajoutons maintenant les conditions du Système d’Impulsion aux conditions de traçage OsMA:

if (ObjectGetInteger(0,"2color",OBJPROP_STATE))
  {
   for(int i=1;i<rates_total;i++)
     {
      if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0;
      if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1;
     }
  }
else
  {
   ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
   if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE))
     {
      ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");
      for(int i=1;i<rates_total;i++)
        {
         if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0;
         else
           {
            if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1;
            else HistogramColors[i]=2;
           }
        }
     }
   else 
     {
      ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's");
      for(int i=1;i<rates_total;i++)
        {
         if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0;
         else
           {
            if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1;
            else HistogramColors[i]=2;
           }
        }
     }
  }

Maintenant, rédigeons les conditions pour éviter les clignotements inutiles des boutons:

if (ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString (0,"2color",OBJPROP_TEXT,"2ColorMACD");
else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
if (ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString (0,"Impulse",OBJPROP_TEXT,"Impulse");
else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's")

nous supprimons le code, qui modifie le texte d’un bouton.

En combinant tous ensemble:

//+------------------------------------------------------------------+
//|                                            MACD_By_CoreWinTT.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   3
//---- plot MACDline
#property indicator_label1  "MACDline"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Green
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//---- plot Signalline
#property indicator_label2  "Signalline"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Red
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//---- plot Histogram
#property indicator_label3  "Histogram"
#property indicator_type3   DRAW_COLOR_HISTOGRAM
#property indicator_color3  DeepSkyBlue,Red,Green
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2

//--- input parameters
input int      Fast=12;
input int      Slow=26;
input int      Signal=9;
input int      EldersEMA=13;
//--- indicator buffers
double         MACDlineBuffer[];
double         SignallineBuffer[];
double         HistogramBuffer[];
double         HistogramColors[];
double         EldersiEMA[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MACDlineBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SignallineBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,HistogramBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,HistogramColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4,EldersiEMA,INDICATOR_CALCULATIONS);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   ArraySetAsSeries(HistogramBuffer,false);
   ArraySetAsSeries(HistogramColors,false);

   int MACDhadling=iMACD(NULL,0,Fast,Slow,Signal,PRICE_CLOSE);
   CopyBuffer(MACDhadling,0,0,rates_total,MACDlineBuffer);
   CopyBuffer(MACDhadling,1,0,rates_total,SignallineBuffer);

   for(int i=0;i<rates_total;i++) { HistogramBuffer[i]=MACDlineBuffer[i]-SignallineBuffer[i];HistogramColors[i]=1; }

   ObjectCreate(0,"ShowMACD",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_YDISTANCE,5);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSetString(0,"ShowMACD",OBJPROP_TEXT,"ShowMACD");
   ObjectSetInteger(0,"ShowMACD",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"ShowMACD",OBJPROP_SELECTABLE,false);

   ObjectCreate(0,"ShowOsMA",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_YDISTANCE,30);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSetString(0,"ShowOsMA",OBJPROP_TEXT,"Show OsMA");
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"ShowOsMA",OBJPROP_SELECTABLE,false);

   if(ObjectGetInteger(0,"ShowMACD",OBJPROP_STATE)!=1) 
     {
      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_NONE);
      PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_NONE);
     }
   else 
     {
      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
      PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
     }

   if(ObjectGetInteger(0,"ShowOsMA",OBJPROP_STATE)!=1) 
     {
      PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_NONE);
     }
   else 
     {
      PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
     }

   ObjectCreate(0,"2color",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"2color",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"2color",OBJPROP_YDISTANCE,50);
   ObjectSetInteger(0,"2color",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
   ObjectSetInteger(0,"2color",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"2color",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"2color",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"2color",OBJPROP_SELECTABLE,false);
   ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");

   ObjectCreate(0,"Impulse",OBJ_BUTTON,ChartWindowFind(),100,100);
   ObjectSetInteger(0,"Impulse",OBJPROP_XDISTANCE,75);
   ObjectSetInteger(0,"Impulse",OBJPROP_YDISTANCE,25);
   ObjectSetInteger(0,"Impulse",OBJPROP_CORNER,CORNER_RIGHT_LOWER);
   ObjectSetInteger(0,"Impulse",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,"Impulse",OBJPROP_XSIZE,70);
   ObjectSetInteger(0,"Impulse",OBJPROP_YSIZE,20);
   ObjectSetInteger(0,"Impulse",OBJPROP_SELECTABLE,false);
   ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");

   if(ObjectGetInteger(0,"2color",OBJPROP_STATE)) ObjectSetString(0,"2color",OBJPROP_TEXT,"2ColorMACD");
   else ObjectSetString(0,"2color",OBJPROP_TEXT,"MultiColor");
   if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE)) ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Impulse");
   else ObjectSetString(0,"Impulse",OBJPROP_TEXT,"Elder's");

   CopyBuffer(iMA(NULL,0,EldersEMA,0,MODE_EMA,PRICE_CLOSE),0,0,rates_total,EldersiEMA);

   if(ObjectGetInteger(0,"2color",OBJPROP_STATE))
     {
      for(int i=1;i<rates_total;i++)
        {
         if(HistogramBuffer[i] > HistogramBuffer[i-1]) HistogramColors[i]=0;
         if(HistogramBuffer[i] < HistogramBuffer[i-1]) HistogramColors[i]=1;
        }
     }
   else
     {
      if(ObjectGetInteger(0,"Impulse",OBJPROP_STATE))
        {
         for(int i=1;i<rates_total;i++)
           {
            if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (MACDlineBuffer[i]>MACDlineBuffer[i-1])) HistogramColors[i]=0;
            else
              {
               if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (MACDlineBuffer[i]<MACDlineBuffer[i-1])) HistogramColors[i]=1;
               else HistogramColors[i]=2;
              }
           }
        }
      else 
        {
         for(int i=1;i<rates_total;i++)
           {
            if((HistogramBuffer[i]>HistogramBuffer[i-1]) && (EldersiEMA[i]>EldersiEMA[i-1])) HistogramColors[i]=0;
            else
              {
               if((HistogramBuffer[i]<HistogramBuffer[i-1]) && (EldersiEMA[i]<EldersiEMA[i-1])) HistogramColors[i]=1;
               else HistogramColors[i]=2;
              }
           }

        }
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Le schéma fonctionnel de l’algorithme est illustré à la figure 4 :



Figure 4. Le schéma fonctionnel de l’algorithme indicateur

Le résultat est illustré aux Figures 5 à 7.

Fig. 5

Fig. 6

Fig. 7

Conclusion

Cet article peut être considéré comme un guide pour les débutants, qui commencent à étudier les marchés en utilisant l’analyse informatique des prix et l’implémentation des méthodes simples de contrôle graphique des indicateurs.

J’espère que cet article améliorera vos compétences techniques dans la création de systèmes de contrôle graphique et vous aidera à trouver votre propre « vision du marché » en cachant les choses qui entravent.

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

Fichiers joints |
Interaction MetaTrader 5 et MATLAB Interaction MetaTrader 5 et MATLAB
Cet article couvre les détails de l'interaction entre MetaTrader 5 et le package mathématique MatLab. Il indique le mécanisme de conversion des données, le processus d’élaboration d'une bibliothèque universelle pour interagir avec le bureau MatLab. Il couvre également l'utilisation des DLL générées par l'environnement MatLab. Cet article est destiné aux lecteurs expérimentés, connaissant C++ et MQL5.
Gestion des événements dans MQL5 : Modification de la période  MA à la volée Gestion des événements dans MQL5 : Modification de la période MA à la volée
Admettons qu'un simple indicateur MA (Moyenne mobile) avec la période 13 soit appliqué à un graphique. Et nous souhaitons modifier la période à 20, mais nous ne souhaitons pas aller dans la boîte de dialogue des propriétés de l'indicateur et éditer le nombre 13 à 20 : tout simplement fatigué de ces actions fastidieuses avec la souris et le clavier. Et surtout nous ne souhaitons pas ouvrir le code indicateur et le modifier. Nous souhaitons faire tout cela d'une simple pression sur un bouton - "flèches vers le haut" à côté du pavé numérique. Dans cet article, je vais décrire comment le faire.
Création d'un indicateur avec plusieurs tampons d'indicateurs pour les débutants Création d'un indicateur avec plusieurs tampons d'indicateurs pour les débutants
Les codes complexes sont constitués d’un ensemble de codes simples. Si vous les connaissez, cela n’a pas l’air si compliqué. Dans cet article, nous allons examiner comment créer un indicateur avec plusieurs tampons d’indicateurs. À titre d’exemple, l’indicateur Aroon est analysé en détail et deux versions différentes du code sont présentées.
MQL5: Analyse et traitement des rapports de la Commodity Futures Trading Commission (CFTC) dans MetaTrader 5 MQL5: Analyse et traitement des rapports de la Commodity Futures Trading Commission (CFTC) dans MetaTrader 5
Dans cet article, nous allons élaborer un outil d’analyse des rapports CFTC. Nous allons résoudre le problème suivant: élaborer un indicateur, qui permet d’utiliser les données du rapport CFTC directement à partir des fichiers de données fournis par la Commission sans traitement intermédiaire et conversion. En outre, il peut être utilisé à différentes fins: pour tracer les données en tant qu’indicateur, pour procéder avec les données dans les autres indicateurs, dans les scripts pour l’analyse automatisée, dans les Expert Advisors pour l’utilisation dans les stratégies de trading.