MQL4
MQL4
MQL4
MQL4 (MetaQuotes Language 4) est la dernire version du langage de programmation associ la plateforme MetaTrader 4. Ses prdcesseurs taient MQL en 2001 puis MQL II en 2002 jusqu' 2005. MQL4 est un langage compil et proche du C dans sa structure avec l'ajout de nombreuses fonctions spcifiques au trading. Les principales fonctions prdfinies dans MQL4 pour faciliter le trading automatique sont : Fonctions pour rcuprer les prix courants et passs pour toutes les paires et correspondants aux units de temps prdfinies Fonctions de passage et de gestion des ordres Indicateurs prdfinis dans MT4 et possibilit d'appeler les indicateurs customs Gestion d'objets graphiques pour les indicateurs customs Oprations de rcupration de la date et de l'heure utiles par exemple pour le dclenchement de certaines oprations heure fixe Informations sur le compte permettant en autre de vrifier le numro et l'intitul du compte ainsi que son solde et la marge disponible Il y a 3 types d'applications qui peuvent tre cres avec MQL4 et excutes sur MT4 : Les indicateurs customs : programme ayant pour objectif principal l'affichage graphique d'informations calcules partir d'un algorithme dfini par l'auteur Les Expert Advisors qui permettent le trading automatique Les scripts qui sont des programmes destins n'tre excuts que de faon isol contrairement aux EAs et aux indicateurs qui sont excuts chaque mouvement de la paire sur laquelle ils sont attachs. Pour tous ces programmes le code source sera dans un fichier mql4, qui une fois compil produira un fichier ex4. En plus des 3 types d'applications mentionnes ci-dessus (les Ea et les indicateurs sont celles qui sont le plus frquemment utilises), il existe 2 autres types de fichiers : Les fichiers include (fichier texte avec extension .mqh) qui ont le mme type d'utilisation que dans le cas du langage C, c'est--dire stocker des informations qui sont utilises par de nombreux programmes et qui donc permettent de grer de facon centralis ces informations plutt que d'avoir les mmes informations rpliqus de nombreuses fois. Les librairies qui rassemblent un ensemble de fonctions utilises frquemment. Les librairies peuvent seulement tre appeles par un autre programme et ne peuvent tre excutes seules. Pour crire le code de ces programmes l'diteur de texte MetaEditor 4 est gnralement utilis. Cet diteur de texte est fourni en mme temps que MT4 et ne ncessite donc pas un tlchargement et une installation spare. MetaEeditor propose une aide en ligne qui facilite l'criture des programmes. Structure des EAs et indicateurs En MQL4 il y a 3 fonctions spciales prdfinies :init(), start() et deinit(). Ces noms de fonctions ne peuvent pas tre utilises pour d'autres fonctions. Ces fonctions ont un role particulier dans l'excution du programme car elles sont appeles directement par la plateforme. Fonction init() Cette fonction est excute au dmarrage du programme si elle existe car sa prsence est facultative. Il faut noter que le programme dmarre la premire fois qu'on le lie avec un graphe mais aussi d'autres occasions :
chaque fois que la valeur d'un paramtre est modifie via la popup associe si la connexion a t interrompue et revient si on change l'unit de temps du graphe si on recompile le programme si on change de compte Il est frquent que les Eas n'utilisent pas de fonction init() car souvent la logique est calcule chaque tick sans avoir besoin d'une initialisation gnrale. Nanmoins ce sera dans cette fonction qu'il faudra placer la logique de reprise des trades en cours aprs une interruption de la connexion si votre logique globale le ncessite. Fonction start() La fonction start est appele chaque nouveau tick de la paire laquelle le programme est attach. C'est dans cette fonction, qui est le corps du programme qu'est mise la logique du programme et que sont excutes les actions dpendant de la logique. Si les ticks arrivent plus rapidement que la fonction start prend de temps pour s'excuter alors certains ticks seront ignors. Il n'a donc pas de garantie que tous les ticks soient traits. Par exemple si 3 ticks arrivent spar par 5ms chacun et que le programme mets 8ms pour s'excuter alors seuls les ticks 1 et 3 seront traits. Dans le cas des EAs le fait que la fonction start() soit excute ou non dpend aussi bien sur de l'activation ou non de l'EA au niveau de MT4 et de la popup des paramtres. Dans le cas d'un indicateur la fonction start() est aussi appele dans certains cas spciaux tels que le changement de la paire ou de l'unit de temps sur lequel l'indicateur est attach. Fonction deinit() Cette fonction facultative est appele lorsque le programme se termine et en l'occurrence est rarement utilise. De faon similaire la fonction init(), le programme est considr comme se terminant si : on stoppe MT4 on l'enlve du graphe on change la valeur d'un paramtre via la popup associe on recompile le programme on change de compte Lorsque cette fonction est utilise elle contient en gnral la destruction des objets graphiques crs par le programme.
Metaeditor
MetaEditor est un editeur de texte, fourni par MetaQuotes, ddi la ralisation de programmes en MQL4. Cet diteur est le seul diteur spcifique MQL4 et de nombreuses fonctions intressantes mais a aussi des limitations notamment au niveau du debug. Structure des rpertoires MT4 s'appuie sur une structure de rpertoire assez rigide, et dfini le type des programmes par leur position dans les rpertoires. Par exemple un fichier test.ex4 dans le rpertoire experts sera considr comme un EA mais le mme fichier sous indicators sera considr come un indicateur. La structure complte est affiche dans le navigateur lorsqu'on ouvre MetaEditor.
La Racine correspond au rpertoire experts car tous les programmes dvelopps par le trader seront stocks soit dans ce rpertoire soit dans les rpertoires au dessous. Les EAs tels que MACD Sample sont stocks directement sous experts . Les indicateurs sont stocks sous indicators . Les scripts sont stocks sous scripts Les fichiers include sous include Les dll sous libraries Les fichiers grs sont de 3 types: mq4 qui sont les fichiers contenant le code source. Ce sont ces fichiers qui sont principalement crs en utilisant MetaEditor. ex4 qui sont les fichiers excutables rsultats de la compilation de fichiers mq4. Ces fichiers ne peuvent pas tre dits. Si le programme doit tre modifi il doit l'tre via le code source et recompil. mqh qui sont les fichiers include qui en gnral incluent les prototypes de fonctions importes ou la dclaration de variables ou constantes communes. Ces fichiers ne sont pas indpendants car ils sont utiliss comme partie d'un code pour un fichier mql4. Un fichier ex4 contient donc la compilation du fichier mq4 et aussi ventuellement celle d'un ou plusieurs fichiers mqh associs avec le fichier mql4. Cration d'un programme avec MetaEditor MetaEditor est fourni en tant que composant de MetaTtrader 4 et se trouve sous le rpertoire racine de MT4. Une fois MetaEditor lanc, le guide utilisateur en anglais est disponible en pressant F1. Interface de MetaEditor. MetaEditor affiche par dfaut 3 fentres : la fentre principale qui sert l'dition du code source
le navigateur qui sert la fois naviguer dans la structure des rpertoires (onglet Racine) et dans la rfrence du langage MQL4 (onglet Dictionnaire) la boite outils qui est plus une fentre d'affichage de rsultats. On y trouve par exemple les dtails des fonctions de MQL4 lorsqu'on navigue dans les fonctions via le navigateur (onglet Aide), et les rapports de compilation du code source (onglet Erreurs)
Seule la fentre principale est obligatoire, les autres peuvent tre affiches ou caches soit par les boutons et boite outils. , soit par les raccourcis claviers ( Ctrl+D ) pour le navigateur et ( Ctrl+T ) pour la
Crer un nouveau programme Pour crer un nouveau programme vous pouvez soit choisir Fichier -> Nouveau (Ctrl+N) soit cliquer sur le bouton . L'assistant qui apparait en pop-up vous aide a crer une structure de base pour votre programme.
Ci-dessus les versons franaises et anglaises sont mises cte cte et il est clair que la traduction a parfois aussi des bugs! C'est pour cela que si possible il est souvent prfrable de travailler en version originale. Choisissez le type de programme que vous voulez crer et cliquez sur Next. Ensuite il faut donner le nom du programme, et une srie d'informations optionnelles telles que l'auteur (pour le copyright), un lien vers un site internet et des paramtres externes si ncessaire. Tous ces lments peuvent tre rajouts par la suite manuellement si ncessaire.
Aprs avoir cliqu sur Finish vous obtiendrez un fichier cr dans le rpertoire adquat contenant la structure de base de votre programme avec les informations que vous aurez renseignes. Dans notre exemple avec les valeurs prises ci-dessus, le code obtenu sera le suivant :
Le code fourni est un modle et par exemple les fonctions init() ou deinit() ne seront pas forcment utilises et peuvent tre laisses vides ou mme supprimes du code. Mme si ce code ne contient aucune logique et donc n'excute aucune action il peut tre compil car il est syntaxiquement correct. Compilation du programme Pour compiler votre code source vous pouvez utiliser le bouton Compiler ou le raccourci (F5). La compilation sauve aussi automatiquement la dernire version du code source. S'il n'y a pas d'erreur dans le code vous aurez le message suivant dans la boite outils.
Un fichier test.ex4 correspondant au code compil est ajout dans le rpertoire experts et donc visible dans le navigateur de MT4. S'il y a des erreurs de compilation le fichier test.ex4 ne sera pas cr.
Une fois le programme visible dans le navigateur il peut tre utilis par MT4. MetaEditor permet donc de crer facilement diffrents programmes en MQL4 et son aide en ligne facilite le dveloppement. Nanmoins le plus gros reproche que l'on peut faire MetaEditor est l'impossibilit de debugger un programme facilement. En gnral, dans tous les environnements de dveloppement d'applications bass sur un langage de programmation, l'environnement de dveloppement propose une fonction de debug avec entre autre la possibilit de mettre des points d'arrts dans le code et d'excuter ce dernier pas pas. Malheureusement MetaEditor ne propose rien de tout cela et la rsolution de problmes dans le code est de ce fait un peu plus ardue. La solution est d'utiliser la fonction Print() (ou ventuellement dans certains cas la fonction Comment() qui peut aussi tre utile) pour afficher des informations dans le fichier de log. Il faut cependant prendre en compte que l'excution se faisant chaque tick, si la priode de test est longue le fichier de log peut atteindre des tailles consquentes. Esprons que la fonction de debug sera amliore dans MT5 !
Expert Advisor
Un Expert Advisor est un script automatique utilis par la plateforme de trading (en l'occurrence MT4) pour grer les positions et le passage d'ordres sans intervention manuelle. Le mieux pour se familiariser avec le concept d'Expert Advisor (ou EA en abrg) est d'en tester un. Il existe de trs nombreux EA disponibles sur Internet mais le plus simple est d'utiliser un de ceux livrs par dfaut avec MT4 pour se familiariser avec son utilisation. Par dfaut vous devriez avoir dans votre fentre Navigateur, sous Expert Consultant 2 exemples comme ci-dessous.
Ouvrez un graphe sur une paire quelconque (c'est juste pour le test) et choisissez l'unit de temps dans cette barre situe en haut sous les menus.
Si vous voulez rapidement voir comment cela fonctionne il est judicieux de choisir une unit de temps courte. Ensuite slectionnez un EA dans le navigateur et glissez le avec la souris dans le graphe. Une fentre pop-up apparaitra. Dans le premier onglet (Commun) il est important de slectionner Autoriser le trading en direct comme ci-dessous sinon votre EA ne passera aucun ordre.
Ensuite allez sur le deuxime onglet (Paramtres d'entre) qui contient tous les paramtres modifiables de l'EA.
Modifiez certains paramtres si vous le souhaitez et cliquez sur OK. Vous devez voir apparaitre en haut et droite du graphe un smiley avec le nom de l'EA
Dans ce cas l votre EA fonctionne et commencera passer des ordres lorsque les conditions implmentes dans sa logique seront runies. Si vous avez ce signe
c'est que vous devez autoriser l'utilisation d'Expert Advisors au niveau de la plateforme en cliquant sur la barre Expert Advisors sous les menus pour avoir un signal vert comme celui-ci
Il est important de se rappeler les diffrents niveaux d'activations des EAs. Il y a tout d'abord une activation globale au niveau de la plateforme qui affecte tous les EAs, c'est le bouton Expert Advisors du paragraphe prcdent. Si ce bouton est rouge alors vous aurez une croix aprs le nom de l'EA qui montre que les EAs ne sont pas actifs sur cette plateforme. Il y a ensuite une activation spcifique chaque EA qui est la case cocher Autoriser le trading en direct dans l'onglet Commun lorsqu'on installe un EA. Si le bouton Expert Advisors est vert mais cette case non coche vous aurez l'icone suivante
Une fois l'EA mis en place et activ sur votre graphe la logique de l'EA sera invoque chaque mouvement (tick) sur le graphe en cours. Donc lors de chaque mouvement les conditions de passage et de fermeture d'ordre seront vrifies et les actions correspondantes entreprises si ncessaire. Il est aussi important de savoir que l'EA fonctionne sur votre machine (cot client) et non pas sur le serveur de votre broker. Cela signifie que si vous perdez votre connexion internet ou si vous fermez votre PC l'EA ne sera plus actif. Donc si vous envisagez de faire tourner un EA sans interruption il est important d'avoir un PC et une connexion internet fiable.
Mots-cls rservs Un certain nombre de mots-cls sont rserv par le langage pour dfinir des actions particulires. Ces mots ne peuvent donc pas tre rutiliss comme identifiants. Types de donnes bool color datetime double int string void Scope extern static Oprateurs break case continue default else for if return switch while Autre false true
Commentaires Les commentaires sont ajouts pour rendre le code plus lisible et faciliter la comprhension de la logique implmente. Il existe deux types de commentaires, les commentaires sur une seule ligne ou les commentaires multilignes. Commentaire sur une seule ligne Ce type de commentaire dbute par // et se termine la fin de la ligne comme ci-dessous int MM_Period = 200 ; // Periode de la MM lente Ce type de commentaire peut tre inclus dans un commentaire multi-lignes. Commentaire multi-lignes Ce type de commentaire dbute par /* et se termine par */ . Il peut tre sur une ou plusieurs lignes : int MM_Period = 200 ; /* Periode de la MM lente */ int MM_Period = 50 ; /* Periode de la MM rapide */ Un commentaire multi-lignes ne peut tre inclus dans un autre commentaire multi-lignes.
Note : attention les variables pour les caractres sont dclares avec le type int ! Type chaine de caractres Une chaine de caractres est une succession de caractres encadre par des doubles guillemets telle que bonjour . La longueur maximale d'une chaine de caractres est de 255. Au-del de 255 la chaine sera de toute faon tronque 255. Si vous dsirez insrer un double guillemet dans la chaine de caractre, pour ne pas le confondre avec la fin de la chaine il est ncessaire de mettre le signe \ devant. Le mot cl pour ce type est string . Type couleur Le type couleur (mot-cl color ) est utilis dans MQL4 comme paramtre dans l'affichage d'informations graphiques. Une couleur peut tre reprsente de 3 faons diffrentes. Reprsentation par le nom Cette reprsentation est de loin la plus pratique et la plus intuitive. La valeur de la couleur correspond son nom en anglais, la premire lettre tant majuscule. Par exemple Blue, Green, Red La liste des couleurs pouvant tre reprsentes par leur nom est la suivante :
Reprsentation par un caractre Cette reprsentation permet d'avoir plus de couleurs disponibles mais son utilisation est moins intuitive. Cette reprsentation dbute par le caractre C et ensuite contient les codes rouge, vert, bleu entre guillemets simples et spars par des virgules. Les codes peuvent tre soit en base dcimale soit en base hexadcimale. Par exemple : C'255,255,255' pour le blanc et C'0xFF,0x00,0x00' pour le rouge.
Reprsentation par un entier De faon similaire la reprsentation par caractre cette reprsentation permet aussi d'accder toutes les couleurs disponibles mais est trs peu intuitive. Si on utilise cette reprsentation en base hexadcimale le code correspond 0xBBVVRR, BB tant le code pour le bleu, VV pour le vert et RR pour le rouge. Il est important de noter que l'ordre des couleurs est oppos l'ordre classique RVB. Par exemple pour le rouge pur on aura 0x0000FF. Si on utilise cette reprsentation en base dcimale on a simplement la valeur quivalente la valeur hexadcimale en base dcimale. Dans le cas du rouge mentionn au dessus on aura donc comme valeur 255. Si on dsire utiliser cette reprsentation par entier il vaut mieux utiliser la reprsentation hexadcimale nettement plus lisible. Par exemple dans le cas du blanc on aura en base hexadcimale 0xFFFFFF et en base dcimale 16777215. Type date et heure Le type date et heure (mot-cl datetime) est un type spcifique MQL4 frquemment utilis par exemple pour l'utilisation des sries de donnes ou pour le dclenchement de certaines actions heure fixe. La reprsentation dbute par le caractre D puis la date et l'heure au format US entre guillemet simples. Il n'est pas ncessaire de dfinir tous les champs car ils sont optionnels et on des valeurs par dfaut si ils ne sont pas dfinis. Le plus clair est d'analyser quelques exemples : D'2008.09.13 14 :05 :10' : ici tout est clair car tous les champs sont dfinis : 13 septembre 2008 14 heures 5 minutes et 10 secondes D'2008.09.13 14' : si les minutes et secondes ne sont pas dfinies elles sont considres comme gales 0 donc 14 heure dans ce cas. Cette rgle est aussi valide pour les heures. Si aucune valeur n'est fournie pour les heures minutes secondes alors MQL4 considre que cela correspond minuit. Si la date n'est pas fournie la date prise en compte est la date de compilation du programme. Donc D'13 :24 :05 correspond au jour de la compilation 13 heures 24 minutes et 5 secondes. Le cas extrme D'' correspond au jour de la compilation minuit. La valeur est reprsente en interne par le nombre de secondes coules depuis le 1 er janvier 1970 0 heure (ce type de reprsentation n'est valide que jusqu'au 31 dcembre 2037 !). Cette information est utile car si on veut par exemple vrifier que 2 vnements sont spars par 1 minute on peut vrifier que la diffrence des variables de type datetime est gale 60.
Oprations et Expressions
Une expression est compose d'une ou plusieurs oprations qui sont les lments de base. Les oprations se rangent en plusieurs catgories. Oprations arithmtiques Il y a 7 oprations arithmtiques possibles en MQL4 Oprateur + Description adition des 2 nombres soustraction des deux nombres nombre ngatif * multiplication des 2 nombres Division des deux nombres (attention le rsultat de 2 nombres / 6/8 entier sera un nombre entier -> 6/8 = 0 mais 6.0/8.0 = 0.75) Reste de la division pour des nombres entiers (25%4 = 1, 24%4 % 25 % 4 = 0) ++ a++ Incrmentation = a+1 -a-Dcrmentation = a-1 Ces diffrentes oprations peuvent de faon gnrale tre combines avec ou sans parenthses selon les rgles de prcdences dcrites plus bas, l'exception des oprateurs d'incrmentation et de dcrmentation. Ceux-ci ne peuvent tre combines avec d'autre oprations et l'expression suivante est invalide : x = (y ++)*2 : Il faut crire y++ ; x = y* 2 ; Oprations d'assignement Il y a 11 oprations d'assignement possibles en MQL4 : Oprateur = += -= *= /= %= >>= <<= &= |= ^= Usage x=y; x += y ; x -= y ; x *= y ; x /= y ; x %= y ; x >>= 2 ; x <<= 1 ; x &= y ; x |= y ; x ^= y ; Description assigne la valeur de y x ajoute la valeur de y la valeur de x et l'assigne x soustrait la valeur de y la valeur de x et l'assigne x multiplie la valeur de y la valeur de x et l'assigne x divise la valeur de x par la valeur de y et l'assigne x. Si x et y sont des entiers alors la division est une division entire. assigne le reste de la division entire de x par y x. Dcale x vers la droite de 2 bits Dcale x vers la gauche de 1 bit fait un ET logique bit bit de x et y et l'assigne x fait un OU logique bit bit de x et y et l'assigne x fait un OU EXCLUSIF logique bit bit de x et y et l'assigne x Usage 3+4 32 -1 a*3
Oprations de comparaison Il y a 6 oprateurs de comparaison. Le rsultat de la comparaison est true (vrai) si la condition est vrifie sinon false (faux). Oprateur == != > < >= Usage x == y x != y x>y x<y x >= y Description compare si x et y sont gaux compare si x et y sont diffrents compare si x est suprieur y compare si x est infrieur y compare si x est suprieur ou gal y
<=
x <= y
Oprations logiques Il y a 3 oprateurs logiques. Le rsultat de l'opration est true (vrai) ou false (faux) d'aprs la logique dfinie par l'algbre de Boole. Dans les exemples ci-dessous x et y peuvent tre des oprations ou expressions. Typiquement ce seront des oprations de comparaison. Oprateur Usage Description && x && y ET logique : vrai si les 2 conditions x et y sont vraies OU logique : vrai si au moins une des 2 conditions x ou y est || x || y vraie NON logique : vrai si la condition x est fausse et faux si la ! !x condition x est vraie Oprations sur les bits Ces oprations sont similaires aux oprations logiques mais s'applique non pas l'ensemble d'une opration ou expression mais aux bits de la valeur d'une variable ou constante. Il est important que les variables utilises dans ces oprations soient de type entier car la reprsentation des nombres rels est diffrente. Oprateur Usage Description fait un ET bit bit des 2 valeurs : le rsultat est 1 si les 2 bits & x&y sont 1 et 0 sinon. fait un OU bit bit des 2 valeurs : le rsultat est 1 si au moins un | x|y des 2 bits est 1 et 0 sinon. fait un OU EXCLUSIF bit bit des 2 valeurs : le rsultat est 1 si ^ x ^y un seul des 2 bits est 1 et 0 sinon. ~ ~x fait un NON bit bit des 2 valeurs : inverse tous les bits 0/1 dcale les bits de x de 3 positions vers la droite. Les bits ajouts >> x >> 3 gauche sont des 0. Chaque dcalage quivaut a une division entire par 2. dcale les bits de x de 2 positions vers la gauche. Les bits << x <<2 ajouts droite sont des 0. Chaque dcalage quivaut a une multiplication par 2. Autres oprations Il existe 3 autres oprations qui n'appartiennent pas aux catgories cites au dessus et qui sont souvent plutt considrs comme des lments de syntaxe mme si techniquement ce sont des oprateurs. Oprateur Usage Description x tant un tableau (type array) , l'oprateur [] permet [] x[2] d'atteindre la cellule du tableau dont la valeur est spcifie (2 dans l'exemple) x tant une fonction, l'oprateur () permet d'appeler () x () la fonction et ventuellement de passer des paramtres x tant une fonction, l'oprateur , permet de , x (param1,param2,param3) sparer les paramtres de la fonction et est excut de la droite vers la gauche. Rgles de prcdence Les oprations cites ci-dessus ont des priorits diffrentes. Certaines seront excutes avant d'autres selon leurs priorits relatives si vous n'indiquez pas explicitement dans quel ordre l'expression doit tre value. Pour viter toute confusion il est recommand d'utiliser des parenthses comme dans l'exemple suivant : x + y * 2 est quivalent x + (y * 2) mais la seconde expression est beaucoup plus
lisible. Cela est encore plus vrai dans le cas de combinaison entre des oprations de diffrents types tels qu'arithmtiques et logiques. Ci-dessous sont listes les oprations par groupe de priorit dcroissante (les plus prioritaires en premier). Les oprations appartenant au mme groupe sont de priorit quivalente et seront donc valus de la gauche vers la droite. Groupe 1 : () [] Groupe 2 : ! ~ Groupe 3 : * / % Groupe 4 : + Groupe 5 : << >> Groupe 6 : < > >= <= Groupe 7 : == != Groupe 8 : & Groupe 9 : ^ Groupe 10 : && Groupe 11 : || Groupe 12 : = += -= *= /= %= >>= <<= &= |= ^= Groupe 13 : ,
x = 0 ; // on assigne 0 x } else { z = x - y ; // on assigne x-y z x = 1 ; // on assigne 1 x } } else x = 2 ; // si x n'est pas gal 0 on lui assigne la valeur 2 Lorsqu'il y a des instructions imbriques, pour s'assurer de n'avoir pas oubli d'accolades et de ne pas avoir associ un else au mauvais if, il est conseiller d'indenter le code pour pouvoir reprer les possibles erreurs plus facilement grce l'alignement des instructions. L'instruction switch Dans le cas d'une dcision multi-valeur (par exemple excuter un code diffrent pour chaque valeur entre 1 et 10, l'oprateur switch offre une alternative plus lgante et pratique que l'empilement des conditions if else. L'oprateur switch permet d'aiguiller vers diffrents codes selon la valeur de la condition. Chaque cas est dlimit au dbut par case et se termine par un break. Les cas non spcifis sont regroups dans le cas default . L'ensemble des cas est plac entre accolades. La syntaxe gnrale est la suivante : switch(x) { case 1: Print("x=1"); // si x est gal 1 alors on affiche x=1 break; case 2: Print("x=2"); // si x est gal 2 alors on affiche x=2 break; case 3: case 4: case 5: Print("x=3 ou 4 ou 5"); // si x est gal 3 ou 4 ou 5 alors on affiche x=3 ou 4 ou 5 break; default: Print("autres cas"); // si x est diffrent de 1,2,3,4,5 alors on affiche autres cas break; } La valeur associe chaque cas doit tre soit un entier ou un caractre ou une expression constante telle que 1+1 mais ne doit pas contenir de terme variable : case x+y : est incorrect.
while (x > y) // tant que x est suprieur y { x++; // on incrmente x de 1 y = y+2; // on incrmente y de 2 } Cette boucle s'excutera le nombre de fois ncessaires pour y devienne suprieur ou gal x. Il est important de vrifier attentivement la condition d'une boucle while car si la condition de test peut tre tout le temps vraie alors le programme bouclera infiniment (ce qui arrivera par exemple si on incrmente y seulement de 1 au lieu de 2). Un exemple pratique dans lequel une boucle while est utilise est l'attente d'un vnement : on vrifie l'intrieur de la boucle si l'vnement est arriv et on boucle tant que celui-ci n'est pas arriv. Les interruptions de boucles Les boucles for et les boucles while peuvent toutes les 2 tre interrompues en cours d'excution, soit en passant le tour actuel, soit en sortant totalement de la boucle. L'instruction break ; L'instruction break permet de stopper l'excution d'une boucle for ou while Voici un exemple pour une boucle for for(i=0; i<10; i++) { Print(i); if (i == 5) break; } Dans cet exemple l'excution de la boucle affichera seulement les valeurs de 0 5 car lorsque la variable i est gale 5 la boucle est interrompue. L'instruction continue ; L'instruction continue permet de sauter au dbut du tour suivant dans le cas de l'excution d'une boucle for ou while Voici un exemple pour une boucle while i=0; while(i<10) { if (i == 5) continue; Print(i); } Dans cet exemple l'excution de la boucle affichera seulement les valeurs de 0 4 puis de 6 9 car lorsque la variable i est gale 5 l'instruction Print n'est pas excute
double valeur_absolue(double x) { if (x>0) return(x) ; else return(-x) ; } La valeur retourne peut soit tre une constante, une variable ou une expression.. Les fonctions particulires MQL4 3 fonctions sont prdfinies en MQL4 : int init(); int deinit(); int start(); La fonction init(); La fonction init() est appele lorsqu'un indicateur ou un EA est lanc pour la premire fois ou relanc aprs par exemple une modification des paramtres de ce dernier. Cette fonction permet de faire les initialisations ncessaires avant le code qui sera excut chaque tick dans la fonction start(). Cette fonction retourne un entier : 0 si il n'y a pas de problme et une valeur diffrente (code d'erreur) sinon. La fonction deinit(); La fonction deinit() est appele lorsqu'un indicateur ou un EA est arrt. Cette fonction permet de faire les de-initialisations ncessaires (par exemple destruction d'objets graphiques cres dans le code) avant de terminer l'excution. Cette fonction retourne un entier : 0 si il n'y a pas de problme et une valeur diffrente (code d'erreur) sinon. La fonction start(); La fonction start() est appele chaque nouveau tick du graphe sur lequel l'indicateur ou l'EA est attach. C'est dans cette fonction (et les fonctions appeles) qu'est code toute la logique de l'indicateur ou de l'EA. Cette fonction retourne un entier : 0 si il n'y a pas de problme et une valeur diffrente (code d'erreur) sinon. Des exemples pratiques d'utilisation de ces fonctions seront fournis une fois que l'ensemble des lments de base du langage MQL4 auront t prsents.
Variable globale Une variable globale est une variable dclare l'extrieur de toute fonction (en gnral au dbut du programme). Ainsi cette variable n'est pas spcifique une fonction et peut tre utilise par toutes les fonctions. Ceci peut s'avrer utile pour partager des informations entre fonctions mais surtout pour conserver des valeurs entre diffrent appels de la mme fonction. Par exemple dans le cas d'un EA la fonction start() est appele chaque tick et pour de nombreuses stratgies il est important de pouvoir garder des informations sur ce qu'il s'est pass lors des ticks prcdents. Les variables globales sont souvent utilises dans ce cas l. Variable globale extern Le mot cl extern permet de dclare une variable globale en tant que paramtre accessible l'utilisateur par le biais de l'interface. Par exemple si vous dclarez dans un EA : extern string Symbol1 = EURCHF; Ce paramtre apparaitra dans l'onglet des paramtres d'entres de l'EA et sera donc modifiable par l'utilisateur sans ncessiter de recompilation.
Directive #property La directive #property est utilise pour dfinir certaines proprits de votre programme qui seront stockes au niveau de l'excutable. Par exemple : #property link http://mon_site_forex.com #property copyright mon nom La liste des proprits disponibles est la suivante : Constante copyright indicator_buffers indicator_colorN indicator_levelN indicator_chart_window indicator_separate_window indicator_minimum indicator_maximum link show_confirm show_inputs stacksize Type string int color double void void double double string void void int Description le copyright correspondant au code nombre de buffers ncessaires au calcul de l'indicateur (8 maximum) la couleur associe au buffer N (N de 1 8) niveau associ au buffer N pour le cas de l'affichage dans une fentre spare (N de 1 8) affiche l'indicateur sur le mme graphe que le prix affiche l'indicateur dans une fentre spare en dessus du graphe du prix valeur minimum de l'indicateur valeur maximum de l'indicateur un lien vers le site de votre socit ou votre site personnel par exemple affiche une popup de confirmation avant l'excution d'un script affiche la popup des paramtres avant l'excution d'un script taille de la pile
Ceci n'est pas obligatoire mais est une bonne pratique. Dfinition des paramtres d'entre Les paramtres d'entres sont dfinis tout de suite aprs l'entte en tant que variables globales. extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26; Chaque paramtre une valeur par dfaut. Celle-ci peut tre modifie par l'utilisateur et dans ce cas l'EA utilisera la valeur dfinie par l'utilisateur. Dfinition des variables locales de la fonction start() La fonction start() est la seule fonction de cet EA. Au tout dbut de celleci sont dfinies les variables locales cette fonction. int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; Ces variables ne sont pas initialises car elles sont initialises plus tard dans le code. Contrles effectus avant l'excution de la logique Avant d'excuter la logique de l'EA il est souhaitable de vrifier que les conditions ncessaires cette excution sont remplies. Dans cet EA 2 contrles sont effectus :
comme cet EA utilise plusieurs indicateurs calculant leurs valeurs sur plusieurs barres dans le pass il faut s'assurer que le nombre de barres dans le pass est suffisant. if(Bars<100) { Print("bars less than 100"); return(0); } Bars est prdfini dans le langage MQL4. On teste donc juste si le nombre de barre est suffisant, sinon la logique n'est pas excute. Il est aussi parfois utile de contrler les valeurs d'entre des paramtres pour s'assurer que l'utilisateur a entr une valeur valide. Nous avons le cas ici avec le TakeProfit mais ceci peut tre fait avec n'importe quel paramtre. if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } Calcul des valeurs des indicateurs La premire tape de la logique est d'acqurir les valeurs des indicateurs. MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); Tous les indicateurs utiliss ici (MACD et moyenne mobile) sont des indicateurs proposs par dfaut dans MQL4 et l'appel de la fonction ainsi que les paramtres ncessaires sont dcrits dans l'aide en ligne de MetaEditor. Si des indicateurs non fournis en standard taient utiliss il faudrait utiliser la fonction iCustom() pour les appeler. Vrifications des conditions pour l'ouverture d'un ordre Cet EA n'ouvre qu'un ordre la fois, donc la premire chose a faire avant d'ouvrir un ordre est de vrifier qu'il n'y pas d'ordre dj ouvert. Ceci est ralis par les 2 lignes suivantes : total=OrdersTotal(); if(total<1) OrdersTotal() est une fonction par dfaut fournie par MQL4 permettant de connaitre le nombre total d'ordres ouverts sur la plateforme. Ensuite avant d'essayer d'ouvrir un ordre le programme vrifie qu'il y a assez d'argent sur le compte pour ouvrir la taille de l'ordre demand. if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); }
Puis viennent la vrification des conditions d'ouverture des ordres et l'ouverture des ordres. Dans le cas d'un Buy : if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0, Ask+TakeProfit*Point, "macd sample",16384,0,Green); // ouvre l'ordre if(ticket>0) // vrifie l'ouverture de l'ordre { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); // order bien ouvert } else Print("Error opening BUY order : ",GetLastError()); // erreur return(0); } Dans le cas d'un Sell : if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); // ouvre l'ordre if(ticket>0) // vrifie l'ouverture de l'ordre { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); // order bien ouvert } else Print("Error opening SELL order : ",GetLastError()); // erreur return(0); } Le code ci-dessus non seulement ouvre un ordre si les conditions requises sont remplies mais aussi vrifie ensuite que l'ordre a bien t ouvert. Gestion des ordres ouverts Une fois qu'un ordre a t ouvert il faut le grer jusqu' sa fermeture. Dans le cas prsent, l'EA gre un trailing stop et la fermeture des ordres. Pour cela l'EA boucle sur tous les ordres ouverts for(cnt=0;cnt<total;cnt++) Puis vrifie que ces ordres sont soit des Buy ou des Sell (et non pas des ordres limit ou stop) et aussi que ces ordres sont sur la paires sur laquelle l'EA est appliqu OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol Ensuite dans le cas d'un Buy il vrifie si la condition de fermeture de l'ordre est remplie et dans ce cas ferme l'ordre
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // ferme position return(0); } Si l'ordre n'est pas ferm alors le calcul du trailing stop est effectu if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(), 0,Green); return(0); } } } Ici on peut noter qu'au lieu d'avoir 3 conditions if imbriques il aurait pu tre plus simple d'avoir un seul if avec un et logique && entre les 3 conditions. Un code similaire est crit pour la partie Sell pour effectuer les mmes oprations. Conclusion Cet Expert Advisor est relativement simple mais il contient la structure de base des lments devant tre pris en compte dans un EA. Certaines parties de cet EA peuvent tre amliores pour prendre en compte d'autres lments tels que la gestion de diffrentes paires ou l'excution de plusieurs EA sur la mme paire.
Directives de prcompilation Nous retrouvons tout d'abord les directives relatives la proprit du code, identiques celles de l'entte : #property copyright "Copyright 2004, MetaQuotes Software Corp." #property link http://www.metaquotes.net/ Puis les directives concernant les proprits de l'indicateur : #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Silver #property indicator_color2 Red #property indicator_width1 2 Ces proprits indiquent : que l'indicateur sera affich dans une fentre spare (donc pas directement sur le graphe des prix), qu'il y aura 2 types de sries valeurs diffrentes afficher que la couleur associ la premire srie de valeurs sera argent et rouge pour la deuxime srie que l'paisseur du trait pour la premire srie sera 2 au lieu de la valeur par dfaut 1 Dfinition des paramtres d'entre Les paramtres d'entres sont dfinis tout de suite aprs les directives de prcompilation en tant que variables globales. extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; Chaque paramtre une valeur par dfaut. Celle-ci peut tre modifie par l'utilisateur et dans ce cas l'indicateur utilisera la valeur dfinie par l'utilisateur. Dfinition des variables globales double MacdBuffer[]; double SignalBuffer[]; Nous avons ici les 2 tableaux qui contiendront les 2 sries de valeurs.
Fonction init() : initialisation de l'indicateur La fonction init() contient les lments d'initialisation de l'indicateur qui n'on pas t dj dfinis au niveau des directives de prcompilation. SetIndexStyle(0,DRAW_HISTOGRAM); La premire srie de donne sera reprsente sous la forme d'un histogramme SetIndexStyle(1,DRAW_LINE); La deuxime srie de donne sera reprsente sous la forme d'une ligne SetIndexDrawBegin(1,SignalSMA); La deuxime srie de donne sera affiche seulement aprs l'indice dfini par SignalSMA IndicatorDigits(Digits+1); La prcision d'affichage des donnes aura le mme nombre de digits que le prix plus 1. SetIndexBuffer(0,MacdBuffer); MacdBuffer contiendra la premire srie de donnes SetIndexBuffer(1,SignalBuffer); SignalBuffer contiendra la deuxime srie de donnes IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")"); Nom et paramtres de l'indicateur qui seront affichs en haut et gauche de la fentre de l'indicateur SetIndexLabel(0,"MACD"); La premire srie aura un label MACD l'affichage SetIndexLabel(1,"Signal"); La deuxime srie aura un label Signal l'affichage Fonction start() : logique de l'indicateur Dans le cas d'un indicateur il faut non seulement calculer les valeurs afficher pour la barre courante mais aussi pour toutes les barres passes si leur valeur n'a pas t calcule auparavant car au dmarrage de la plateforme il existe de nombreuses barres dans le pass et en gnral l'utilisateur veut aussi connaitre les valeurs de l'indicateur pour ces barres dans le pass. Nanmoins une fois que le calcul a t fait on ne veut pas recalculer toutes les barres chaque tick. Pour cela il faut appliquer un certain procd sur la gestion des barres passes et ensuite calculer l'indicateur sur les barres qui en ont besoin. int counted_bars=IndicatorCounted(); Ceci fourni le nombre de barres dj traites par cet indicateur et qu'il ne faut donc pas retraiter if(counted_bars>0) counted_bars--; Si des barres on dj t traites on va recalculer pour la dernire barre limit=Bars-counted_bars; Total des barres non encore traites for(int i=0; i<limit; i++) MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i); On calcule la valeur de l'indicateur pour toutes les barres non traites de la premire srie (la barre la plus rcente a le numro 0)
for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i); On calcule la valeur de l'indicateur pour toutes les barres non traites de la deuxime srie Conclusion Cet indicateur est trs simple dans le calcul de l'indicateur lui-mme. Il contient cependant plusieurs lments important qu'il faut maitriser pour coder un indicateur, notamment l'initialisation des proprits graphiques de l'indicateur et la logique de slection des barres traiter.
Fermetures ordres
Certaines stratgies ncessitent de fermer lensembles des ordres ouverts ou en attente simultanment, par exemple le vendredi soir avant la fermeture du week-end. Le code pour raliser cette fonction est assez simple mais contient nanmoins un point important considrer pour que le code soit excut correctement. Le point dlicat est lordre dans lequel la fermeture des ordres est excute car ce point nest
pas anodin. Si par exemple on dfini une boucle sur lensemble des ordres de la faon suivante :
for(int i=0;i<OrdersTotal();i++) et que lindice i est utilis pour slectionner les ordres par leur position alors il est possible que tous les ordres ne soient pas ferms correctement. En effet il est possible davoir la configuration suivante : si on ferme dabord lordre en position 0, alors lordre en position 1 deviendra lordre en position 0 mais la boucle passera ensuite la position 1 et ne fermera pas lordre en position 0. Ainsi il se peut que seulement la moiti des ordres soit ferme. Pour viter ceci il faut commencer la fermeture des ordres par la dernire position for(int i= OrdersTotal()-1;i>=0;i--) Fermeture des ordres Le code pour la fermeture de tous les ordres est le suivant : for(int i= OrdersTotal()-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); int type = OrderType(); bool result = false; switch(type) { //Fermeture des positions dachat case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; // Fermeture des positions de vente case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; //Fermeture des ordres en attente case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } if(result == false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } } return(0); }
for (int i = OrdersTotal()-1; i >= 0; i --) // on parcourt tous les ordres { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol()) { if (OrderType() == OP_BUY) // trailing stop pour un ordre dachat { ts = Bid-(Point*trailing_stop); // calcul trailing stop if (OrderStopLoss()<ts) // test si nouveau plus haut OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White); } if (OrderType() == OP_SELL) // trailing stop pour un ordre de vente { ts = Ask+(Point*trailing_stop); // calcul trailing stop if (OrderStopLoss()>ts) // test si nouveau plus bas OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White); } } }
autres donnes au moins fournissent des informations plus importantes pour le fonctionnement de la stratgie en rel : La chute maximale Le facteur de profit (profit brut / perte brute) La chute maximale est une information critique car en gnral un trader ne peut pas tolrer une chute suprieure un certain pourcentage du compte sans remettre en cause totalement la stratgie. Selon le trader cela pourra tre 10, 20, 30%... Mais c'est principalement ce paramtre qui dfinira le levier appliquer et la taille des lots pour les ordres. C'est pour cela que le profit seul ne fourni pas d'information suffisante et qu'il vaut mieux comparer le profit pour une valeur de la chute maximale donne. Le facteur de profit est un ratio et donc est plus intressant que des valeurs absolues. Il est clair que plus ce ratio est haut plus la stratgie est performante. Un haut facteur de profit montre que la stratgie est capable de dterminer efficacement les trades ayant un bon potentiel. Risques inhrents au backtest Ce n'est pas parce qu'une stratgie a fonctionn dans le pass qu'elle continuera de fonctionner dans le futur. Souvent de bons rsultats peuvent tre le fait de l'utilisation d'une quantit de donnes insuffisante ou tout simplement de la chance. Il est donc important de tester sur des priodes diffrentes et dans diffrentes configuration de march. La sur-optimisation de la stratgie par rapport aux donnes est aussi un des facteurs les plus importants de la cration de backtests non ralistes. Avec les ordinateurs de plus en plus puissants, il devient trs facile de tester la stratgie avec un grand nombre de combinaisons de paramtres et de slectionner la combinaison la plus performante. Cette approche a le dfaut de se focaliser sur l'optimisation du pass ce qui en gnral donne des rsultats dcevants pour le futur. Il est important de slectionner un ensemble de paramtres robustes et pour se faire de tester la stratgie sur diffrentes priodes en vrifiant que le comportement sparment sur chaque priode est similaire. Le codage de la stratgie est aussi une source d'erreurs et donc de backtests pouvant montrer des rsultats faramineux. C'est souvent un souci que l'on trouve avec MetaTrader pour des EAs ayant 2 caractristiques : stratgie de scalp et codage bas sur le tick en cours. Comme mentionn plus haut, le tick en cours est seulement une valeur estime sauf pour les open et close de chaque minute (si vous avez les donnes historiques correspondantes bien sur). L'influence de cette estimation est d'autant plus forte que la stratgie se base sur des mouvements de faible amplitude. Si on prend comme exemple un cas extrme et en faisant abstraction du spread pour simplifier : La bougie 1 minute a les valeurs suivantes open 1.0000, close 1.0001, high 1.0003, low 0,9998. Vous passer un ordre achat l'ouverture de la bougie 1.0000 avec un stop loss et un take profit de 1 pip. Il est impossible de savoir quelle valeur a t vraiment atteinte la premire. L'outil de backtest estime le possible mouvement l'intrieur de la bougie mais il n'est pas du tout garanti que cela se soit pass ainsi dans la ralit. Les stratgies se basant sur des mouvements trs faibles du march sont beaucoup plus difficiles backtester car elles sont beaucoup plus influences par l'ordre d'arriv des ticks ainsi que par la valeur du spread. Pour ce type de stratgies l'utilisation de donnes au niveau tick et d'un historique du spread sont ncessaires. Si le rsultat du backtest est trop beau pour y croire, c'est probablement d un des problmes mentionns ci-dessus. Conclusion Le backtest est un des aspects les plus importants du dveloppement d'une stratgie de trading. Utilis de faon approprie il peut aider les traders amliorer leurs stratgies et aussi liminer rapidement des stratgies n'offrant pas de bonnes perspectives. Il faut cependant viter les cueils de la suroptimisation et des tests sur des priodes non reprsentatives et traiter les rsultats des backtests comme aide indicative et non pas comme une vrit absolue.
Note : pour que votre indicateur personnalis soit vu par MT4 il faut que l'excutable (.ex4) soit stock dans le rpertoire experts/indicators. Note 2 : un redmarrage de la plateforme MT4 compile automatiquement les indicateurs non compils (ayant seulement le fichier .mq4) prsents dans le rpertoire experts/indicators. Slection de l'indicateur par la fentre Navigateur Les indicateurs sont aussi disponibles dans la fentre Navigateur et sont rangs dans 2 rpertoires. Le rpertoire Indicateurs pour tous les indicateurs par dfaut de MetaTrader 4 (ici pas de catgorie Trend, Oscillateur) Le rpertoire Indicateurs programms contenant tous les indicateurs autres que les indicateurs par dfaut de MT4. Pour insrer un indicateur sur un graphique il suffit de le slectionner et de le glisser sur le graphique.
Paramtres de l'indicateur Lorsque vous insrez un indicateur, une pop-up contenant plusieurs onglets apparait. Le nombre d'onglets diffre selon l'indicateur et bien sur les paramtres diffrent selon l'indicateur. Exemple pour un indicateur standard (RSI) Dans ce cas la pop-up a 3 onglets. Le premier ( Paramtres ) contient les paramtres que vous pouvez modifier pour cet indicateur
Certains indicateurs standards ont aussi un onglet de plus Couleur se situant en deuxime position et qui sert dfinir la couleur pour l'affichage de l'indicateur. Dans le cas du RSI tout ceci est contenu dans l'onglet Paramtres . Si l'indicateur plus de paramtres, les paramtres et les couleurs sont dans 2 onglets spars mais la logique est la mme. Le second onglet ( Niveaux ) contient la liste des niveaux fixes que vous verrez. Ceci est surtout utilis pour les indicateurs affichs sparment du graphe et pour lesquels on veut avoir des niveaux de rfrence. Cet onglet permet d'ajouter ou supprimer des niveaux et de modifier la couleur et le style de marquage de ces niveaux mais il n'y a qu'une seule couleur et qu'un seul style pour tous les niveaux.
Tous les cadres signifie qu'il peut tre affich sur n'importe quelle unit de temps. Si l'indicateur est spcifique une unit de temps on peut le spcifier ici et empcher qu'il soit affich pour d'autres units de temps. En gnral Tous les cadres est la meilleure option. La case Montrer dans une fentre Donnes , si elle est coche, signifie que l'indicateur est affich sparment du graphe du prix. Si elle n'est pas coche l'indicateur sera affich sur le graphe du prix. Ce choix est gnralement vident selon le type d'indicateur. Si l'indicateur a des valeurs dont l'chelle est similaire celle du prix (comme les moyennes mobiles, les bandes de Bolinger) on prfre en gnral avoir cet indicateur sur le mme graphe que le prix. Si l'chelle de l'indicateur est totalement diffrente de celle du prix (exemple du RSI avec des valeurs entre 0 et 100) alors il est ncessaire de l'afficher sparment du prix. Une fois que tous les onglets contiennent les valeurs correctes il suffit de cliquer sur OK pour voir l'indicateur apparaitre. Exemple pour un indicateur programm (Bears) Dans ce cas la pop-up a 5 onglets. De faon gnrale les indicateurs personnaliss on un onglet de plus que les indicateurs standards. L'onglet en plus est l'onglet Commun . Autoriser importation DLL est une case cocher pour autoriser ou non l'appel de dll dans l'indicateur. Autoriser importation d'experts extrieurs est une case cocher pour autoriser l'utilisation de cet indicateur par des EAs. Minimum fix et Maximum fix sont des seuils que l'on peut entrer pour fixer l'chelle maximum pour l'affichage de l'indicateur.
Les autres onglets sont similaires aux onglets dcrits ci-dessus pour un indicateur standard.
Cliquer sur Autoriser qui active les autres champs et remplir ces champs de la faon suivante : Account : numro de compte pour lequel vous voulez publier des rsultats Rafraichir toutes les ... minutes : priodicit avec laquelle le rapport est envoy FTP serveur : votre serveur web qui autorise l'accs via FTP, par exemple www.votre_site.com FTP chemin : chemin indiquant le rpertoire dans lequel le rapport des rsultats sera plac, par exemple /public_html/statements FTP login : login pour se connecter au serveur FTP FTP Mot de passe : mot de passe pour se connecter au serveur FTP Mode Passif : la principale diffrence entre le mode passif et le mode actif et que dans le mode passif c'est le client (MT4) qui demande la connexion au serveur qui l'autorise ou non, et dans le mode actif c'est le serveur qui est l'origine de la connexion et le client qui l'accepte. Donc en gnral, pour le comportement standard ou c'est MT4 qui initie la connexion vous devrez cocher cette case. Le bouton Tester permet de tester cette fonction avec l'envoi du rapport courant. Si le test est russi vous pouvez cliquer sur OK et les envois se feront de faon priodique. Si le test choue il faut vrifier et modifier les paramtres avant de faire OK. Une fois la page envoye dans le rpertoire indiqu, il vous suffit d'afficher ce rapport sur votre site web. Comment publier le rapport dtaill ? Par dfaut MetaTrader 4 publie le rapport simple qui ne contient pas le dtail de toutes les transactions mais seulement le rsum. Pour publier le rapport dtaill il faut tromper MT4 en lui faisant croire que le rapport dtaill est en fait le rapport simple. Il faut pour cela renommer les modles de rapport dans MT4. Aller dans le rpertoire templates sous la racine de votre installation MT4. Vous y trouverez les diffrents modles de rapports au format html. Il faut renommer les modles de la faon suivante :
statement.htm devient statement_original.htm (ou tout autre nouveau nom) Faire une copie de StatementDetailed.htm et la renommer statement.htm Ainsi le statement.htm qui est utilis pour la publication correspond maintenant au rapport dtaill. Il faut noter qu'il n'est possible de publier qu'un seul type de rapport la fois. On ne peut pas publier la fois le rapport dtaill et le rapport simple.
La logique est donc la suivante. Si la barre est plus haute, ExtBuffer1 prend la valeur calcule, et ExtBuffer2 est mis 0 et le contraire si la barre est plus basse. Donc ExtBuffer1 gre les barres vertes et ExtBuffer2 les barres rouges. Maintenant nous allons mettre l'alerte. Pour la partie visuelle nous utiliserons la fonction standard de MQL4 Alert() et pour la partie sonore la fonction PlaySound(). Au niveau logique nous ne mettrons pas la partie alerte dans la boucle ci-dessus car cette boucle traite aussi toute les donnes passes et avoir toute une srie d'alertes sur les donnes passes serait plutt ennuyeux. Nous placerons donc notre code aprs la boucle. Le code sera le suivant:
La fonction PlaySound() utilise les fichiers sous votre rpertoire sounds . Il y a par dfaut plusieurs fichiers que vous pouvez utiliser pour les alertes sonores. Vous pouvez bien sur si vous le dsirez ajouter vos propre sons sous forme d'un fichier .wav et les appeler par la fonction PlaySound() ; Nous voulons aussi que l'alerte ne soit affiche qu'une fois par barre et non chaque tick comme avec le code prcdent si on le laisse tel quel. Pour cela nous allons vrifier si nous avons chang de barre ou non avec l'aide d'une variable globale au programme qui gardera sa valeur entre les diffrentes excutions de la fonction start(). En haut du programme nous dclarerons donc :
Ainsi nous aurons une alerte seulement une fois par barre, aprs que la barre soit termine.
Vous aurez ce moment une autre pop-up d'information vous disant que les donnes historiques de MetaQuotes peuvent tre diffrentes des donnes historiques de votre broker et donc que ces donnes ne peuvent tre utilises pour rgler des diffrents avec votre broker. Cliquez sur Ok. Le tlchargement commence et peut prendre un peu de temps. Une fois le tlchargement termin vous pouvez ouvrir la paire, choisir une unit de temps et voir les donnes.
On peut voir en haut de la fentre Base : 65000 / 3003184. Ceci veut dire que toutes les donnes disponibles ne sont pas utilises mais seulement 65000. Pour remdier ce problme il faut augmenter le nombre de donnes que MetaTrader peut accepter. Pour cela allez dans Outil -> Options, onglet Graphiques.
Changez les valeurs de Maxi bars dans (il manque la traduction pour historique et graphique) une valeur max du type 999 999 999 999 et cliquez sur Ok. Redmarrez la plateforme et maintenant toutes les donnes sont prises en compte. Tlchargement de donnes d'un broker (exemple avec Alpari) Le tlchargement depuis le History Center n'a pas toujours t disponible et avant que celui-ci existe de nombreux traders avaient coutume de tlcharger l'historique des donnes partir de la banque de donnes d'Alpari car ce broker fournit une base de donnes assez fiable et disponible gratuitement.
Note : nous prsentons ici comment procder pour utiliser les donnes historiques dAlpari mais ceci ne doit tre considr en aucun cas comme une possible recommandation envers ce broker. Nous utilisons ici juste les donnes historiques disponibles et aucun autre service. La raison de ce choix est que les donnes historiques d'Alpari ont t le plus utilises avant l'arrive du History Center et restent trs largement utilises aujourd'hui. Dans ce cas la procdure de tlchargement est plus complexe mais il est intressant de la connaitre. Tlchargement des donnes historiques sur votre disque dur Vous pouvez tlcharger les donnes l'adresse suivante : http://www.alpari-idc.com/en/dc/databank.php Il est prfrable de choisir les donnes 1M (minute par minute) qui vous donnent plus de prcision. Sauvegardez le fichier dans un rpertoire que vous aurez cr. D-zippez le fichier zip contenant les donnes. Ce fichier contient les donnes minute par minute (M1) pour la paire que vous avez choisie. Chargement des donnes M1 Ouvrez la plateforme MT4 et appuyer sur la touche F2 (ou bien menu Outils -> Archives) et vous aurez la pop-up pour les donnes historiques que nous avons vu dans l'exemple prcdent. Cliques sur Importer . La pop-up suivante s'ouvre.
A l'aide du bouton Parcourir vous pourrez aller jusqu'au rpertoire o vous avez votre fichier de donnes historiques et slectionner le fichier (pour cela ne pas oublier de choisir le type de fichier correct MetaQuotes files (*.hst) )
Cliquez Open , la dernire pop-up se ferme et les donnes apparaissent dans la pop-up d'import.
Cliquez Ok . Si vous voyez que dans la fentre de l'historique toutes les donnes ne sont pas prises en compte pour M1 alors procdez avec Outils -> Options comme dcrit dans le cas de l' History Center Fermez la fentre de l'historique. Maintenant vous avez les donnes historiques en M1 mais pas pour les units de temps suprieures, ce qui est un problme pour des backtests sur des units de temps au dessus M1. Voici comment rgler ceci. Conversion des donnes M1 Pour viter toute confusion il est prfrable de supprimer les donnes prcdentes : Allez sous le rpertoire history puis sous le rpertoire ayant le nom du serveur que vous utilisez. Supprimez tous les fichiers <paire>x.hst avec x > 1. Par exemple EURUSD5.hst, EURUSD15.hst La conversion des donnes se fait en utilisant MT4. Il faut tout d'abord ouvrir un graphe M1 de la paire dsire. Ensuite dans le navigateur, sous Scripts , slectionnez period_converter et glissez le sur le graphe. Dans la pop-up qui s'ouvre allez sur l'onglet paramtres et changer la priode 5
Cliquez OK et attendez environ 20 secondes pour que le script fasse son travail. Il n'y a pas d'alerte de fin. Recommencer l'opration en glissant de nouveau le script sur le graphe. L'alerte suivante est affiche
Cliquez sur Yes . Entrez la priode suivante dans le script correspondant la valeur 15. Recommencer cette srie d'oprations pour toutes les units de temps : 30, 60, 240, 1440. Redmarrer la plateforme et vous aurez les donnes historiques disponibles.