![Création d’un indicateur avec des Options de Contrôle Graphique](https://c.mql5.com/i/articles/overlay.png)
Création d’un indicateur avec des Options de Contrôle Graphique
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:- MACD d’Elder, également connu sous le nom de système d’impulsion;
- MACD d’Elder sans vérification par la ligne mobile;
- L’oSMA, tracé avec différentes couleurs pour les cas en croissance et en chute;
- Seul l’histogramme oSMA est tracé;
- Seules les lignes MACD sont tracées ;
Paramètres initiaux de l’indicateur
Nous aurons besoin des paramètres suivants pour le calcul:
- La valeur d’une ligne MACD rapide;
- Valeur d’une ligne MACD lente ;
- La valeur d’une ligne MACD de signal;
- 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:
- La ligne MACD;
- Ligne de signal
- 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
![Interaction MetaTrader 5 et MATLAB](https://c.mql5.com/2/0/matlab.png)
![Gestion des événements dans MQL5 : Modification de la période MA à la volée](https://c.mql5.com/2/0/How_Change_Period_Moving_Average_on_the_fly_MQL5__1.png)
![Création d'un indicateur avec plusieurs tampons d'indicateurs pour les débutants](https://c.mql5.com/2/0/P2054.png)
![MQL5: Analyse et traitement des rapports de la Commodity Futures Trading Commission (CFTC) dans MetaTrader 5](https://c.mql5.com/2/0/trader_mql5__1.png)
![MQL5 - Langage des stratégies de trading intégré au terminal client MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation