Vous êtes sur la page 1sur 55

MetaQuotes Language 4 (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.

Syntaxe du langage MQL4


MQL4 est trs proche dans sa syntaxe et sa structure du langage C. Si vous connaissez C, C++ ou mme d'autres langages de programmation il vous sera ais de dvelopper en MQL4. Sinon nous allons voir les bases de ce langage et tout d'abord sa syntaxe. Format Le code crit en MQL4 peut tre format assez librement en utilisant des espaces, tabulations, ou retour la ligne afin de le rendre plus lisible. Il y a nanmoins quelques contraintes respecter : Il n'est pas possible d'utiliser des espaces, tabulations ou retour la ligne au milieu des constantes, identifiants ou mots-cls. (Nous verrons plus tard la signification de ces termes mais pour l'instant on peut simplifier en disant qu'il ne faut pas couper les mots en 2) Les directives de compilation doivent tre sur une seule ligne. Exemples de code valide double MM_Lente, MM_Rapide ; double MM_Lente, MM_Rapide ; double MM_Lente, MM_Rapide ; int MM_Periode = 200 ; #define MAGIC = 123 ; Exemples de code invalide double MM_ Lente, MM_Rapide ; dou ble MM_Lente, MM_Rapide ; int MM_Periode = 20 0 ; #define MAGIC = 123 ; Identifiants Un identifiant est un nom de variable, constante ou fonction. Par exemple MM_Lente ou MM_Periode utiliss dans les exemples ci-dessus sont des identifiants. Il existe aussi des rgles respecter pour les identifiants : Un identifiant peut seulement contenir des lettres (majuscules ou minuscule sont autorises), des chiffres ou _ Un identifiant ne peut commencer par un chiffre Un mot-cl rserv ne peut tre utilis comme identifiant. La longueur d'un identifiant ne peut tre suprieure 31 caractres Les identifiants sont sensibles la diffrence majuscule / minuscule (donc MM_lente et MM_Lente sont des identifiants diffrents) Exemples d'identifiants invalides 1MM_Lente (chiffre au dbut) MM_Lente$ ($ non autoris) double (mot-cl rserv mais Double est valide)

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.

Types de donnes - Langage MQL4


En MQL4 nous avons les types de donnes suivants : Entiers (int) Rels (double) Boolen (bool) Caractres (int) Chaine de caractres (string) Couleur (color) Date et heure (datetime) Ces types de donnes sont trs standards sauf color et datetime . Ces types sont en fait grs en interne comme des entiers, mais ces types ont t dfinis par souci de clarification. Type entier Un entier en MQL4 peut prendre une valeur entre -2147483648 et 2147483647. Le nombre peut dbuter par un signe + ou . Le premier chiffre ne peut tre un 0. MQL4 permet de reprsenter un entier soit en format dcimal soit en format hexadcimal. Format dcimal C'est le format classique. Par exemple 11, -123 sont des entiers au format dcimal Format hexadcimal C'est le format de reprsentation en base 16, qui inclus pour cela la fois les chiffres de 0 9 et aussi les lettres de A F. Par exemple le nombre 31 en base dcimale sera reprsent 1A en hexadcimal. Pour signaler que la reprsentation est en hexadcimal le nombre est prcd de 0X ou 0x. Par exemple : 0X12, 0x2C. Le mot cl pour ce type est int . Type rel Un nombre rel est un nombre ayant une reprsentation dcimale (en langage courant pouvant avoir des chiffres aprs la virgule). Comme MQL4 est bas sur la notation US, la virgule est en fait un point ! Un rel en MQL4 peut prendre une valeur entre 2.2 e -308 et 1.8 e 308. Exemples de nombre rels : 1.2, -0.001, .5 Le mot cl pour ce type est double . Type boolen Une variable boolenne ne peut prendre que deux valeurs : vrai ou faux, bien sur dans leur version anglaise true et false . Ce type de variable est en gnral utilis pour garder en mmoire le fait qu'une certaine opration a t faite ou non. Les valeurs ci-dessous sont quivalentes : True, true, TRUE, 1 False, false, FALSE, 0 Le mot cl pour ce type est bool . Type caractre Un caractre est un des 256 lments dfinis dans la table des caractres ASCII (American Standard Code for Information Interchange). Chaque caractre peut tre soit reprsent par le caractre lui-mme entre guillemets simples soit par son code ASCII au format hexadcimal : par exemple a' ou 0x61. Un certain nombre de caractres particuliers doivent tre prcds du signe \.

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

compare si x est infrieur ou gal 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 : ,

Conditions langage MQL4


Les instructions conditionnelles permettent d'excuter une certaine expression ou suite d'expressions selon le rsultat d'une condition Les 3 types d'instructions conditionnelles sont : if (si) if else (si sinon) switch (aiguillage) L'instruction if Cette instruction permet d'excuter un certain code si une condition est vrifie. Le code excuter sera plac entre des accolades sauf dans le cas d'une expression simple qui dans ce cas peut tre laiss sans accolades comme dans les exemples ci-dessous : if (x == 0) // si x est gal 0 x = 1 ; // alors on assigne 1 x if (x < y) // si x est infrieur y { z = y x ; // on assigne y-x z x = 0 ; // on assigne 0 x } L'instruction if else Cette instruction permet d'excuter un certain code si une condition est vrifie et un code diffrent dans le cas contraire. De mme faon que pour le if, le code excuter sera plac entre des accolades sauf dans le cas d'une expression simple qui dans ce cas peut tre laiss sans accolades comme dans les exemples ci-dessous : if (x == 0) // si x est gal 0 x = 1 ; // alors on assigne 1 x else x = 2 ; // si x n'est pas gal 0 on lui assigne la valeur 2 if (x < y) // si x est infrieur y { z = y x ; // on assigne y-x z x = 0 ; // on assigne 0 x } else { z = x - y ; // on assigne x-y z x = 1 ; // on assigne 1 x } Les instructions if et if else peuvent tre imbriques autant de fois que ncessaire. if (x == 0) // si x est gal 0 { if (x < y) // si x est infrieur y { z = y x ; // on assigne y-x z

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.

Boucles langage MQL4


Les boucles permettent d'excuter une partie de code plusieurs fois. Ceci est trs utile si l'on doit appliquer une opration similaire sur plusieurs lments de mme type ou si l'on doit rechercher un lment particulier parmi un groupe d'lments de mme type (par exemple un ordre en profit parmi les ordres ouverts). Il existe 2 types de boucles en MQL4 : les boucles for et les boucles while . La boucle for La boucle for permet d'excuter un nombre prdfini de tours. La boucle for contient 3 paramtres qui dfinissent la condition d'excution et d'arrt de la boucle. Le premier est une expression pour l'initialisation de la boucle qui est excute au dmarrage de la boucle Le deuxime est une expression de test qui est la condition de continuation de la boucle est qui est excute chaque tour Le troisime est une expression d'incrment qui est excut chaque tour Deux exemples sont fournis ci-dessous : for(i=0; i<10; i++) Print(i); for(i=0,j=1; i<5 || j<7; i++,j++) { Print(i); Print(j); } Le premier exemple est la boucle for la plus simple qui soit. Au dbut de la boucle la variable i est initialise 0 et est incrmente la fin de chaque tour. La boucle s'excute tant que la condition de test est vraie donc tant que la variable i est infrieure 10. Le contenu de la boucle affiche i. Le rsultat de cette boucle sera l'affichage des valeurs de 0 9. Le deuxime exemple est un peu plus complexe et montre certaines proprits de la boucle for . Il est possible d'utiliser plus d'une expression d'initialisation en les sparant par une virgule. Il est possible d'utiliser plus d'une expression d'incrmentation en les sparant par une virgule. Par contre l'expression de test est unique et est une expression donnant un rsultat vrai / faux. Si le contenu de la boucle contient plusieurs expressions celles-ci doivent tre dlimites par des accolades. Le rsultat de l'excution de cette boucle affichera 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6. La boucle while La boucle while a une syntaxe diffrente de la boucle for ce qui lui permet d'tre utilise lorsqu'on ne connait pas en avance le nombre de fois ou la boucle doit tre excute. On peut aussi l'utiliser si on connait le nombre d'itrations en avance mais dans ce cas une boucle for peut aussi bien tre utilise. Contrairement la boucle for , la boucle while ne contient qu'un paramtre qui est l'expression de test. Dans l'exemple ci-dessous considrons que les valeurs de x et y ne sont pas connus par avance (par exemple x et y sont le cours de 2 paires de devises)

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

Fonctions langage MQL4


Les fonctions sont utilises pour grouper une partie de code effectuant une fonction particulire. Crer plusieurs fonctions plutt que de mettre tout le code dans la fonction principale permet de rendre le code plus lisible et permet de localiser en un seul endroit du code qui peut tre excut plusieurs fois juste en appelant la fonction plutt qu'en ayant crire plusieurs fois le mme code dans la fonction principale. Tout code doit faire partie d'une fonction. Par dfaut cela peut tre la fonction principale start() (voir plus bas). Les fonctions peuvent tre appeles l'intrieur d'autres fonctions. Il n'y a pas de limitations particulires. Dfinition d'une fonction Une fonction est dfinie par son nom, son type et ses paramtres. Par exemple : void ma_fonction(int param1) { Print(param1) ; } Dans le cas ci-dessus le nom de la fonction est ma_fonction, son type est void (signifiant qu'elle ne retourne pas de valeur) et a un seul paramtre qui est un entier. Le corps de la fonction est dlimit par des accolades. L'appel de cette fonction se fera de la faon suivante : ma_fonction(2); Ce qui affichera la valeur 2. Voici un deuxime exemple : double carre(double x, int param1) { Print(param1) ; return(x*x) ; } Dans le cas ci-dessus le nom de la fonction est carre, son type est double et a deux paramtres qui sont spars par une virgule. Le premier est un double et le second un entier. Dans le corps de la fonction nous avons le mot-cl return et entre parenthse la valeur qui sera retourne. L'appel de cette fonction se fera de la faon suivante : y = carre(2.0,3); Ce qui affichera la valeur 3 et donnera la valeur 4.0 la variable y. Le mot-cl return Le mot cl return permet la fonction de retourner une valeur, il termine donc la fonction. Habituellement il n'y aura pas plus qu'un return par fonction (voire 0 dans le cas d'une fonction de type void) mais il n'est pas interdit d'en avoir plusieurs dans le cas d'excution conditionnelle comme dans le cas ci-dessous :

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.

Variables langage MQL4


Les variables sont utilises pour contenir les valeurs requises par l'excution du programme. Avant d'tre utilise, une variable doit tre dclare. Si vous essayer d'utiliser une variable avant de l'avoir dclare, le compilateur vous signalera l'erreur. L'endroit o la variable est dclare dfinit sa porte (scope en anglais). Dclaration d'une variable Une variable est dclare par son nom, son type et optionnellement sa valeur initiale. Par exemple : int ma_variable = 0 ; int dfinit le type entier pour cette variable. ma_variable est le nom de la variable. = 0 assigne la valeur 0 la variable. Cette partie est optionnelle et l'assignement d'une valeur une variable peut tre fait n'importe quand une fois que celle-ci a t dclare. Pour rappel, en MQL4 nous avons les types de donnes suivants : Entiers (int) Rels (double) Boolen (bool) Caractres (int) Chaine de caractres (string) Couleur (color) Date et heure (datetime) Porte d'une variable Une variable peut avoir une porte globale (pour tout le programme) ou locale une fonction selon l'endroit o elle est dclare. Variable locale Une variable locale est une variable locale la fonction l'intrieur de laquelle elle est dclare. Par exemple : double carre(double x) { int var1 = 0 ; Print(var1) ; return(x*x) ; } Dans le cas ci-dessus nous avons deux variables locales. x qui est passe en paramtre de la fonction et var1 qui est dclare dans le corps de la fonction. Il est noter que dans le cas de la variable x sa dclaration se fait dans les paramtres de la dclaration de la fonction. Les variables x et var1 peuvent donc tre utilises dans le corps de la fonction mais par contre sont inconnue pour les autres fonctions. En gnral il est conseill de dclarer toutes les variables en dbut de fonction pour une meilleure lisibilit du code. Nanmoins ceci n'est pas strictement obligatoire tant que la variable est dclare avant son utilisation. Un point important est que ces variables sont rinitialises chaque appel de la fonction. On ne peut donc pas conserver de valeur entre 2 appels.

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.

Directives de compilation langage MQL4


Les directives de prcompilation sont des instructions que le compilateur traitera avant de traiter le reste du code. En MQL4 il y a 4 directives de prcompilation : #define #iimport #include #property Il est important de noter que les directives de prcompilation ne sont pas termines par un pointvirgule. Directive #define La directive #define est utilise pour dfinir une constante. Par exemple : #define NUMBER 123 Ceci dfinit une constante appele NUMBER (les constantes sont traditionnellement mises en majuscules mais ceci n'est pas une obligation) qui a la valeur 123. Cette constante peut tre utilise n'importe quel endroit du code pour remplacer la valeur 123. L'avantage principal est d'avoir une seule valeur modifier en cas de changement de la constante plutt que d'avoir changer la valeur 123 travers tout le code. Directive #import La directive #import permet d'importer des fonctions provenant d'autres fichiers ex4 ou de dlls. Dans le cas de fichier ex4, il n'est pas ncessaire de dclarer spcifiquement les fonctions que vous voulez utiliser amis dans le cas de dll il faut dclarer les fonctions que vous voulez utiliser comme dans l'exemple ci-dessous : #import mon_ex4.ex4 #import ma_dll.dll void ma_fonction1_dans_dll(); int ma_fonction2_dans_dll(int x); #import Les fonctions de la dll qui peuvent tre utilises dans le code sont ma_fonction1_dans_dll et ma_fonction2_dans_dll. Les fonctions sont listes entre 2 #import, la premire fournissant le nom de la dll, et la deuxime servant juste clore la liste. Directive #include La directive #include est quivalente faire un copier-coller du fichier inclure dans le fichier courant. Par exemple : #include <stdlib.mqh> Le fait que le nom du fichier soit entre crochets <> indique que ce fichier se situe dans le rpertoire par dfaut experts/include. Si le fichier inclure se situe dans un endroit diffrent alors il faut utiliser des guillemets et donner le chemin par rapport au rpertoire ou se situe votre code.

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

Analyse de la struture du code d'un EA


Avant de programmer soi-mme un Expert Advisor, il est utile de voir comment d'autres EAs ont t cods. MetaTrader 4 est fourni avec un EA MACD Sample.mq4 qui se trouve sous le rpertoire experts de votre installation. Cet EA servira d'exemple de base pour analyser la structure d'un EA simple. L'objectif n'est pas d'analyser en dtail la logique de l'EA mais surtout de dterminer les blocs de code qui sont significatifs. Fonctionnalits non-utilises par MACD Sample Avant de voir plus en dtail le contenu de cet EA, on peut noter que certaines fonctionnalits de MQL4 ne sont pas utilises dans cet EA car il est relativement simple. il n'y a pas de directives de prcompilation telles que #include, #import ou #define il n'y a pas de variables globales autres que les paramtres d'entre de l'EA les fonctions init() et deinit() ne sont pas dfinies. Analyse du code Entte Le code dmarre par un entte rappelant le nom du programme et la proprit du code.

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.

Analyse de la structure du code d'un indicateur


Nous allons analyser ici la structure d'un indicateur simple pour se familiariser avec les diffrents lments composants un indicateur. L'indicateur prsent est le MACD. Cet indicateur tant fourni par dfaut par MetaTrader 4 il n'est pas ncessaire de le coder mais comme c'est un indicateur connu et simple c'est un bon exemple. Analyse du code Entte Le code dmarre par un entte rappelant le nom du programme et la proprit du code.

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.

Assurer le passage des ordres


Les fonctions les plus utilises et dimportance critique dans un EA sont les fonctions de passage des ordres et en particulier OrderSend() pour ouvrir un ordre et OrderClose() pour fermer un ordre. Ces fonctions envoient une requte sur le serveur pour tre excute mais lexcution de celle-ci nest pas garantie 100%, principalement dans le cas dun march bougeant rapidement ou si plusieurs ordres sont envoys simultanment ou dans un intervalle trs court. Si les requtes ne sont pas excutes, les fonctions OrderSend() et OrderClose() renvoient un code derreur. Cependant, si le cas dun possible renvoi de lordre en cas derreur nest pas trait (ce qui arrive souvent dans les codes dEA que lon trouve sur le web) lordre est juste perdu . Ce genre de problme est parfois difficile dcouvrir car ce problme nest pas visible en backtest et aussi souvent indtectable en test car dans le cas dun compte dmo les ordres sont en gnral toujours excuts. Et ce nest donc que dans le cas dune utilisation sur un compte live que ce problme devient clairement vident. Ci-dessous la fonction tudie est OrderSend() mais le mme procd peut-tre utilis pour les autres fonctions telles que OrderClose(). Assurer louverture du trade Utilisation de OrderSend() sans renvoi de lordre Lenvoi simple dun ordre dachat est par exemple cod de la faon suivante : int ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,1,0,0,NULL,1234,0,Blue); Si lordre ne peut tre pass alors la valeur de ticket sera -1. Dans le cas de lordre ci-dessus la valeur du slippage est de 1 et donc la probabilit que lordre ne puisse tre pass est assez leve si la paire a une volatilit importante. Utilisation de OrderSend() avec renvoi de lordre Au lieu denvoyer simplement une fois lordre, il est possible de renvoyer lordre tant quil na pas t excut (donc tant que ticket = -1). Pour cela il faut dune part faire une petite pause entre les requtes pour ne pas submerger le serveur dordres et aussi remettre jour les valeurs des cours car le march a boug depuis le premier appel. Ceci est ralis par le code suivant : int ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,1,0,0,NULL,1234,0,Blue); while (ticket == -1) // tant que lordre nest pas pass { Sleep(1000); // on attend une seconde RefreshRates(); //on rafraichit les valeurs du cours de la paire ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,1,0,0,NULL,1234,0,Blue); } Ce code tant utilis trs frquemment t tant plus lourd quun simple appel une fonction il est prfrable de le mettre dans une fonction qui sera par exemple nomme EnvoiOrdre() et aura strictement les mmes paramtres que OrderSend(). Et donc dans le reste du code il suffit de remplacer OrderSend() par EnvoiOrdre() pour sassurer que lordre soit bien pass. Note : selon la stratgie de lEA sassurer du passage de lordre nest pas ncessairement critique. Par exemple dans le cas de louverture dun ordre il peut tre prfrable de rater lordre que de le passer un prix trop loign du cours objectif original. Mais dans le cas de la fermeture dun ordre il est en gnral plus prudent de fermer lordre tout prix plutt que le laisser ouvert si cela ne correspond pas la stratgie dsire.

