Barre de clôture/barre courante

From FxCodeBaseWiki
Jump to: navigation, search

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é :

Closeandlivebarfr.png

(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 • русский • 中文 • 中文(繁體)‎