English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Création d'un Indicateur Multidevise à l'Aide d'un Certain Nombre de Tampons d'Indicateurs Intermédiaires

Création d'un Indicateur Multidevise à l'Aide d'un Certain Nombre de Tampons d'Indicateurs Intermédiaires

MetaTrader 5Indicateurs | 17 novembre 2021, 15:06
198 0
Alexey Klenov
Alexey Klenov

Introduction

Tout a commencé lorsque j'ai entendu parler pour la première fois des indicateurs de bloc dans l'article Base Théorique de la Construction d'Indicateurs de Bloc pour le FOREX. C'était très intéressant pour moi à l'époque, et j'ai décidé d'écrire quelque chose de similaire en termes d'analyse multi-marchés. Dans un premier temps, j'ai implémenté ma propre version de l'indicateur, nom de code MultiCurrencyIndex, dans lequel les valeurs calculées des indices de devises sont utilisées pour calculer les taux des indicateurs classiques (RSI, MACD, CCI). 

Et maintenant je vais vous dire comment j'ai transféré cet indicateur vers une nouvelle plateforme, MetaTrader 5 en complément de MQL5, sauf qu'au lieu de calculer le CCI, je vais calculer l'indicateur de Stochastique (Stochastic Oscillator), qui est plus prospectif ( À mon avis).

Commençons par quelques définitions.

Dollar Index - - double valeur calculée par la formule, généreusement offerte par Neutron.

La formule de calcul de l'indice USD,

où il y a USD / YYY - toutes les cotations directes, telles que USD / CHF, XXX / USD - toutes en amont, telles que EUR / USD.

D'autres indices sont calculés à partir des valeurs des paires de devises clôturées, comprenant USD.

Lignes principales - deux lignes de l'indicateur, reflétant les données calculées, liées directement au graphique actuel. Par exemple, sur le graphique EURUSD, il y aura des lignes de devises EUR et USD.

Lignes supplémentaires - autres lignes indicatrices calculées, non liées au graphique actuel. Par exemple, pour le même graphique EURUSD, ce seront les lignes des devises GBP, CHF, JPY, CAD, AUD et NZD.

Clôture - la valeur du cours de clôture de la barre de la période actuelle (tapez double) pour la paire de devises nécessaire.

Commençons.

La définition du problème

Pour commencer, nous devons définir le problème.

  1. Synchronisez les graphiques des paires de devises concernées de cette période.
  2. Accédez aux données de clôture de sept paires de devises : EURUSD, GBPUSD, USDCHF, USDJPY, USDCAD, AUDUSD, NZDUSD, et placez-les dans les tampons d'indicateurs, élaborés pour les calculs auxiliaires.
  3. Sur la base des données obtenues dans l’élément (2), calculez pour la barre courante l'indice du dollar.
  4. Connaissant l'indice du dollar pour la barre actuelle, calculez les indices de devises restants.
  5. Effectuez les calculs de données (éléments 3 et 4) un nombre de fois requis pour la durée désignée de l'historique.
  6. En fonction de la destination de l'indicateur, calculez les valeurs des devises pour chacun des indices sélectionnés :
    • Indice de Force Relative (indice de force relative, RSI);
    • Moyennes mobiles de convergence/divergence (Moyenne mobile de convergence/divergence, MACD) ;
    • Oscillateur stochastique (oscillateur stochastique);
    • À l'avenir, la liste pourrait être complétée.

Pour cela nous aurons besoin de :

31 Buffer de l'indicateur

  • 0-7 inclus - tampons pour rendre les lignes finales ;
  • 8-14 inclus - tampons des principales paires de devises, qui comportent l' USD ;
  • 15-22 inclus - tampons des indices de devises ;
  • 23-30 inclus - tampons de données intermédiaires stochastiques par type close/close sans lissage.

Pour sélectionner la destination d'un indicateur, nous allons faire une énumération de type énuméré :

enum Indicator_Type
  {
   Use_RSI_on_indexes             = 1, // RSI of the index  
   Use_MACD_on_indexes            = 2, // MACD from the index  
   Use_Stochastic_Main_on_indexes = 3  // Stochastic on the index
  };