Grer la concurrence des ordres


Il est possible que plusieurs instances dun mme EA places sur plusieurs graphes, ou plusieurs EA essaient de passer des ordres simultanment (dautant plus si par exemple ces EAs travaillent sur plusieurs paires louverture de la bougie sur des units de temps identiques). Le serveur ne peut excuter plusieurs requtes simultanes venant de la mme plateforme. Pour ne pas surcharger le serveur avec de nombreux ordres qui ne pourront tre excuts, il convient de vrifier si dautres ordres sont en cours de passage et si le serveur est disponible. Vrification si un ordre est en cours Pour pouvoir vrifier si le passage dun ordre est en cours et cela sur plusieurs EA, il est ncessaire dutiliser une variable globale MT4 (ce qui est diffrent dun variable globale lintrieur dun programme). MT4 propose des fonctions pour crer et grer des variables globales qui sont globales lensemble de la plateforme et donc peuvent tre changes entre diffrents EA ou entre plusieurs instances du mme EA. Dans le cas prsent nous pouvons crer une variable globale avant de lancer un ordre : GlobalVariableSet("OrdreEnCours", 1); Et la dtruire une fois que lordre a t pass par la fonction suivante. GlobalVariableDel("OrdreEnCours"); De plus cot la fonction IsTradeAllowed() permet de vrifier si lEA est autoris passer des ordres. On peut ainsi vrifier si un ordre en cours de passage, et si cest le cas attendre la fin du passage de lordre en cours. Le code ci-dessous fait cette vrification avec une attente de 1 seconde entre les vrifications et en grant un temps maximum de rponse fix 30 secondes. datetime start_time = TimeCurrent(); // temps de rfrence de la vrification int time_out=30; // dure maximum de la vrification while (GlobalVariableCheck("OrdreEnCours") || !IsTradeAllowed()) { if(start_time + time_out <= TimeCurrent()) { Print("Timeout"); return(0); } Sleep(1000); }

Comment gnrer une alerte


MT4 permet de gnrer des alertes visuelles et sonores par programmation dans un indicateur ou un EA. Il est souvent utile de pouvoir gnrer une alerte lorsquun certain nombre de conditions sont remplies pour pouvoir tre averti sans avoir vrifier soi-mme visuellement lvolution des valeurs des indicateurs surtout si lalerte doit tre dclenche selon une combinaison de variables entre diffrents indicateurs. Alerte visuelle MQL4 propose une fonction dalerte visuelle qui ouvre une popup et affiche le message fourni dans le code. La fonction appeler est Alert("message"); Dans le message il est peut tre intressant de spcifier la paire et la priode sur laquelle lalerte est dclenche dans le cas ou la mme srie dindicateurs est attache sur plusieurs graphes Alert(Symbol(),Period()," Alerte Achat"); Alerte sonore MQL4 propose une fonction dalerte sonore qui joue un son prdfini. Un certain nombre de sons sont fournis en standard dans le rpertoire sounds de votre installation MT4 (fichiers avec une extension .wav). La fonction appeler est PlaySound("alert.wav"); Il est bien sur possible de remplacer alert.wav par un autre nom de fichier. Pour utiliser un son particulier non fourni par MT4 en standard, le plus simple et de placer le fichier avec les autres sons sous sounds est de lappeler dans la fonction PlaySound().

