vendredi 16 août 2013

Factorisation du code de l'indicateur Taux Moyen

Nous reprenons immédiatement l'indicateur réalisé juste avant pour restructurer un peu le code. Restructurer le code par des fonctions pour le rendre réutilisable s'appelle factoriser, comme en mathématiques quand vous factorisez une expression. Cela a le même sens. Nous allons nous focaliser uniquement sur l'initialisation de l'indicateur car il contient de nombreuses lignes qui sont des appels à des fonctions d'initialisation. Il y a deux types de fonctions d'initialisation: celles qui concernent l'indicateur au niveau global et celles qui concernent un index dans l'indicateur. Un index étant un signal à calculer et à tracer. Il peut y en avoir huit maximum par indicateur. Nous n'en utilisons qu'un seul pour l'instant, mais à l'avenir sur cet indicateur on en utilisera trois. (selon ce que je projette de faire pour le moment) Nous allons donc faire deux fonctions, une pour initialiser l'indicateur au niveau global et une autre pour initialiser un index. Et cette dernière pourra être utilisée jusqu'à huit fois dans l'indicateur pour initialiser les huit signaux possibles.

L'initialisation de l'indicateur:

Dans l'état actuel des choses, l'indicateur est initialisé seulement avec deux fonctions: une pour préciser le nombre de décimales à utiliser et l'autre pour préciser le nom court de l'indicateur. Ce nom sera passé en paramètre de la fonction qui ne retourne aucune valeur, donc déclarée en void.

void initIndicateur(string shortName) {
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
   IndicatorShortName(shortName);
}


L'initialisation d'un index:

Un index ou signal, s'initialise avec quatre fonctions pour l'instant. Chacune de ces fonctions prend en premier paramètre le numéro de l'index. On passera donc ce numéro en premier paramètre de notre fonction. Puis nous aurons besoin de passer le tableau qui sert de buffer. Il faudra alors le passer par référence, avec un esperluette devant son nom (&) et bien mettre la paire de crochets pour préciser que c'est un tableau, et le déclarer en tableau de nombres décimaux (double). Ensuite il faut passer le décalage à appliquer sur le signal (un nombre entier), puis l'indice de commencement de traçage (shift). Pour finir il faut le style de traçage qu'on met par défaut à DRAW_LINE. Les noms des variables buffer et shift utilisées dans cette fonction sont les mêmes que les variables globales utilisées dans l'indicateur. Il faut impérativement changer les noms des variables globales pour éviter toute collision de noms. Nous mettrons 'tampon' et 'decalage'.

void initIndex(int noIndex, double &buffer[], int shift, int begin, int style=DRAW_LINE) {
   SetIndexStyle(noIndex,style);
   SetIndexBuffer(noIndex,buffer);
   SetIndexShift(noIndex, shift);
   SetIndexDrawBegin(noIndex, begin);
}


Je vous fais faire tout ça en vidéo, puis vous avez le code complet juste après.



//+------------------------------------------------------------------+
//|                                                    tauxMoyen.mq4 |
//|                  Copyright 2013, argent-facile-avec-robots-forex |
//|               http://argent-facile-avec-robots-forex.blogspot.fr |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, argent-facile-avec-robots-forex"
#property link   "http://argent-facile-avec-robots-forex.blogspot.fr"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Aqua
//--- input parameters
extern int decalage = 0;
//--- buffers
double tampon[];
int ancienCompteBars, nbTicksDansBar;
double sommeCours;

double obtenirCoursActuel() {
   double cours = (Bid + Ask) / 2.0;
   return(cours);
}

void initIndicateur(string shortName) {
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
   IndicatorShortName(shortName);
}

void initIndex(int noIndex, double &buffer[], int shift, int begin, int style=DRAW_LINE) {
   SetIndexStyle(noIndex,style);
   SetIndexBuffer(noIndex,buffer);
   SetIndexShift(noIndex, shift);
   SetIndexDrawBegin(noIndex, begin);
}

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   ancienCompteBars = IndicatorCounted();
   initIndicateur("TM");
   initIndex(0, tampon, decalage, 0);
   sommeCours = 0.0;
   nbTicksDansBar = 0;
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double coursActuel = obtenirCoursActuel();
   double moyenneCours = coursActuel;
   int nbBarsActuel = IndicatorCounted();
   if(nbBarsActuel > ancienCompteBars) {
      if(nbTicksDansBar > 0) { moyenneCours = sommeCours / nbTicksDansBar; }
      tampon[1] = moyenneCours;
      sommeCours = 0.0;
      nbTicksDansBar = 0;
      ancienCompteBars = nbBarsActuel;
   }
   sommeCours += coursActuel;
   nbTicksDansBar++;
   tampon[0] = sommeCours / nbTicksDansBar;
   return(0);
  }
//+------------------------------------------------------------------+


Nous continuerons dans les posts suivants à améliorer et faire évoluer cet indicateur.

Aucun commentaire:

Enregistrer un commentaire