mardi 1 avril 2014

Les objets graphiques

MetaTrader nous permet de créer en manuel des objets graphiques pour nous aider dans l'analyse des cours. Ces objets sont divers et standardisés dans le monde du trading: des droites de tendances, des canaux, des lignes de supports ou résistances, des niveaux de Fibonacci, des angles de Gann, des marques d'ouverture de position, des annotations de texte, etc. Ces objets nous aident à visualiser, à analyser les cours et à gérer notre trading manuel. Tous ces objets graphiques peuvent être créés, modifiés et effacés par programmation avec le langage MQL4. Nous voyons une introduction à tout cela dans ce post.

Les types d'objets


Les objets sont de divers types et ces types sont relativement nombreux. la seule chose qu'on ne puisse pas créer, c'est un segment de ligne. Cela pourrait nous servir à tracer une courbe, mais ceci est déjà géré par MetaTrader, et uniquement par le logiciel quand on créé un indicateur. C'est mieux ainsi, car MetaTrader peut ainsi gérer la mémoire importante nécessaire et la rapidité d'exécution. Nous devons nous contenter de symboles,, de texte, de primitives géométriques et d'objets d'analyse technique des cours. Voici une liste non exhaustive avec les constantes prédéfinies MQL4 à utiliser pour les obtenir:
  • Le texte
    • Labels  OBJ_LABEL 
    • Textes  OBJ_TEXT 
    • Zones d'édition de texte  OBJ_EDIT 
    • Label Prix gauche  OBJ_ARROW_LEFT_PRICE 
    • Label Prix droite  OBJ_ARROW_RIGHT_PRICE 
  • Les primitives géométriques
    • Rectangles  OBJ_RECTANGLE 
    • Triangles  OBJ_TRIANGLE 
    • Ellipses  OBJ_ELLIPSE 
  • Les symboles
    • Stop  OBJ_ARROW_STOP 
    • Check  OBJ_ARROW_CHECK 
    • Main avec pouce vers le haut  OBJ_ARROW_THUMB_UP 
    • Main avec pouce vers le bas  OBJ_ARROW_THUMB_DOWN 
    • Achat  OBJ_ARROW_BUY 
    • Vente  OBJ_ARROW_SELL 
    • Flèche vers le haut  OBJ_ARROW_UP 
    • Flèche vers le bas  OBJ_ARROW_DOWN 
  • Les objets d'analyse technique
    • Ligne verticale de période  OBJ_VLINE 
    • Ligne horizontale de support ou résistance  OBJ_HLINE 
    • Ligne oblique de tendance  OBJ_TREND 
    • Ligne oblique de tendance définie par l'angle  OBJ_TRENDBYANGLE 
    • Cycles temporels  OBJ_CYCLES 
    • Canal équidistant  OBJ_CHANNEL 
    • Canal de déviation standard  OBJ_STDDEVCHANNEL 
    • Ligne de Gann  OBJ_GANNLINE 
    • Angles de Gann  OBJ_GANNFAN 
    • Grille de Gann  OBJ_GANNGRID 
    • Retracements de Fibonacci  OBJ_FIBO 
    • Zones temporelles de Fibonacci  OBJ_FIBOTIMES 
    • Angles de Fibonacci  OBJ_FIBOFAN 
    • Arcs de Fibonacci  OBJ_FIBOARC 
Et il y existe d'autres objets non cités ici. Nous ne les verrons pas tous dans ce post, seulement le label et comment les objets sont créés et gérés.

Le système de coordonnées des graphiques