Appel dindicateurs en fin de barre dans un EA


Certaines stratgies sont bases sur des valeurs dindicateurs calcules uniquement une fois la barre en cours clture. Ceci lavantage pour les backtests dtre plus fiable car lhistorique des donnes pour les backtest nes pas plus prcis que 1 minute et donc les ticks gnrs entre louverture et la fermeture de la barre M1 sont simuls. Par contre les valeurs douverture et de fermeture de barre sont elles les valeurs historiques relles. La fonction start() dun EA est appele chaque tick. Il faut donc ajouter une partie de code pour filtrer les ticks. Filtrage des ticks Comme il nest pas possible de savoir quel sera le dernier tick dune barre avant que celle-ci soit clture (on ne sait jamais si un nouveau tick viendra avant la fin cde barre ou si ce tick est le dernier) if faut tester le dbut de la barre suivante. Pour cela il faut tout dabord dclarer une variable globale qui conservera sa valeur entre les appels de la fonction start() datetime barre = 0; Puis il faut vrifier si on est un dbut de barre en comparant le temps de dbut de la barre qui a t trait et le temps de dbut de la barre courante. Si ces 2 temps sont gaux alors on est toujours dans la mme barre sinon on a chang de barre et cest donc le dbut dune nouvelle barre. if (barre == Time[0]) // si ce nest pas une nouvelle barre { return (0); // on attend le tick suivant } else // si cest une nouvelle barre { barre = Time[0]; // on enregistre le temps de dbut de la barre } Dans le cas o le tick ne correspond pas une nouvelle barre, tous le code situ aprs cette portion de code ne sera pas excut. Si par exemple un trailing stop doit tre excut pour chaque tick mais louverture dun ordre doit tre excute seulement en dbut de barre, le code ci dessua devra tre plac entre ces deux portions de code. Appel de lindicateur Si on veut la valeur dun indicateur en fin de barre et que le code correspondant est excut seulement au premier tick de chaque barre il faut prendre la valeur de lindicateur en fermeture de la barre suivante. Par exemple pour une moyenne mobile de priode 20, la fonction appeler est : double mm = iMA(Symbol(), 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);

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); }