Ensuite, à l'aide de la commande d'entrée, dans la fenêtre des préférences de l'indicateur, nous dériverons pour les sélections de l'utilisateur de cette liste 
input Indicator_Type ind_type=Use_RSI_on_indexes;  // type of the indicator from the index

Il est possible de rendre plus conviviale la façon d’afficher des noms des paramètres d'entrée sur l'onglet "Entrées". Pour le faire, nous utilisons le commentaire urgent, qui doit être placé après la description du paramètre d'entrée, dans la même ligne. Ainsi, les paramètres d'entrée peuvent être comparés à des noms plus facilement compréhensibles pour l'utilisateur.

Les mêmes règles s'appliquent à la liste des commandes enum . C'est-à-dire que si le nom mnémonique est associé à un commentaire, comme le montre notre exemple, à la place du nom mnémonique, le contenu de ce commentaire sera affiché . Cela offre une flexibilité supplémentaire dans l'écriture de programmes avec des descriptions claires des paramètres d'entrée.

Les développeurs ont essayé de fournir à l'utilisateur final des moyens pratiques de travailler avec le programme MQL5, en s'assurant qu'il voit des noms de paramètres compréhensibles au lieu de ce qui est écrit dans le code. Plus d'informations peuvent être trouvées ici.

Figure 1. Sélection du type d'indicateur

Figure 1. Sélection du type d'indicateur

Nous mettons à disposition de l'utilisateur un choix de devises nécessaires au rendu de l'indicateur et de sa couleur :

input bool USD=true;
input bool EUR=true;
input bool GBP=true;
input bool JPY=true;
input bool CHF=true;
input bool CAD=true;
input bool AUD=true;
input bool NZD=true;

input color Color_USD = Green;            // USD line color
input color Color_EUR = DarkBlue;         // EUR line color
input color Color_GBP = Red;             // GBP line color
input color Color_CHF = Chocolate;        // CHF line color
input color Color_JPY = Maroon;           // JPY line color
input color Color_AUD = DarkOrange;       // AUD line color
input color Color_CAD = Purple;          // CAD line color
input color Color_NZD = Teal;            // NZD line color

Figure 2. Sélection de la couleur des lignes indicatrices

Figure 2. Sélection de la couleur des lignes indicatrices

Quelques autres paramètres configurables :

input string rem000        =  ""; // depending on the type of the indicator
input string rem0000       =  ""; // requires a value :
input int rsi_period       =   9; // period RSI
input int MACD_fast        =   5; // period MACD_fast
input int MACD_slow        =  34; // period MACD_slow
input int stoch_period_k   =   8; // period Stochastic %K
input int stoch_period_sma =   5; // period of smoothing for Stochastics %K
input int shiftbars        = 500; // number of bars for calculating the indicator

Figure 3. Paramètres de l'indicateur

Figure 3. Paramètres de l'indicateur

Une limite de 500 barres pour le calcul de l'indicateur est artificielle, mais elle suffit à démontrer le concept du calcul. Mais nous devons nous rappeler que chaque tampon d'indicateur nécessite de la mémoire, et un affichage d'une très grande taille variable (en millions de barres), peut entraîner un manque de mémoire de l'ordinateur.

Tampons d’indicateur:

double  EURUSD[], // quotes
        GBPUSD[],
        USDCHF[],
        USDJPY[],
        AUDUSD[],
        USDCAD[],
        NZDUSD[];   
               
double    USDx[], // indexes
          EURx[],
          GBPx[],
          JPYx[],
          CHFx[],
          CADx[],
          AUDx[],
          NZDx[];
                         
double USDplot[], // results of currency lines
       EURplot[],
       GBPplot[],
       JPYplot[],
       CHFplot[],
       CADplot[],
       AUDplot[],
       NZDplot[]; 

double USDStoch[], // buffers of intermediate data schotastics by the close/close type without smoothing
       EURStoch[],
       GBPStoch[],
       JPYStoch[],
       CHFStoch[],
       CADStoch[],
       AUDStoch[],
       NZDStoch[];
