Barre de clôture/barre courante
Contents
Problème
Comme vous l'avez probablement remarqué, la plupart des signaux appliqués à une unité de temps donnée vérifient les conditions du marché et n'affichent les alertes qu'une fois une barre complètement fermée. Par exemple, lorsque le signal est appliqué à des barres 1 heure, le signal qui s'affiche sur la barre 15:00 s'affichera à 16:00, soit uniquement une fois la barre 15:00 fermée. Cela donne l'impression qu'il y a un retard d'une heure dans le signal, et pourrait donc ne pas s'avérer très pratique.
Est-ce le cas ? Oui, probablement. Mais voyons ce qui se passe véritablement lorsque nous testons les conditions de marché sur une barre courante, qui est modifiée à chaque apparition d'un nouveau cours (tick). Créons un indicateur simple qui affiche une flèche sur les barres pour lesquelles le cours de clôture est supérieur à celui de la barre précédente.
function Init()
indicator:name("Show bars where current close is higher than previous");
indicator:description("");
indicator:requiredSource(core.Bar);
indicator:type(core.Indicator);
indicator.parameters:addColor("clr", "Label Color", "", core.COLOR_LABEL);
end
local source;
local mark;
local first;
function Prepare()
source = instance.source;
local name = profile:id();
instance:name(name);
first = source:first() + 1;
mark = instance:createTextOutput ("Mark", "Mark", "Wingdings", 10, core.H_Center, core.V_Top, instance.parameters.clr, 0);
end
function Update(period, mode)
if period > first then
if source.close[period] > source.close[period - 1] then
mark:set(period, source.close[period], "\226");
end
end
end
Appliquons ensuite l'indicateur sur un graphique. Je vous conseille de choisir 1 minute comme unité de temps ; vous obtiendrez en effet en quelques minutes à peine les résultats que je souhaite vous montrer. Lorsque l'indicateur vient d'être appliqué, tout semble correct. Les barres dont le cours de clôture est plus élevé sont marquées d'une flèche. Mais laissons l'indicateur pendant quelques minutes. Oups... D'étranges signaux erronés s'affichent. Pourquoi ? À dire vrai, il n'y a rien de bien compliqué là-dedans. L'indicateur est appelé à chaque fois qu'un nouveau cours arrive. Au moment de l'appel, le cours le plus récent s'affiche en tant que cours de clôture de la barre précédente... Ainsi, même si en définitive la barre ne correspond pas à la condition du marché, il est possible que ce soit le cas au milieu de l'unité de temps. Examinons l'instantané :
(Cliquez sur l'image pour l'afficher en plein écran.)
Vous pouvez voir que les signaux erronés commencent à apparaître juste après avoir décidé de laisser l'indicateur appliqué sur les données réelles.
Alors, voyons. Lorsque l'indicateur est appliqué sur des données historiques, la fonction de mise à jour (update) n'est appelée qu'une seule fois, et obtient la version finale de la barre. Mais pour les barres utilisant des données réelles, l'indicateur est appelé à chaque arrivée d'un nouveau tick. Si vous prenez une barre qui n'est pas encore terminée (regardez le dernier signal erroné sur l'instantané ci-dessus), vous pourrez constater que, parfois, elle correspond effectivement à la condition du signal.
Aussi, en bref, pour presque tous les signaux et pour de nombreux indicateurs, l'indicateur peut produire des « parasites ». En d'autres termes, il peut produire un signal erroné, même si ce signal ne s'affiche pas dans la version finale de la barre. Ces signaux parasites peuvent vous amener à prendre des décisions erronées et la meilleure chose à faire est donc d'attendre la fin de la barre pour pouvoir vérifier à coup sûr si la condition du signal a été ou non remplie pendant la barre.
Comment gérer cette situation ?
Dans les indicateurs
Le meilleur moyen consiste à ne traiter la barre que si celle-ci est fermée. Pour vous assurer que la barre a bien été fermée, vous pouvez vérifier le « numéro de série » de la barre et ne traiter la dernière barre d'historique actif que si elle est complètement terminée (il ne s'agit alors plus de la dernière barre). Modifions l'indicateur ci-dessus en conséquence.
function Init()
indicator:name("Show bars where current close is higher than previous");
indicator:description("");
indicator:requiredSource(core.Bar);
indicator:type(core.Indicator);
indicator.parameters:addColor("clr", "Label Color", "", core.COLOR_LABEL);
end
local source;
local mark;
local first;
function Prepare()
source = instance.source;
local name = profile:id();
instance:name(name);
first = source:first() + 1;
mark = instance:createTextOutput ("Mark", "Mark", "Wingdings", 10, core.H_Center, core.V_Top, instance.parameters.clr, 0);
end
local serial = nil;
function Update(period, mode)
if period > first then
if source:isAlive() and -- if the history we applied to is alive
period == source:size() - 1 then -- and this is the last value (live bar)
if serial ~= source:serial(source:size() - 1) then -- and the last bar is a new bar
serial = source:serial(source:size() - 1); -- remember a new last bar
period = period - 1; -- and force to process the previous (e.g. the most
-- recently finished bar
else
return; -- the bar is not changed, so
-- just do not process it
end
end
if source.close[period] > source.close[period - 1] then
mark:set(period, source.close[period], "\226");
end
end
end
Voilà, il n'y a plus de parasites !
Dans les stratégies
Si vous utilisez la gestion des souscriptions via helper.lua, vous n'avez rien à faire. Le helper ne vous avertit qu'une fois une barre complètement fermée.
Si vous implémentez la souscription vous-même, allez dans le même sens que pour les indicateurs : ne vérifiez les conditions de marché qu'une fois que la nouvelle barre s'affiche dans l'unité de temps souscrite.
Cet article dans d'autres langues
Language: | English • español • français • русский • 中文 • 中文(繁體) |
---|