Comment coder un trailing stop


Le trailing stop est un stop loss qui suit la progression de lordre en cours lorsque celui-ci est positif. Il faut donc modifier le stop loss chaque fois quun ordre dachat fait un plus haut ou quun ordre de vente fait un plus bas. De plus pour certaine stratgies le trailing stop est activ aussitt que lordre est en profit (mme seulement de 1 pip) et dans dautres cas le trailing stop est activ seulement lorsque lordre est suffisament en profit pour que le stop soit plac au moins break-even . Ces deux diffrents cas sont prsents ci-dessous. Trailing stop activ immdiatement. Voici un exemple avec un trailing stop fix arbitrairement 20. int trailing_stop = 20; double ts;

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); } } }

Trailing stop activ aprs break even


int trailing_stop = 20; double ts; for (int i = OrdersTotal()-1; i >= 0; i --) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if (OrderSymbol() == Symbol()) { if (OrderType() == OP_BUY) { ts = Bid-(Point*trailing_stop); if (OrderStopLoss()<ts && (Bid-OrderOpenPrice())>=(Point*trailing_stop)) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White); } if (OrderType() == OP_SELL) { ts = Ask+(Point*trailing_stop); if (OrderStopLoss()>ts && (OrderOpenPrice()-Ask)>(Point*trailing_stop)) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White); } } }

