Ce fil est un bel exemple de ce que le forum savait produire : une demande le matin, un indicateur fonctionnel l'après-midi, une version améliorée le lendemain. Merci encore à madjes.
Le besoin, lui, n'a pas vieilli — afficher gros et lisible l'instrument et l'unité de temps est indispensable dès qu'on enregistre une vidéo, qu'on fait un live ou qu'on jongle entre plusieurs graphiques. Comme les pièces jointes de 2010 ne sont pas toujours accessibles et que MetaQuotes ne délivre plus de nouvelles licences MT4, voici une version autonome à jour, avec les explications qui vont avec.
1. La version MQL4, complète et commentée
Code : Tout sélectionner
//+------------------------------------------------------------------+
//| Info instrument + unite de temps |
//| Affichage en gros, coin parametrable |
//+------------------------------------------------------------------+
#property indicator_chart_window
extern string Police = "Arial Black";
extern int TaillePolice = 24;
extern color Couleur = clrGray;
extern int Coin = 0; // 0=haut gauche 1=haut droit
// 2=bas gauche 3=bas droit
extern int DecalageX = 12;
extern int DecalageY = 20;
extern bool AfficherSpread = true;
string prefixe = "InfoChart_";
//+------------------------------------------------------------------+
string LibelleUT(int periode)
{
switch(periode)
{
case PERIOD_M1: return("M1");
case PERIOD_M5: return("M5");
case PERIOD_M15: return("M15");
case PERIOD_M30: return("M30");
case PERIOD_H1: return("H1");
case PERIOD_H4: return("H4");
case PERIOD_D1: return("Daily");
case PERIOD_W1: return("Weekly");
case PERIOD_MN1: return("Monthly");
}
return("UT " + IntegerToString(periode));
}
//+------------------------------------------------------------------+
void PoserTexte(string nom, string texte, int taille, int decalY)
{
if(ObjectFind(nom) < 0)
ObjectCreate(nom, OBJ_LABEL, 0, 0, 0);
ObjectSet(nom, OBJPROP_CORNER, Coin);
ObjectSet(nom, OBJPROP_XDISTANCE, DecalageX);
ObjectSet(nom, OBJPROP_YDISTANCE, decalY);
ObjectSet(nom, OBJPROP_BACK, true);
ObjectSet(nom, OBJPROP_SELECTABLE, false);
ObjectSetText(nom, texte, taille, Police, Couleur);
}
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
// menage indispensable : on retire nos objets et rien d'autre
for(int i = ObjectsTotal() - 1; i >= 0; i--)
{
string nom = ObjectName(i);
if(StringFind(nom, prefixe) == 0) ObjectDelete(nom);
}
return(0);
}
//+------------------------------------------------------------------+
int start()
{
string ligne1 = Symbol() + " " + LibelleUT(Period());
PoserTexte(prefixe + "L1", ligne1, TaillePolice, DecalageY);
if(AfficherSpread)
{
double spread = (Ask - Bid) / (Point * (Digits == 3 || Digits == 5 ? 10 : 1));
string ligne2 = "spread " + DoubleToStr(spread, 1) + " pips";
PoserTexte(prefixe + "L2", ligne2, TaillePolice / 2,
DecalageY + TaillePolice + 10);
}
return(0);
}
À déposer dans le dossier MQL4/Indicators, puis compiler.
2. Les cinq points qui font la différence entre un indicateur qui marche et un qui embête
- Le nettoyage dans deinit(). C'est l'erreur la plus fréquente sur ce type d'indicateur : sans cette boucle, les étiquettes restent sur le graphique après avoir retiré l'indicateur, et on se retrouve à les supprimer à la main. Le préfixe sur le nom des objets sert précisément à ne supprimer que les siens et à ne pas effacer les tracés de l'utilisateur.
- OBJPROP_BACK à true et OBJPROP_SELECTABLE à false. Le premier place le texte derrière les chandeliers, le second évite de le sélectionner ou de le déplacer par un clic malencontreux pendant un enregistrement.
- OBJ_LABEL et non OBJ_TEXT. Un label est positionné en pixels par rapport à un coin de la fenêtre : il reste en place quand on fait défiler ou qu'on zoome. Un objet texte est ancré à une date et un prix, donc il disparaît de l'écran dès qu'on se déplace. C'est la différence entre les deux versions qu'on croise sur les forums.
- Le paramètre Coin. Utile en pratique : le coin haut gauche est souvent occupé par le nom des indicateurs déjà chargés. Pouvoir basculer en bas à gauche évite la superposition.
- Le calcul du spread. Attention au piège classique : sur un courtier à 5 décimales, un "point" vaut un dixième de pip. Sans la correction, l'affichage indique 15 au lieu de 1,5.
3. Les adaptations utiles selon l'usage
- Pour du live ou de la vidéo, une taille de 28 à 32 et une couleur gris moyen fonctionnent bien : lisible sur l'enregistrement, sans écraser le graphique. Le gris est préférable au blanc ou au noir, il reste lisible sur les deux thèmes.
- Pour distinguer démo et réel, on peut ajouter le type de compte, ce qui évite l'incident classique du trade passé sur le mauvais compte :
- [b)] Pour afficher l'heure du serveur[/b], utile quand on travaille sur des sessions : TimeToStr(TimeCurrent(), TIME_MINUTES). Rappel au passage — l'heure du serveur n'est pas la vôtre, elle correspond au fuseau du courtier, souvent GMT+2 ou +3.
4. Pour MT5
L'écosystème ayant basculé, voici les différences à connaître si vous portez ce code :
- start() devient OnCalculate, init() devient OnInit, deinit() devient OnDeinit.
- Les fonctions ObjectSet et ObjectSetText sont remplacées par ObjectSetInteger et ObjectSetString, avec le nom du graphique en premier paramètre.
- OBJPROP_CORNER prend les constantes CORNER_LEFT_UPPER, CORNER_RIGHT_UPPER, etc., au lieu d'entiers.
- Le libellé de l'unité de temps s'obtient directement avec EnumToString(_Period), ce qui rend la fonction LibelleUT inutile.
- Il faut appeler ChartRedraw() après avoir modifié les objets, sinon l'affichage ne se rafraîchit pas toujours.
Et une nuance qui n'existait pas en 2010 : sur MT5, le nom du symbole peut porter un suffixe propre au courtier (NAS100.p, EURUSDm, etc.). Symbol() le renvoie tel quel, ce qui est en fait une bonne chose pour ce cas d'usage — on veut voir exactement l'instrument affiché.
5. Un mot sur le besoin lui-même
Ce type d'indicateur passe pour un gadget, il ne l'est pas. Le trade passé sur le mauvais graphique ou la mauvaise unité de temps est une erreur banale, et elle coûte plus cher que la plupart des erreurs d'analyse. Trois affichages gros et visibles — instrument, unité de temps, type de compte — suppriment une catégorie entière d'incidents pour dix lignes de code.
C'est aussi vrai en dehors de MetaTrader : sur n'importe quelle plateforme, prendre trente secondes pour rendre ces informations impossibles à manquer est un des meilleurs investissements de temps qu'on puisse faire sur son espace de travail.
Si quelqu'un veut la version MT5 complète plutôt que la liste des différences, je peux la poster.