Nous aurons également besoin de quelques variables globales (au niveau de l'indicateur) :
int              i,ii;
int           y_pos=0; // Y coordinate variable for the informatory objects  
datetime   arrTime[7]; // Array with the last known time of a zero valued bar (needed for synchronization)  
int        bars_tf[7]; // To check the number of available bars in different currency pairs  
int        countVal=0; // Number of executable Rates  
int           index=0;
datetime  tmp_time[1]; // Intermediate array for the time of the bar 

Et maintenant, nous arrivons à une fonctionnalité assez longue OnInit, à l'aide de laquelle nous allons distribuer les tampons d'indicateurs en fonction de leurs objectifs.

Puisque les calculs initiaux passent par l'indice du dollar, alors pour l' USD nous établissons simplement la possibilité de désactiver le rendu des tampons de l'indicateur de devise.

Cela ressemble à ceci :

if(USD)
  {
   countVal++;
   SetIndexBuffer(0,USDplot,INDICATOR_DATA);               // array for rendering
   PlotIndexSetString(0,PLOT_LABEL,"USDplot");              // name of the indicator line (when selected with a mouse)
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,shiftbars);       // from which we begin rendering
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (line)
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Color_USD);       // color of line rendering
   if(StringFind(Symbol(),"USD",0)!=-1)
     {PlotIndexSetInteger(0,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains USD 
                                                       // then draw a line of appropriate width 
   else
     {PlotIndexSetInteger(0,PLOT_LINE_STYLE,style_slave);}
   ArraySetAsSeries(USDplot,true);                       // indexation of array as a timeseries   
   ArrayInitialize(USDplot,EMPTY_VALUE);                  // zero values 
   f_draw("USD",Color_USD);                            // rendering in the indicator information window 
  }
SetIndexBuffer(15,USDx,INDICATOR_CALCULATIONS);            // array of dollar index for calculations
                                                      // (is not displayed in the indicator as a line) 
ArraySetAsSeries(USDx,true);                            // indexation of an array as a time series
ArrayInitialize(USDx,EMPTY_VALUE);                       // zero values

if(ind_type==Use_Stochastic_Main_on_indexes)
  {
   SetIndexBuffer(23,USDstoch,INDICATOR_CALCULATIONS);     // if the destination of the indicator as a Use_Stochastic_Main_on_indexes,
                                                           // then this intermediate array is needed
   ArraySetAsSeries(USDstoch,true);                        // indexation of array as a time series
   ArrayInitialize(USDstoch,EMPTY_VALUE);                  // zero values
  }
Pour la devise EUR, le code de fonction OnInit ressemble à ceci :
if(USD)
  {
   countVal++;
   SetIndexBuffer(0,USDplot,INDICATOR_DATA);              // array for rendering
   PlotIndexSetString(0,PLOT_LABEL,"USDplot");             // name of the indicator line (when selected with a mouse)
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,shiftbars);       // from which we begin rendering
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (line)
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Color_USD);       // color of line rendering
   if(StringFind(Symbol(),"USD",0)!=-1)
     {PlotIndexSetInteger(0,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains USD 
                                                       // then draw a line of appropriate width 
   else
     {PlotIndexSetInteger(0,PLOT_LINE_STYLE,style_slave);}
   ArraySetAsSeries(USDplot,true);                       // indexation of array as a timeseries
   ArrayInitialize(USDplot,EMPTY_VALUE);                  // zero values 
   f_draw("USD",Color_USD);                             // rendering in the indicator information window 
  }
SetIndexBuffer(15,USDx,INDICATOR_CALCULATIONS);             // array of dollar index for calculations
                                                       // (is not displayed in the indicator as a line) 
ArraySetAsSeries(USDx,true);                             // indexation of an array as a time series
ArrayInitialize(USDx,EMPTY_VALUE);                        // zero values

if(ind_type==Use_Stochastic_Main_on_indexes)
  {
   SetIndexBuffer(23,USDstoch,INDICATOR_CALCULATIONS);      // if the destination of the indicator as a Use_Stochastic_Main_on_indexes,
                                                       // then this intermediate array is needed
   ArraySetAsSeries(USDstoch,true);                      // indexation of array as a time series
   ArrayInitialize(USDstoch,EMPTY_VALUE);                 // zero values
  }

if(EUR)
  {
   countVal++;
   SetIndexBuffer(1,EURplot,INDICATOR_DATA);              // array for rendering
   PlotIndexSetString(1,PLOT_LABEL,"EURplot");             // name of the indicator line (when pointed to with a mouse)
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,shiftbars);       // which we begin rendering from
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);         // drawing style (lines)
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Color_EUR);       // the color of rendering lines
   if(StringFind(Symbol(),"EUR",0)!=-1)
     {PlotIndexSetInteger(1,PLOT_LINE_WIDTH,wid_main);}    // if the symbol name contains EUR
                                                       // then we draw a line of the appropriate width 
   else
     {PlotIndexSetInteger(1,PLOT_LINE_STYLE,style_slave);}  // if the symbol name does NOT contain EUR,
                                                       // then we draw a line of an appropriate style (on the crosses)
   ArraySetAsSeries(EURplot,true);                       // indexation of the array as a time series
   ArrayInitialize(EURplot,EMPTY_VALUE);                  // zero values
   SetIndexBuffer(8,EURUSD,INDICATOR_CALCULATIONS);        // data of Close currency pair EURUSD
   ArraySetAsSeries(EURUSD,true);                        // indexation of the array as a time series
   ArrayInitialize(EURUSD,EMPTY_VALUE);                   // zero values
   SetIndexBuffer(16,EURx,INDICATOR_CALCULATIONS);         // array of the EURO index for calculations
                                                      // (not displayed on the indicator as a line) 
   ArraySetAsSeries(EURx,true);
   ArrayInitialize(EURx,EMPTY_VALUE);
   if(ind_type==Use_Stochastic_Main_on_indexes)
     {
      SetIndexBuffer(24,EURstoch,INDICATOR_CALCULATIONS);   // if the indicator destination as a Use_Stochastic_Main_on_indexes,
                                                       // then this intermediate array is needed
      ArraySetAsSeries(EURstoch,true);                   // indexation of the array as a time series
      ArrayInitialize(EURstoch,EMPTY_VALUE);              // zero values
     }
   f_draw("EUR",Color_EUR);                            // rendering in the indicator information window
  }