Qu'est ce qu' un Backtest ?


Un backtest est un processus, en gnral automatis, par lequel un trader peut estimer comment une stratgie donne se serait comporte dans le pass. C'est une simulation de trading sur des donnes passes. Conditions de backtest Comme dans toute simulation, le backtest sera d'autant plus utile qu'il sera raliste. Pour cela les conditions ci-dessous devront idalement tre remplies : Les donnes historiques doivent tre fournies avec un intervalle de temps entre chaque donne le plus rduit possible (idalement chaque tick) Le cout des transactions doit tre pris en compte : spread, commissions, swap si les positions sont gardes plusieurs jours L'excution des ordres doit tre le plus raliste possible (slippage, requote) La stratgie se base uniquement sur les donnes passes et n'utilise pas les donnes dans le futur Le backtest est ralis sur diffrentes phases de march incluant le maximum de configurations possibles (tendance haussire, tendance baissire, consolidation) Cas de MT4 Les donnes historiques sont en gnral fournies chaque minute (open, close, high, low). La valeur des ticks est seulement value par l'outil de backtest. Comme les donnes en tick sont seulement estimes il faut privilgier les donnes purement historiques et travailler par exemple en prenant en compte uniquement la valeur du close chaque minute. L'outil de backtest prend en compte le swap et le spread. En gnral les brokers MT4 n'ajoutent pas de commission donc le cot est relativement raliste. La raison du relativement vient de la faon dont le spread et le swap sont pris en compte. Les valeurs historiques du spread et du swap ne sont pas conserves et les valeurs prises en compte sont les valeurs courantes. Cela l'intrt de pouvoir utiliser les mmes donnes historiques pour diffrents brokers qui peuvent avoir des valeurs diffrentes pour le spread et le swap. Nanmoins ceci a aussi l'inconvnient de ne pas avoir des donnes ralistes dans certains cas spciaux, en particulier l'augmentation importante du spread lors de l'annonce de nouvelles conomiques. L'influence que cela a sur le rsultat final dpend de la stratgie utilise mais cela doit tre gard en mmoire lorsqu'on effectue un backtest. Lors d'un backtest il n'y a pas de slippage et de requote. Rsultat d'un backtest Deux types de rsultats sont attendus d'un backtest. Les rsultats dtaills permettant d'analyser les ordres passs et ainsi de vrifier que l'implmentation de la stratgie tait correcte et le rsum qui permet d'analyser la stratgie globalement. Les rsultats dtaills sont en gnral une simple liste d'ordres avec pour chacun d'eux : la date, l'heure et le prix d'ouverture de l'ordre la date, l'heure et le prix de fermeture de l'ordre les autres cots associs au passage de l'ordre Le rsultat final pour cet ordre. Le rsum est en gnral plus complexe et offre des informations de synthse telles que : Le solde final la fin de la priode de backtest Les totaux cumuls des gains et des pertes Le nombre total d'ordres et le pourcentage d'ordres gagnants (idem en sparant les ordres d'achats et de vente) Le facteur de profit La croissance annualise du compte La chute maximale au cours du test en valeur absolue et en pourcentage Interprtation des rsultats Le rflexe des traders novices est de considrer en priorit le solde du compte en valeur brute la fin du test. Cependant ceci n'est souvent pas la valeur la plus intressante prendre en compte. Deux

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.

