lundi 29 juillet 2013

Le IF et la clause ELSE en MQL4: initiation à la programmation des experts advisors

Suite au post précédent, nous allons retravailler l'expert advisor qui contenait un petit artefact, en vous présentant un nouvel élément du langage: la clause ' else '. Je rappelle que l'instruction ' if ' exécute les instructions qui sont dans le bloc qu'elle précède seulement si la condition dans les parenthèses est vraie. Mais si elle est fausse !! On veut pouvoir exécuter des instructions dans ce cas là aussi !! C'est là qu'intervient la clause ' else ' qui signifie littéralement ' autrement ' ou ' sinon ', c'est équivalent.

if(condition) {
    instruction 1 si condition réalisée;
    instruction 2 si condition réalisée;
    ...
    instruction n si condition réalisée;
} else {
    instruction 1 si condition non réalisée;
    instruction 2 si condition non réalisée;
    ...
    instruction k si condition non réalisée;
}

On a donc un ' if ' suivi par une condition entre parenthèses puis on ouvre une accolade pour y placer le bloc d'instructions qui sera exécuté si la condition est remplie. Puis les instructions à exécuter sous condition et une accolade fermante pour terminer ce bloc et après ce bloc un ' else ' et un nouveau bloc d'instructions entre accolades qui contiennent les instructions à exécuter si la condition n'est pas remplie. Je ne vais pas en dire plus, il n'a y pas grand chose à dire. On va modifier de suite l'expert advisor qui compte les mouvements pour qu'il ne compte plus le premier mouvement car il part d'une valeur arbitraire, ce qui donne un mouvement qui n'est pas réel dans le cours et qui est comptabilisé. Pour cela on va utiliser une variable booléenne qui dira si c'est le premier tick reçu. On fait les opérations de copie et de calcul du nouveau cours, puis si c'est le premier tick on met faux dans cette variable car après ce tick, les autres ne seront pas le premier tick, sinon on comptabilise les mouvements. Je récapitule autrement:

  1. on initialise la variable estPremierTick à vrai en plus des autres variables.
  2. le premier tick arrive.
  3. on fait notre copie du coursActuel arbitraire dans le coursPrecedent
  4. on calcule notre nouveau coursActuel
  5. on teste si c'est le premier tick
    • oui c'est le premier passage
    • on met faux dans la variable estPremierTick car ce ne sera plus valable dès le suivant.
    • traitement fini pour le premier tick
  6. second tick qui arrive
  7. on fait notre copie de coursActuel vers coursPrecedent.
  8. on calcule notre nouveau cours
  9. on teste si c'est le premier tick
    • non, la variable ne vaut plus vrai, elle vaut faux.
    • on passe alors à la clause else
    • on teste si l'un est plus grand que l'autre et inversement et les codes adéquats seront exécutés comme l'expert le fait déjà.
    • le second tick est traité
  10. un nouveau tick arrive, et la variable vaut toujours faux, et ça ne changera pas puisque rien ne la remettra à vrai, donc c'est le bloc else qui sera désormais toujours exécuté.