Par analogie avec l' EUR, le code aura la même apparence que les devises, telles que GBP, JPY, CHF, CAD, AUD et NZD, déplaçant les indices des tampons indicateurs. Le code de ces devises se trouve dans le fichier joint de l'indicateur.

Ceci termine la description de l'initialisation de l'indicateur.

Ensuite, nous aurons besoin de certaines fonctionnalités utilisateur personnalisées :

  • Le calcul du RSI sur le buffer de l'utilisateur
  • Calcul du MACD
  • Calcul de SMA sur le buffer utilisateur
  • Calcul de clôture stochastique / clôture sans lissage
  • Objets de rendu (informations)
  • Commentaire dans le coin inférieur droit de l'indicateur (indicateur d'état)
  • Initialisation des paires de devises TF concernées

Brève description de chacun d'entre eux :

  • Le calcul du RSI sur le tampon de l'utilisateur

Paramètres d’entrée

double f_RSI(double &buf_in[], int period,int shift),

buf_in[] - type de tableau double (comme les séries chronologiques), période - période d'indicateur RSI, décalage - pour quelle barre d'index nous calculons l'indicateur. Renvoie une valeur de type double.

  • Calcul du MACD

Paramètres d’entrée

double f_MACD(double &buf_in[], int period_fast,int period_slow,int shift),

buf_in[] - tableau de type double (comme les séries chronologiques), period_fast - period fast МА, period_slow- period slow МА, décalage - pour quelle barre d'index nous calculons l'indicateur. Renvoie une valeur de type double.

  • Calcul de la SMA

Paramètres d’entrée

double SimpleMA(const int position,const int period,const double &price[]),

position - pour quelle barre d'index nous calculons l'indicateur. period - période de l'indicateur SMA, price[] - tableau de temps double (comme les séries chronologiques). Renvoie une valeur de type double.

  • Calcul de clôture stochastique / clôture sans lissage

Paramètres d’entrée

double f_Stoch(double &price[], int period_k, int shift),

price[] - tableau de type double (comme les séries chronologiques), period_fast - ligne d'indicateur de période %K, décalage - pour quelle barre d'index nous calculons l'indicateur. Renvoie une valeur de type double.

  • Rendu d'objets

Paramètres d’entrée