Insrer un indicateur dans MetaTrader


MetaTrader 4 possde par dfaut un grand nombre d'indicateurs et de plus vous pouvez soit en programmer en plus ou alors rcuprer sur le Web de nombreux indicateurs dvelopps par d'autres personnes et mis disposition gratuitement. Pour insrer un indicateur sur un graphe vous avez le choix de le faire via le menu soit via la fentre Navigateur . Slection de l'indicateur par le menu Aller dans le menu et slectionner Insertion -> Indicateurs. Ici apparait une liste avec dans une premire partie une slection d'indicateurs par dfaut puis dans une seconde partie des catgories d'indicateurs. Il vous faut donc savoir dans quelle catgorie se trouve l'indicateur que vous souhaitez insrer. Si ce n'est pas un indicateur par dfaut de MT4 ce sera dans la catgorie Personnaliss . Vous trouverez par exemple les moyennes mobiles sous Trend, le stochastic sous Oscillateur, etc Une fois la catgorie slectionne vous choisissez l'indicateur voulu.

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.

Le troisime onglet ( Visualisation ) indique comment doit tre affich l'indicateur.

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.

Publier les rsultats d'un compte MT4


Tout d'abord, pour publier les rsultats d'un compte MetaTrader 4 en live sur une page web, il vous faut un site web permettant de recevoir les rsultats via FTP (File Transfer Protocol) car c'est le protocole utilis par MT4 pour distribuer le fichier de rsultats. Activation de la publication sur MT4 Il faut tout d'abord ouvrir la pop-up des options (menu Outils -> Options).

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.