Avant toute chose, il faut préciser le système de coordonnées utilisé dans les graphiques. Un graphique en trading est temporel, c'est-à-dire que les abscisses sont exprimées en temps: du type datetime. En horizontal nous avons le temps. Pour les ordonnées, on se place verticalement en fonction du cours, c'est-à-dire du prix du sous-jacent (ici pour le forex, c'est le taux de conversion de la paire de devises). C'est donc un nombre décimal, du type double. Il y a certains objets qui ne doivent pas être placés sur un temps et un prix précis, mais de manière fixe sur la fenêtre, de sorte qu'on la voit toujours. Un temps ou un prix pouvant être hors affichage. On va d'ailleurs commencer à utiliser de tels objets.

Les sous-graphiques


Autre détail important: un graphique peut posséder des sous graphiques pour y placer des indicateurs. Un indicateur pouvant se placer dans le graphique principal de la paire de devises, ou bien dans une fenêtre à part, qui est sous-fenêtre de la principale. Ces fenêtres sont numérotées dans leur ordre d'apparition: 0 pour la principale, 1 pour la première sous-fenêtre, 2 pour la deuxième, etc.

La création d'objets


Créer un objet graphique se fait à l'aide d'une fonction prédéfinie en MQL4:  ObjectCreate() . Cette fonction retourne un booléen (type bool), c'est-à-dire vrai ou faux pour dire si la création de l'objet a réussi ou non. Depuis la nouvelle version du langage MQL4 mise à jour récemment en février 2014, il y a deux versions de cette fonction, (elle est surchargée, pour les connaisseurs): il y a une version où on indique la référence de la fenêtre principale où on veut créer l'objet, puis le numéro de la sous-fenêtre (commençant à zéro), et une version où on n'indique pas la fenêtre principale car c'est celle où est exécutée le programme (indicateur ou expert advisor). Seule la deuxième était existante avant.
Il faut lui fournir de nombreux arguments et dans cet ordre:
  •  long identifiantDeGraphique : C'est le pointeur de la fenêtre pour identifier la fenêtre principale sur laquelle on veut créer l'objet et qui donc peut être différente de celle où le programme fonctionne. Paramètre nouveau et optionnel.
  •  string nomDeLobjet : Nom de l'objet à créer. Il faut évidemment lui donner un nom pour pourvoir ensuite le modifier ou le supprimer.
  •  ENUM_OBJECT typeDeLobjet : On utilise ici une constante précédemment listée.
  •  int noSousFenetre : Le numéro de la sous-fenêtre graphique dans laquelle créer l'objet. 0 pour la principale, 1 pour la première si elle existe, 2 pour la deuxième si elle existe, etc. La fenêtre principale est celle où est exécutée le programme ou bien celle désignée par l'identifiant de fenêtre en option.
  •  datetime premiereCoordonneeTemps : l'horodatage du premier point qui place l'objet.
  •  double premiereCoordonneePrix : position veticale (prix) du premier point qui place l'objet.
  • On peut répéter ces deux coordonnées jusqu'à trois fois pour la vieille version de la fonction, parce qu'il peut falloir jusqu'à trois points pour définir la position, l'orientation et la taille de l'objet sur le graphique. Mais toujours par paire. Avec la nouvelle version, lorsqu'on précise une fenêtre par son identifiant, on n'est plus limité à trois, mais autant de points qu'on veut.
On créé ainsi un objet, mais sans préciser de contenu, car beaucoup n'en n'ont pas besoin. Ceux du type texte ou label, on besoin qu'on leur ajoute un contenu texte. Ce sera fait avec une modification de l'objet dans le paragraphe suivant. Une précision supplémentaire: les objets label, ne prennent pas en compte les coordonnées fournies à la création car un label va rester fixe par rapport à l'affichage, alors qu'un point placé sur un horodatage précis pourra ne pas être vu si l'horodatage est en dehors de l'intervalle affiché, de même pour la coordonnée verticale du prix. Un label devant être toujours affiché, il faut lui préciser dans un second temps des coordonnées en pixels par rapport à un coin de la fenêtre. Ce sera fait avec la fonction de modification.

La modification d'objets


Pour modifier un objet, c'est pas compliqué, il suffit d'utiliser la fonction spécialement prévue à cet effet:  ObjectSet() . Cette fonction change une propriété de l'objet. On doit lui donner le nom de l'objet à modifier, la propriété à changer sous forme de nombre entier soit une constante prédéfinie et la nouvelle valeur sous forme de nombre décimal. Elle retourne un booléen vrai ou faux pour dire si la modification a réussi ou pas. Les propriétés sont désignées par ces constantes (liste non exhaustive):
  •  OBJPROP_TIME1  horodatage du premier point de positionnement
  •  OBJPROP_PRICE1  prix du premier point de positionnement
  •  OBJPROP_COLOR  couleur de l'objet
  •  OBJPROP_STYLE  style de traçage pour les lignes uniquement
  •  OBJPROP_WIDTH  epaisseur du trait pour les lignes uniquement
  •  OBJPROP_ANGLE  angle de l'objet
  •  OBJPROP_FONTSIZE  taille de la fonte (police) pour les objet avec du texte.
  •  OBJPROP_CORNER  coin de la fenêtre origine de coordonnées pour placer le label (objets label uniquement), c'est un numéro de 0 à 3 pour les quatre coins du graphique.
  •  OBJPROP_XDISTANCE  position horizontale en pixels pour placer l'objet de manière fixe par rapport à la fenêtre, et non pas par rapport au temps et au prix. (pour les labels)
  •  OBJPROP_YDISTANCE  position verticale en pixels. (même commentaire)
Il y en a bien d'autres, voir la documentation fournie, dans l'aide de MetaEditor. On peut aussi simplement obtenir la valeur d'une propriété d'un objet avec la fonction  ObjectGet()  à qui on fournit le nom de l'objet et la propriété voulue et qui nous retourne sa valeur.
Nous allons dans le prochain post créer des labels, à qui il faut évidemment fournir un texte, et la fonction  ObjectSet()  ne peut le faire car la valeur transmise n'est pas un texte, mais est numérique. Il y a pour cela une fonction spéciale pour fixer le texte d'objets contenant du texte:  ObjectSetText() . On doit lui passer le nom de l'objet, le texte à mettre et en option car il y a des valeurs par défaut: la taille de la fonte (0 par défaut pour ne pas la changer), le nom de la fonte à utiliser (chaine de caractères pour désigner une police de caractères, par défaut NULL) et la couleur du texte (par défaut: clrNone). Elle retourne un booléen pour dire si la mise à jour du texte à réussi.

La suppression d'objets


Enfin, lors de la déinitialisation, il faut supprimer les objets créés pour libérer de la place sur le graphique. Il y a deux fonctions pour cela:  ObjectDelete()  qui prend un nom d'objet en argument et qui efface seulement celui-là. La fonction  ObjectsDeleteAll()  qui prend en option un numéro de sous-fenêtre et/ou un type d'objet pour se limiter à une sous-fenêtre et/ou un type d'objets et qui les efface tous. Ces deux fonctions retournent le nombre d'objets effacés et existent aussi maintenant en version avec la référence de la fenêtre principale en premier argument pour viser une fenêtre autre que celle sur laquelle le programme s'exécute.

Voilà pour une présentation qui permet de démarrer l'utilisation des objets graphiques, nous allons commencer dès le prochain post un fichier include d'outils pour les objets graphiques. Des fonctions pour les créer et les gérer et on commencera avec les labels.