int f_draw(string name, color _color)

nom - nom d’objet, _couleur - couleur d’objet La fonction est à titre informatif. A partir du haut du coin droit de la fenêtre d'affichage et plus bas, cette fonction affiche les noms des devises concernées. Le texte de la devise est de la même couleur que la ligne indicatrice, relative à cette devise.

  • Les commentaires sont dans le coin inférieur droit de l'indicateur

Paramètres d’entrée

int f_comment(string text)

text - Le texte qui doit être placé dans le coin inférieur droit de l'indicateur. Une sorte de barre d'état du travail de l'indicateur.

Enfin, la conclusion et l'une des fonctions les plus importantes :

  • Initialisation des paires de devises TF concernées

Absence de paramètres d’entrée.

Dans MetaTrader 5, l'historique est stocké sous la forme de données de de TF pour chaque outil. Par conséquent, avant de lancer le programme, tous les graphiques nécessaires (affectés) sont construits, sur la base des mêmes données de minute TF, une fois le terminal ouvert. La construction intervient également lorsque le trafic actuel TF est commuté ou lors d'une tentative d'accès au graphique de la TF via le code de programme MQL5.

Par conséquent:

  • Lors du premier lancement du terminal, un certain temps est nécessaire pour la construction (peut-être même l'arrière-plan, c'est-à-dire que l'utilisateur ne les voit pas) des TF nécessaires des paires de devises utilisées.
  • synchronisez la barre zéro pour toutes les devises concernées, afin d'afficher avec précision l'indicateur. En d'autres termes, s'il y a un nouveau tick entrant sur un graphique, qui ouvre une nouvelle barre (par exemple, la barre des heures), vous devrez attendre le revenu des ticks pour les autres paires de devises, qui, à leur tour , ouvrir une nouvelle barre (nouvelle heure). Ensuite seulement procéder au calcul d'un indicateur pour la nouvelle barre.

La première partie de cette tâche est implémentée à l'aide de la fonction intégrée Bars, qui renvoie le nombre de barres dans l'historique par la période correspondante au symbole. Il suffit d'utiliser la version de cette fonction, qui est illustrée ci-dessous.

int  Bars(
   string          symbol_name,   // symbol name
   ENUM_TIMEFRAMES   timeframe    // period
   );

Dans le, spécialement annoncé pour ce tableau, nous recueillons le nombre de barres disponibles pour toutes les paires de devises concernées. Nous vérifions chaque valeur pour la quantité minimale d’historique nécessaire (la variable "nombre de barres pour le calcul de l'indicateur" dans les paramètres de l'indicateur). Si le nombre de barres disponibles dans l'historique d'un instrument est inférieur à la valeur de cette variable, alors nous considérons que la construction n'a pas abouti et réexaminons le nombre de données disponibles. Une fois qu'il y a plus d'historique disponible, pour toutes les paires de devises, que celles demandé par l'utilisateur - alors nous pouvons affirmer que cette partie de l'initialisation a été effectuée avec succès.

La deuxième partie de la tâche de synchronisation est implémentée en utilisant la fonction CopyTime.

 Dans un tableau spécialement créé à cet effet, nous copions l'ouverture de la barre zéro de chaque instrument concerné. Si tous les éléments de ce tableau sont identiques et ne sont pas égaux à 0, considérons que notre barre zéro est synchronisée, et commençons le calcul. Pour comprendre davantage comment cela est mis en œuvre, consultez le code de l'indicateur ci-joint.

Ceci conclut la description des fonctions supplémentaires et nous passons à l'implémentation de la fonction OnCalculate . Puisqu’ il s'agit d'un indicateur multi-devises, nous aurons besoin de la deuxième version de la requête de cette fonction.

int OnCalculate(const int     rates_total, // size of incoming time series
                const int prev_calculated, // processing of bars on the previous request
                const datetime&    time[], // Time
                const double&      open[], // Open
                const double&      high[], // High
                const double&       low[], // Low
                const double&     close[], // Close
                const long& tick_volume[], // Tick Volume
                const long&      volume[], // Real Volume
                const int&       spread[]  // Spread
   );

Déterminez le nombre de barres nécessaires au calcul :

   int limit=shiftbars;

   if(prev_calculated>0)
     {limit=1;}
   else
     {limit=shiftbars;}

Synchronise les graphiques des paires de devises :

   init_tf();

Ensuite, à l'aide de la fonction CopyClose, nous copions les données Close de toutes les paires de devises nécessaires, dans les tampons d'indicateurs, enregistrés spécialement pour cela. (Pour en savoir davantage sur l'accès aux données d'autres TF de l'outil actuel et/ou d'un autre outil, se trouve dans Aide )

Si, pour une quelconque raison, la fonction n'a pas copié les données et a renvoyé une réponse -1, du coup,nous affichons un message d'erreur de paire de devises dans le commentaire et attendons la réception d'un nouveau tick pour l'instrument actuel.

   if (EUR){copied=CopyClose("EURUSD",PERIOD_CURRENT,0,shiftbars,EURUSD); if (copied==-1){f_comment("Wait...EURUSD");return(0);}}
   if (GBP){copied=CopyClose("GBPUSD",PERIOD_CURRENT,0,shiftbars,GBPUSD); if (copied==-1){f_comment("Wait...GBPUSD");return(0);}}
   if (CHF){copied=CopyClose("USDCHF",PERIOD_CURRENT,0,shiftbars,USDCHF); if (copied==-1){f_comment("Wait...USDCHF");return(0);}}
   if (JPY){copied=CopyClose("USDJPY",PERIOD_CURRENT,0,shiftbars,USDJPY); if (copied==-1){f_comment("Wait...USDJPY");return(0);}}
   if (AUD){copied=CopyClose("AUDUSD",PERIOD_CURRENT,0,shiftbars,AUDUSD); if (copied==-1){f_comment("Wait...AUDUSD");return(0);}}
   if (CAD){copied=CopyClose("USDCAD",PERIOD_CURRENT,0,shiftbars,USDCAD); if (copied==-1){f_comment("Wait...USDCAD");return(0);}}
   if (NZD){copied=CopyClose("NZDUSD",PERIOD_CURRENT,0,shiftbars,NZDUSD); if (copied==-1){f_comment("Wait...NZDUSD");return(0);}}  

Ensuite dans le cycle (de 0 à la limite) nous produisons :

  • Le calcul de l'indice du dollar ;
  • Calcul des indices des autres devises sur la base de Close et de l'indice dollar pour la barre courante ;
for (i=limit-1;i>=0;i--)
   {
      //calculation of USD index
      USDx[i]=1.0;
      if (EUR){USDx[i]+=EURUSD[i];}         
      if (GBP){USDx[i]+=GBPUSD[i];}
      if (CHF){USDx[i]+=1/USDCHF[i];}
      if (JPY){USDx[i]+=1/USDJPY[i];}
      if (CAD){USDx[i]+=1/USDCAD[i];}
      if (AUD){USDx[i]+=AUDUSD[i];}
      if (NZD){USDx[i]+=NZDUSD[i];}
      USDx[i]=1/USDx[i];
      //calculation of other currency values
      if (EUR){EURx[i]=EURUSD[i]*USDx[i];}
      if (GBP){GBPx[i]=GBPUSD[i]*USDx[i];}
      if (CHF){CHFx[i]=USDx[i]/USDCHF[i];}
      if (JPY){JPYx[i]=USDx[i]/USDJPY[i];}
      if (CAD){CADx[i]=USDx[i]/USDCAD[i];}
      if (AUD){AUDx[i]=AUDUSD[i]*USDx[i];}
      if (NZD){NZDx[i]=NZDUSD[i]*USDx[i];}
   }

Les données sont placées dans les tampons indicateurs appropriés. Vérifiez quel type d'indicateur a été sélectionné par l'utilisateur lors de l'initialisation, et sur cette base, faites des calculs pertinents.

S’il y a une envie de regarder le RSI des index a été démontrée, alors exécutez le code ci-dessous :

if (ind_type==Use_RSI_on_indexes)
   {
      if (limit>1){ii=limit - rsi_period - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
            if (USD){USDplot[i]=f_RSI(USDx,rsi_period,i);}
            if (EUR){EURplot[i]=f_RSI(EURx,rsi_period,i);}
            if (GBP){GBPplot[i]=f_RSI(GBPx,rsi_period,i);}
            if (CHF){CHFplot[i]=f_RSI(CHFx,rsi_period,i);}
            if (JPY){JPYplot[i]=f_RSI(JPYx,rsi_period,i);}
            if (CAD){CADplot[i]=f_RSI(CADx,rsi_period,i);}
            if (AUD){AUDplot[i]=f_RSI(AUDx,rsi_period,i);}
            if (NZD){NZDplot[i]=f_RSI(NZDx,rsi_period,i);}                  
         }
   }  

Si nous voulions voir le MACD par les index, alors nous allons ici (mais jusqu'à présent il n'est implémenté que sur la base de SimpleMA, et sera implémenté sur la base d' EMA plus tard):

if (ind_type==Use_MACD_on_indexes)
   {
      if (limit>1){ii=limit - MACD_slow - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
           if (USD){USDplot[i]=f_MACD(USDx,MACD_fast,MACD_slow,i);}
           if (EUR){EURplot[i]=f_MACD(EURx,MACD_fast,MACD_slow,i);}
           if (GBP){GBPplot[i]=f_MACD(GBPx,MACD_fast,MACD_slow,i);}
           if (CHF){CHFplot[i]=f_MACD(CHFx,MACD_fast,MACD_slow,i);}
           if (JPY){JPYplot[i]=f_MACD(JPYx,MACD_fast,MACD_slow,i);}
           if (CAD){CADplot[i]=f_MACD(CADx,MACD_fast,MACD_slow,i);}
           if (AUD){AUDplot[i]=f_MACD(AUDx,MACD_fast,MACD_slow,i);}
           if (NZD){NZDplot[i]=f_MACD(NZDx,MACD_fast,MACD_slow,i);}                  
         }
   } 

Si Stochastis, vous devez d'abord calculer la ligne % K, et puis la lisser à l’aide de la méthode SimpleMA. La ligne finale lissée doit être affichée sur le graphique.

if (ind_type==Use_Stochastic_Main_on_indexes)
   {
      if (limit>1){ii=limit - stoch_period_k - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
           if (USD){USDstoch[i]=f_Stoch(USDx,rsi_period,i);}
           if (EUR){EURstoch[i]=f_stoch(EURx,stoch_period_k,i);}
           if (GBP){GBPstoch[i]=f_stoch(GBPx,stoch_period_k,i);}
           if (CHF){CHFstoch[i]=f_stoch(CHFx,stoch_period_k,i);}
           if (JPY){JPYstoch[i]=f_stoch(JPYx,stoch_period_k,i);}
           if (CAD){CADstoch[i]=f_stoch(CADx,stoch_period_k,i);}
           if (AUD){AUDstoch[i]=f_stoch(AUDx,stoch_period_k,i);}
           if (NZD){NZDstoch[i]=f_stoch(NZDx,stoch_period_k,i);}                  
         }
      if (limit>1){ii=limit - stoch_period_sma - 1;}
      else{ii=limit - 1;}
      for(i=ii;i>=0;i--)
         {
            if (USD){USDplot[i]=SimpleMA(i,stoch_period_sma,USDstoch);}
            if (EUR){EURplot[i]=SimpleMA(i,stoch_period_sma,EURstoch);}
            if (GBP){GBPplot[i]=SimpleMA(i,stoch_period_sma,GBPstoch);}
            if (CHF){CHFplot[i]=SimpleMA(i,stoch_period_sma,CHFstoch);}
            if (JPY){JPYplot[i]=SimpleMA(i,stoch_period_sma,JPYstoch);}
            if (CAD){CADplot[i]=SimpleMA(i,stoch_period_sma,CADstoch);}
            if (AUD){AUDplot[i]=SimpleMA(i,stoch_period_sma,AUDstoch);}
            if (NZD){NZDplot[i]=SimpleMA(i,stoch_period_sma,NZDstoch);}                  
          }                     
   }       

Ceci achève le calcul des indicateurs. Les figures 4 à 6 présentent quelques images des différents types d'indicateurs.

Figure 4. RSI par les indices

Figure 4. RSI par les indices

Figure 5. MACD par les indices de devises

Figure 5. MACD par les indices de devises

Figure 6. Stochastis par les indices de devises

Figure 6. Stochastis par les indices de devises

Conclusion

Lors de l'implémentation de l'indicateur MultiCurrencyIndex, j'ai utilisé un nombre illimité de tampons d'indicateurs dans MQL5, ce qui a considérablement simplifié le code. Cet article est un exemple d'une approche pareille. Pour des données fiables d'un indicateur, j'ai démontré un algorithme de synchronisation de différents instruments par rapport à la barre zéro. J'ai également démontré l'un des algorithmes possibles d'accès aux données d'autres instruments, par rapport au symbole auquel l'indicateur est attaché.

Étant donné que le but de l'article était de démontrer la possibilité de travailler avec une énorme quantité de tampons d'indicateurs ; la fonction ci-dessus de calculer les indicateurs par les tableaux de données des utilisateurs, n'était pas le moyen optimal pour éviter de surcharger le lecteur. Mais c'était suffisant pour effectuer les calculs nécessaires.

Il existe de nombreux avantages et inconvénients de l'analyse de bloc du marché Forex. Les systèmes de trading, axés sur cette approche, sont disponibles gratuitement, et il y a des discussions à ce sujet sur divers forums, y compris sur MQL4.Community. Par conséquent, les principes de trading par cet indicateur ne sont pas pris en compte dans cet article.

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

Fichiers joints |
Un Gestionnaire de Commande  Virtuelle pour suivre les commandes  dans l'environnement MetaTrader 5 axé sur la position Un Gestionnaire de Commande Virtuelle pour suivre les commandes dans l'environnement MetaTrader 5 axé sur la position
Cette bibliothèque de classes peut être ajoutée à un Expert Advisor MetaTrader 5 pour lui permettre d'être écrite avec une approche axée sur les commandes largement comparable à MetaTrader 4, par rapport à l'approche axée sur la position de MetaTrader 5. Il le fait en gardant une trace des commandes virtuelles sur le terminal client MetaTrader 5, tout en maintenant un arrêt de protection du courtier pour chaque position pour la protection contre les catastrophes.
Migration de MQL4 vers MQL5 Migration de MQL4 vers MQL5
Cet article est un guide rapide des fonctions du langage MQL4, il vous aidera à migrer vos programmes de MQL4 vers MQL5. Pour chaque fonction MQL4 (hors fonctions de trading) la description et l'implémentation MQL5 sont présentées, cela vous permet de réduire considérablement le temps de conversion. Pour plus de commodité, les fonctions MQL4 sont réparties en groupes, similaires à MQL4 Reference.
Un exemple de système de trading axé sur un indicateur Heiken-Ashi Un exemple de système de trading axé sur un indicateur Heiken-Ashi
Dans cet article, nous examinons la question de l'utilisation d'un indicateur Heiken-Ashi dans le trading. Sur la base de cet indicateur, un système de trading simple est considéré et un conseiller expert MQL5 est écrit. Les opérations de trading sont implémentées sur les bases de classes de la bibliothèque de classes Standard. Les résultats des tests de la stratégie de trading examinée, sont basés sur l'historique et obtenus à l'aide du testeur de stratégie MetaTrader 5 intégré, sont fournis dans l'article.
MetaTrader 5 Publication des prévisions de trading et des relevés de trading en direct par e-mail sur les blogs, les réseaux sociaux et les sites internet dédiés MetaTrader 5 Publication des prévisions de trading et des relevés de trading en direct par e-mail sur les blogs, les réseaux sociaux et les sites internet dédiés
Cet article vise à présenter des solutions prêtes à l'emploi pour la publication de prévisions à l'aide de MetaTrader 5. Il couvre un éventail d'idées : de l'utilisation de sites Web dédiés pour la publication des relevés MetaTrader à la création de son propre site Web sans pratiquement aucune expérience de programmation Web nécessaire et enfin à l'intégration à un service de micro-blogging de réseau social qui permet à de nombreux lecteurs de rejoindre et de suivre les prévisions. Toutes les solutions présentées ici sont 100% gratuites et peuvent être configurées par toute personne ayant une connaissance de base des services e-mail et ftp. Il n'y a aucun obstacle à utiliser les mêmes techniques pour les services d'hébergement professionnel et de prévision des échanges de trade.