Je vous détaille bien l'algorithme et la séquence qui va se passer car le plus dur pour débuter en programmation, c'est de voir ces choses-là, ce que le programme va faire étape par étape, et par conséquent on a aussi du mal à imaginer un code pour faire quelque chose. Ça vient avec la pratique, ne vous inquiétez pas. Et même les programmeurs expérimentés ne sortent pas un code parfait au premier jet. Un code se travaille pour mieux maîtriser le problème, c'est un art, et malgré les années d'expérience, on ne sort pas un code parfait du premier coup. (Je ne suis pas en train de dire que ce code est parfait, il y a sûrement mieux à faire. Mais sous cette forme il est adapté aux débutants, pour la compréhension). Je vais vous donner les étapes à suivre pour réaliser cet expert à partir du précédent, puis le code complet pour référence. (Pour apprendre et maîtriser, il faut faire toutes les étapes, détailler, être pointilleux et soigneux, ne pas rechigner à faire toutes les étapes. Tout ça pour dire qu'un copier coller du code complet ne vous fera pas apprendre). Je ne vais pas trop mettre de notions dans ce post, et faire simple car dans le code que vous allez réaliser il y a des blocs imbriqués, et c'est pas évident d'y voir clair au début. (deux ' if ' dans un bloc ' else '). Juste un petit point sur le nommage: j'ai nommé la variable estPremierTick et ça peut vous sembler pas bien élégant. Certes, mais dans le nom d'une variable on doit pouvoir savoir le type de donnée qu'elle contient. Et une valeur vrai ou faux doit répondre à une question par oui ou par non, c'est une question sans mot interrogatif, une question qui commence par "est-ce que". Version anglaise, que je trouve plus élégante: "isFirstTick". Ici avec juste "premierTick", on ne sait pas que c'est une valeur booléenne, on la prendrait facilement pour un nombre décimal qui serait la valeur du premier tick. Le nom "premierTick" est ambigu. C'est pour faire un code "clean". Et ça c'est réellement professionnel !

  1. Dans le navigateur arborescent de gauche, déroulez les experts en cliquant sur la croix.
  2. Faites un clic droit sur l'expert CompteMouvements et Modifier dans le menu contextuel.
  3. Une fois l'éditeur ouvert, agrandissez la fenêtre de l'expert.
  4. Placez le curseur à la fin de la deuxième ligne des déclarations:  double coursActuel, coursPrecedent; et appuyez sur le touche Entrée.
  5. Saisissez  bool estPremierTick;  
  6. Allez dans la première section, dans la fonction init(), placez le curseur à la fin de la ligne où on initialise le nombre de ticks reçus à zéro. Appuyez sur Entrée.
  7. Saisissez  estPremierTick = true
  8. Allez directement dans la dernière section dans la fonction start(), et sélectionnez 7 lignes en commençant par le premier if jusqu'à  nbTicksRecus + 1
  9. Une fois les 7 lignes sélectionnées (surlignées en bleu) appuyez sur la touche TAB (tabulation, à gauche du A) pour ajouter une indentation sur ces sept lignes. C'est un niveau d'imbrication supplémentaire où vont se trouver ces lignes.
  10. Cliquez à la fin de la ligne du calcul de la moyenne entre Bid et Ask, après le point-virgule et appuyez sur la touche Entrée pour faire une nouvelle ligne.
  11. Saisissez
    if(estPremierTick){
       estPremierTick = false;
    } else {
  12. Placez le curseur à la fin de la ligne d'incrémentation du nombre de ticks, après le point-virgule de  nbTicksRecus + 1; et appuyez sur la touche Entrée.
  13. Sur la nouvelle ligne vide placez une accolade fermante pour terminer le bloc du ' else '. Ce bloc contient les sept lignes qu'on a décalé vers la droite.
  14. Cliquez sur le bouton disquette bleue pour sauvegarder.
  15. Cliquez sur le bouton Compile pour recréer le fichier exécutable, car on a amélioré l'expert précédent et donc on recrée un fichier exécutable qui écrase le précédent.
  16. Basculez sous MetaTrader 4, et allez à l'arborescence des experts consultants à gauche.
  17. Glissez et déposer l'expert CompteMouvements sur un graphique.
  18. Attendez un moment et faites un clic droit sur le graphique et dans l'option Experts Consultants cliquez sur Retirer pour l'arrêter.
  19. Allez cliquer sur l'onglet Experts dans la fenêtre du bas pour constater les messages.
  20. Constatez le message qui annonce les comptes des hausses et des baisses.

Vous constatez dans le code qu'on a ajouté une variable booléenne pour savoir si c'est le premier tick. Qu'on l'initialise à true (vrai). Quand arrive un tick, après la copie dans le précédent et le calcul du nouveau, on teste si c'est le premier tick. Oui pour la première fois on met alors la variable à faux, pour que ça ne soit plus vrai pour la suite. Les fois suivantes, la condition du premier tick est fausse, on exécute le code du ' else ' qui est de déterminer s'il y a une hausse et s'il y a une baisse. Voici le code complet:

//+------------------------------------------------------------------+
//|                                             CompteMouvements.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"

int nbHausses, nbBaisses, nbTicksRecus;
double coursActuel, coursPrecedent;
bool estPremierTick;
string debutMessage = "Il y a eu ";
string milieuMessage = " baisses et ";
string finMessage = " hausses sur ";

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   coursActuel = 1.0;
   nbBaisses = 0;
   nbHausses = 0;
   nbTicksRecus = 0;
   estPremierTick = true;
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   Print(debutMessage, nbBaisses, milieuMessage, nbHausses, finMessage, nbTicksRecus);
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   coursPrecedent = coursActuel;
   coursActuel = (Bid + Ask) / 2;
   if(estPremierTick){
      estPremierTick = false;
   } else {
      if(coursActuel > coursPrecedent){
         nbHausses = nbHausses + 1;
      }
      if(coursActuel < coursPrecedent){
         nbBaisses = nbBaisses + 1;
      }
      nbTicksRecus = nbTicksRecus + 1;
   }
   return(0);
  }
//+------------------------------------------------------------------+

Voilà pour l'amélioration de cet expert. Vous allez le pratiquer avec moi en vidéo, je vous montre d'abord et on reconmmence et j'irai plus lentement et détaillerai bien pour que vous le fassiez avec moi. Comme je vous disais, nous reviendrons sur cet algorithme (procédé pour faire quelque chose, ou bien autrement dit séquence d'instructions qui permettent de faire quelque chose ou résoudre un problème). Nous y reviendrons et nous en ferons un indicateur intéressant grâce à ces deux comptages qui sont réalisés ici. Nous en tirerons peut-être une avancée dans l'analyse technique des cours, car à ma connaissance, il n'existe pas d'indicateur tel que celui que j'imagine. Ce sera pour plus tard, car notre priorité est un EA qui travaille pour nous. Je laisse le mystère en suspens... Au prochain post l'instruction ' switch ' qui permet d'exécuter du code en fonction de nombreux cas possibles, et non pas seulement deux comme avec le 'if else '. (J'ai oublié à la fin de la vidéo de faire compiler ! Pensez à compiler après la sauvegarde par le clic sur le bouton disquette ).


Aucun commentaire:

Enregistrer un commentaire