Insrer une alerte sonore sur Metatrader


La plateforme de trading Metatrader permet d'insrer des alertes sonores pour attirer l'attention du trader lorsqu'un indicateur franchit un certain seuil ou change de couleur par exemple. Pour illustrer comment procder nous allons prendre un cas concret avec un indicateur standard disponible par dfaut sous MT4. Prenons par exemple le premier indicateur par ordre alphabtique : Accelerator. Cet indicateur est affich sous forme d'histogramme avec des barres vertes ou rouges : verte si la barre est plus haute que la prcdente, rouge si elle est plus basse. Nous allons y ajouter une alerte la fois visuelle et sonore lorsque la dernire barre change de couleur (donc aprs clture de la dernire barre et non pas sur la barre courante pour ne pas avoir des alertes constantes si la barre courante change de couleur frquemment au cours de sa formation). Nous n'allons pas tudier le code de cet indicateur en dtail car ce n'est pas ncessaire. Il est seulement utile de comprendre la logique lie la couleur des barres, ce qui est inplment dans la dernire boucle du programme.

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 :

Puis au niveau de la fonction start() nous modifierons le code de la faon suivante :

Ainsi nous aurons une alerte seulement une fois par barre, aprs que la barre soit termine.

Tlcharger un historique de cours Metatrader


Pour raliser des backtests fiables il est ncessaire d'avoir des donnes les plus prcises possibles et sur une priode la plus longue possible. La plateforme MT4 collecte au fur et mesure les donnes (donnes en 1 minute et non tick par tick) mais il est en gnral ncessaire d'avoir des donnes sur une priode plus ancienne et pour cela il faut tlcharger des donnes historiques pour MT4. Nous allons voir ici les deux mthodes principales pour tlcharger un historique mais quelle que soit la mthode employe il faut bien prendre en compte l'aspect fuseau horaire des donnes. En effet, les donnes historiques sont rfrences en temps sur un fuseau horaire donn. Par exemple dans les cas prsents ci-dessous les donnes historiques sont bases sur GMT+1 (+ prise en compte heure d't). Mais les donnes du broker ne sont pas forcment bases sur le mme fuseau horaire. Si elles le sont, pas de soucis, mais si elles ne le sont pas le raccord entre la fin des donnes historiques et le dbut des donnes du broker ne se fera pas correctement. Pour viter ce problme le mieux serait toujours d'utiliser les donnes historiques fournies par le broker lui-mme mais malheureusement relativement peu de brokers offrent des donnes historiques. Si on ne peut pas rsoudre ce problme pour un broker le mieux est d'avoir 2 comptes : Un avec les donnes historiques qu'on n'utilisera que pour les backtests en se limitant la priode sur laquelle les donnes historiques ont t charges. Un autre pour les donnes du broker a n'utiliser que pour les tests sur une priode dmarrant l'tablissement du compte. Tlchargement de donnes de MetaQuotes MetaQuotes vous permet de tlcharger des donnes depuis leur History Centrer . Pour cela ouvrez la plateforme MT4 et appuyer sur la touche F2 (ou bien menu Outils -> Archives) et vous aurez une pop-up pour les donnes historiques comme ci-dessous. Le tlchargement se fait paire par paire et non globalement pour toutes les paires. Vous devez donc choisir une paire et cliquer sur tlcharger en bas gauche. Si vous voulez l'historique de plusieurs paires il faut effectuer cette opration pour chaque paire.

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.