Analyse de la struture du code d'un indicateur

Nous allons analyser ici la structure d'un indicateur simple pour se familiariser avec les différents éléments composants un indicateur. L'indicateur présenté est le MACD.

Cet indicateur étant fourni par défaut par MetaTrader 4 il n'est pas nécessaire de le coder mais comme c'est un indicateur connu et simple c'est un bon exemple.

Analyse du code

Entête

Le code démarre par un entête rappelant le nom du programme et la propriété du code.

Analyse de la struture du code d'un EA

Directives de précompilation

Nous retrouvons tout d'abord les directives relatives à la propriété du code, identiques à celles de l'entête :

Voir notre avis sur le test du broker AvaTrade qui propose la plateforme MT4

#property copyright "Copyright © 2004, MetaQuotes Software Corp."

#property link http://www.metaquotes.net/

Puis les directives concernant les propriétés de l'indicateur :

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 Silver

#property indicator_color2 Red

#property indicator_width1 2

Ces propriétés indiquent:

  • que l'indicateur sera affiché dans une fenêtre séparée (donc pas directement sur le graphe des prix),
  • qu'il y aura 2 types de séries valeurs différentes à afficher
  • que la couleur associé à la première série de valeurs sera argent et rouge pour la deuxième série
  • que l'épaisseur du trait pour la première série sera 2 au lieu de la valeur par d´faut 1

Définition des paramètres d'entrée

Les paramètres d'entrées sont définis tout de suite après les directives de précompilation en tant que variables globales.

extern int FastEMA=12;

extern int SlowEMA=26;

extern int SignalSMA=9;

Chaque paramètre à une valeur par défaut. Celle-ci peut être modifiée par l'utilisateur et dans ce cas l'indicateur utilisera la valeur définie par l'utilisateur.

Définition des variables globales

double MacdBuffer[];

double SignalBuffer[];

Nous avons ici les 2 tableaux qui contiendront les 2 séries de valeurs.

Fonction init(): initialisation de l'indicateur

La fonction init() contient les éléments d'initialisation de l'indicateur qui n'on pas été déjà définis au niveau des directives de précompilation.

SetIndexStyle(0,DRAW_HISTOGRAM);

La première série de donnée sera représentée sous la forme d'un histogramme

SetIndexStyle(1,DRAW_LINE);

La deuxième série de donnée sera représentée sous la forme d'une ligne

SetIndexDrawBegin(1,SignalSMA);

La deuxième série de donnée sera affichée seulement après l'indice défini par SignalSMA

IndicatorDigits(Digits+1);

La précision d'affichage des données aura le même nombre de digits que le prix plus 1.

SetIndexBuffer(0,MacdBuffer);

MacdBuffer contiendra la première série de données

SetIndexBuffer(1,SignalBuffer);

SignalBuffer contiendra la deuxième série de données

IndicatorShortName("MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")");

Nom et paramètres de l'indicateur qui seront affichés en haut et à gauche de la fenêtre de l'indicateur

SetIndexLabel(0,"MACD");

La première série aura un label "MACD" à l'affichage

SetIndexLabel(1,"Signal");

La deuxième série 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 passées si leur valeur n'a pas été calculée auparavant car au démarrage de la plateforme il existe de nombreuses barres dans le passé et en général l'utilisateur veut aussi connaitre les valeurs de l'indicateur pour ces barres dans le passé.

Néanmoins 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 procédé sur la gestion des barres passées et ensuite calculer l'indicateur sur les barres qui en ont besoin.

int counted_bars=IndicatorCounted();

Ceci fourni le nombre de barres déjà traitées par cet indicateur et qu'il ne faut donc pas retraiter

if(counted_bars>0) counted_bars--;

Si des barres on déjà été traitées on va recalculer pour la dernière barre

limit=Bars-counted_bars;

Total des barres non encore traitées

for(int i=0; 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 traitées de la première série (la barre la plus récente a le numéro 0)

for(i=0; i

SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);

On calcule la valeur de l'indicateur pour toutes les barres non traitées de la deuxième série

Conclusion

Cet indicateur est très simple dans le calcul de l'indicateur lui-même. Il contient cependant plusieurs éléments important qu'il faut maitriser pour coder un indicateur, notamment l'initialisation des propriétés graphiques de l'indicateur et la logique de sélection des barres à traiter.

Plus d'information sur le même thème

Photo of Arnaud Jeulin

Arnaud Jeulin Responsable de la publication, Trader

Après un diplôme d'ingénieur, Arnaud a commencé une carrière de développeur. Il a travaillé avec des traders et des services de back office pour mettre en place des prototypes et des outils de trading. Il a ensuite créé sa propre entreprise en 2003.

Il a été responsable du webmarketing pour la Banque en ligne Suisse Synthesis, depuis rachetée par Saxo Bank. Il a aussi fait des audits pour différents brokers et participé à plusieurs salons professionnels pour les courtiers à Londres, Paris et Chypre.

Depuis 21 ans Arnaud a approfondi sa connaissance des brokers et des marchés, il utilise son expérience pour améliorer Mataf afin d'éviter d'orienter les visiteurs vers des brokers malhonnêtes ou des stratégies de trading dangeureuses.

Vous pouvez le joindre via les réseaux sociaux suivants ou par email :

.
  Se connecter