Pourquoi "If IsFirstBar"
Lors de l'écriture d'un indicateur on recommande de commencer la partie CALCULATION par :
if isfirstbar() then begin
CalculateAtEveryTick(false) ;
SetYscaleFormat(GetPriceFormat());
end
L'instruction CalculateAtEveryTick(false) permet d'éviter que le calcul de l'indicateur se fasse à chaque tick ce qui peut représenter plusieurs dizaines de calculs par seconde, de quoi faire "exploser" les capacités de votre ordinateur.
Ainsi le calcul ne se fera qu'au dernier tick de la bougie, donc une seule fois par bougie.
MAIS on vous conseille aussi (page 47 et suivantes du manuel Express) d'y mettre les calculs de moyenne mobile.
if isfirstbar() then begin
CalculateAtEveryTick(false) ;
SetYscaleFormat(GetPriceFormat());
MovingAverage(close, MMobile, 10);
end
Pourquoi ?
Il faut comprendre que si vous mettez le calcul de la MM en dehors de la boucle IsFirstBar, à chaque fin de bougie l'indicateur calcule la MM pour la première bougie, puis la 2eme, ... , puis la dernière.
Ceci revient à recalculer l'ensemble des positions de la MM à chaque bougie du graphe. Il est absurde de faire X fois un même calcul.
Il est préférable de ne faire ce calcul de MM qu'une seule fois, d'où l'intégration de ce calcul dans la boucle de IsFirstBar. On ne fera le calcul de la MM qu'à la première barre, une fois pour toute.

%20(1).png)
Il existe une troisième solution c'est d'utiliser une méthode de calcul différente de la moyenne mobile qui est plus rapide.
If isfirstbar() then
Begin
CalculateAtEveryTick(false);
SetYscaleFormat(GetPriceFormat());
end
CM = (Close+H+L) /3;
if CurrentBarIndex() <= 10 then MMobile = CM;
if CurrentBarIndex() > 10 then
begin
MMobile = MMobile[1] + (CM - MMobile[1]) /10;
End