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
274 13
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 |
Derniers commentaires | Aller à la discussion (13)
Mykola Demko
Mykola Demko | 19 juin 2013 à 11:44
Radmin:

L'indicateur est tout simplement merveilleux, l'article est 5+, l'auteur est intelligent !

Mais il est pour MT5, je voudrais vraiment l'utiliser dans mt4, comme je ne suis pas fort en programmation je ne peux pas le porter pour mt4, mes amis, comment faire ? peut-être qu'il y a déjà quelque chose de prêt, merci de me donner un lien...

Il n'est pas possible de le porter tel quel, MQL4 n'a pas les mêmes capacités que MQL5.

En particulier, cet indicateur manque d'objets...

OBJ_BUTTON

Mais si vous le faites vous-même, je peux vous conseiller, vous pouvez remplacer les objets "boutons" par des scripts qui vont changer des variables globales, et les scripts doivent être accrochés à des raccourcis clavier. En conséquence, le contrôle ne doit pas être lié aux boutons, mais à l'état des variables globales.

Rustamzhan Salidzhanov
Rustamzhan Salidzhanov | 19 juin 2013 à 14:04
Urain:

Il n'est pas possible de le porter tel quel, MQL4 n'ayant pas les mêmes capacités que MQL5.

En particulier, cet indicateur manque d'objets....

Mais si vous le faites par vous-même, je peux vous donner un conseil, les objets "boutons" peuvent être remplacés par des scripts qui vont changer les variables globales, et les scripts peuvent être accrochés aux touches de raccourcis. Ainsi, le contrôle n'est pas lié aux boutons mais à l'état des variables globales.

mais tout fonctionne pour moi... étrange :)

jiuhongzhi
jiuhongzhi | 25 juin 2014 à 14:41
Pas d'affichage !
Roberto_Ev
Roberto_Ev | 14 oct. 2016 à 13:48
Rustamzhan Salidzhanov:

mais tout fonctionne pour moi... bizarre :)

Je n'ai jamais entendu parler de la programmation.

J'ai besoin d'un MACD qui a 5 lignes, si les quatre premières reçoivent les mêmes configurations, SM, EMA, ..., mais la dernière peut recevoir une configuration SM, EMA, .... différente. diferente.

Je ne sais pas si c'est possible, mais si c'est le cas, comment faire pour l'ajouter à votre code ?

OBS : cette dernière est d'une durée extrêmement longue.

Merci.

-------------------------------------------------------------------------------------

Google translate

Malheureusement Vasile, je ne connais rien à la programmation.

Je cherche un MACD qui a 5 lignes, les quatre premières ayant la même configuration, SM, EMA, ..., mais la dernière peut avoir une configuration SM, EMA, .... différente. différente.

Je ne sais même pas si c'est possible, mais si c'est le cas, comment puis-je l'ajouter à mon code ?

Note: La dernière est une période extrêmement longue.

Merci.
Hermano Soares
Hermano Soares | 15 févr. 2020 à 16:07

Bonjour,


Je suis à la recherche d'un EA qui pourrait exécuter des entrées basées sur la stratégie des couleurs, Exemple : sur la deuxième bougie du changement des couleurs hautes ou basses le robot exécuterait un ordre en faveur, est-ce que cet EA existe ? ou où puis-je trouver un matériel à étudier et à fabriquer, j'ai l'intention de l'utiliser sur la plateforme IQoption ? merci pour votre soutien.


Dans l'attente de votre réponse, je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées.

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.