mercredi 7 août 2013

Les boucles for en MQL4: initiation à la programmation d'experts advisors

Enfin la dernière instruction du langage à voir ! Ce post sera plus court, et la vidéo bien plus courte aussi. Nous allons utiliser cette instruction: la boucle for pour modifier l'expert précédemment fait et qui est bien compliqué. La boucle for remplacera la boucle while dans cet expert parce qu'elle est adaptée au parcours de tableaux. Elle sert aussi s'il ny a pas de tableau, et sert surtout si on a besoin d'un compteur ou indice quelconque qui doit évoluer à chaque répétition.

L'instruction for:

L'instruction for est donc une boucle pour répéter un bloc d'instruction, avec un détail particulier: il y a dans l'histoire un indice ou un compteur qui doit évoluer à chaque répétition. Dans notre cas de l'expert précédent c'est le numéro de l'élément du tableau. Cette boucle for est pratique dans ces cas-là parce qu'elle prend en charge le compteur. Nous n'avons pas besoin de le faire évoluer par une instruction spécifique dans la boucle. On indique dans l'instruction for trois choses:

  1. l'initialisation du compteur: on donne sa valeur de départ.
  2. la condition sur ce compteur pour répéter la boucle: elle doit être vraie pour exécuter le bloc d'instructions. Dès qu'elle est fausse, le bloc n'est pas exécuté et le programme suit son court après le bloc de l'instruction for.
  3. la manière de faire évoluer ce compteur: une expression de calcul pour changer la valeur du compteur à chaque fois que le bloc d'instruction de la boucle est fini.

Voici directement un exemple: for(i=0 ; i<10 ; i=i+1) { bloc d'instructions }. Dans cet exemple on veut répéter le bloc d'instruction en commençant avec la variable i qui doit être d'abord égale à 0 et tant que cette variable i est inférieure à 10, et on fait varier i selon le calcul i = i + 1. C'est-à-dire qu'on prend i, on lui ajoute 1 et on remet le résultat dans i. En clair on augmente i de 1 à chaque fois. On peut si on veut, enlever 1 ou même ajouter 2 ou 7.3 ou faire ce qu'on veut pour le changer. Mais attention, il faut écrire quelque chose qui finira par rendre la condition fausse pour pouvoir s'arrêter ! Dans cet exemple, si on met le calcul de changement: i = i - 1, on atteindra jamais le 10 en partant de 0, puisque i ne fera que diminuer. Il vaudra -1, -2, -3 etc . La condition d'infériorité à 10 sera toujours vraie et donc on exécutera la boucle sans jamais s'arrêter.

La boucle for s'utilise donc dès qu'il faut faire une boucle avec une variable qui va évoluer avec les répétitions de la boucle. Dans ce cas, on donne trois règle à l'instruction for: la valeur de départ, la condition pour répéter et comment l'évolution doit se faire, et l'instruction for se charge de tout. Maintenant je voudrais ajouter deux types d'écritures de calculs que nous n'avons pas encore vu et qui sont très pratiques: l'incrémentation condensée avec l'affectation et la post-incrémentation. Ces écritures vont êtres très pratiques pour la boucle for, et pour d'autres cas aussi.

L'opérateur d'incrémentation et l'opérateur de décrémentation:

Vous avez remarqué, nous avons souvent besoin de faire évoluer une variable en l'augmentant de 1 ou plus. Et on fait donc l'opération avec une affectation dans la même variable. Du genre i = i + 1. Il existe pour cela un opérateur dédié: += et l'exemple s'écrit alors i += 1. Cela se traduit littéralement par ajouter 1 et réaffecter dans la même variable. Nous avons la même chose avec la décrémentation: i -= 1. On pourrait augmenter ou diminuer de n'importe quelle quantité: i += 3.

L'opérateur de post-incrémentation ou décrémentation:

Il y a parmi les incrémentations ou décrémentations précédentes un cas qui est très très utilisé: l'incrémentation ou décrémentation de 1. Il y a alors l'opérateur dédié: ++, et on note l'opération sur la variable comme ça: i++ ce qui est très condensé. (Il y a la même en i--) Cette notation est très souvent utilisée pour la troisième règle de la boucle for, à la place de i = i + 1. i++ signifie tout simplement "augmenter i de 1". De même pour i-- qui signifie diminuer i de 1.

Amélioration de l'expert des moyennes du cours par seconde:

Nous allons commencer à modifier l'expert précédemment fait pour rendre le code plus compact et compréhensible. (nous continuerons encore dans les posts suivants) La boucle while va donc être remplacée par une boucle for puisqu'elle contient un compteur qui doit être incrémenté à chaque passage. C'est typiquement ce que gère une boucle for. Du coup l'instruction d'incrémentation de noTick dans la boucle ne sert plus à rien, et il vaut mieux l'enlever car elle va même perturber en incrémentant une fois de trop à chaque passage. On va donc la supprimer. On en profite aussi pour remplacer les incrémentations dans tout le code par les opérateurs qui conviennent. La boucle while sera donc remplacée par:

for(noTick=0 ; noTick<nbTickDansSeconde ; noTick++) {
   sommeCours += ticksDeLaSeconde[noTick];
}
Du coup lors de la déclaration de noTick deux lignes plus haut, nous n'avons plus besoin de la mettre à zéro, car la boucle for s'en charge. Remarquez que j'ai utilisé la post-incrémentation dans la troisième règle de la boucle for et l'opérateur d'incrémentation pour la somme des cours dans la boucle. La dernière instruction de la fonction start(), juste avant le return passe de:

   nbTickDansSeconde = nbTickDansSeconde + 1;
à ceci :

   nbTickDansSeconde++;
Les améliorations ne sont pas très nombreuses pour le moment, mais c'est déjà ça ! Vous allez le pratiquer avec moi en vidéo, ce sera assez rapide.


La prochaine fois nous ferons de plus grosses améliorations avec une dernière notion à travailler pour faire le tour complet de l'initiation à MQL4: les fonctions.

Aucun commentaire:

Enregistrer un commentaire