Beaucoup d'entre vous ont déjà été confrontés aux indicateurs qui repeignent, pour certain c'est voulu mais pour la plupart c'est un bug et ça fausse les signaux.
Pire, ces indicateurs sont inexploitables dans un EA.
Comment reconnaitre un indicateur qui repeint :
- visuellement, lorsque vous affichez un indicateur sur un graphique en train de tourner (soit en forward soit en backtest), les informations affichées juste avant l'apparition d'une nouvelle barre devraient être identiques une fois que la nouvelle barre est apparue. Pour être plus précis, si le cours de fermeture de la barre N-1 est égal au cours d'ouverture de la barre courante, la valeur affichée par l'indicateur avant et après l'affichage de la nouvelle barre doit être identique.
Dans tous les cas, seule la barre courante doit varier (puisque le cours actuel de la paire fluctue), l'ensemble des barres précédentes ne doivent jamais subir d'altération.
- d'un point de vue du codage c'est très simple, le code correct pour un indicateur est le suivant (Cf. http://docs.mql4.com/customind/IndicatorCounted - l'exemple donné est correct bien que manque un peu de rigueur) :
Pire, ces indicateurs sont inexploitables dans un EA.
Comment reconnaitre un indicateur qui repeint :
- visuellement, lorsque vous affichez un indicateur sur un graphique en train de tourner (soit en forward soit en backtest), les informations affichées juste avant l'apparition d'une nouvelle barre devraient être identiques une fois que la nouvelle barre est apparue. Pour être plus précis, si le cours de fermeture de la barre N-1 est égal au cours d'ouverture de la barre courante, la valeur affichée par l'indicateur avant et après l'affichage de la nouvelle barre doit être identique.
Dans tous les cas, seule la barre courante doit varier (puisque le cours actuel de la paire fluctue), l'ensemble des barres précédentes ne doivent jamais subir d'altération.
- d'un point de vue du codage c'est très simple, le code correct pour un indicateur est le suivant (Cf. http://docs.mql4.com/customind/IndicatorCounted - l'exemple donné est correct bien que manque un peu de rigueur) :
Code
int start()
{
int limit;
int counted_bars=IndicatorCounted(); // nombre de barres déjà représentées
if(counted_bars<0) return(-1); // le nombre de barres déjà dessinées ne peut pas être inférieur à 0
if(counted_bars>0) counted_bars--; // la dernière barre - la barre courante - doit toujours être recalculée
limit=Bars-counted_bars; // le nombre de barre à calculer est le nombre totale de barres contenues dans l'historique du graphique moins le nombre de barres déjà dessinées
// boucle principale
for(int i=limit; i>=0; i--)
{
//---- ma_shift set to 0 because SetIndexShift called abowe
ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
}
//---- done
return(0);
}