Aller au contenu

Comment gérer les événements de barre

Les événements de barre sont essentiels au cycle de vie de tout cBot. Une gestion appropriée de ces événements est cruciale pour gérer la façon dont vos cBots réagissent aux nouvelles conditions du marché. Dans cet article et la vidéo correspondante, nous allons démontrer les principaux types d'événements de barre et discuter des gestionnaires de ces événements exposés par l'API cTrader.

  • Barre - fait référence à différents types d'objets qui sont dessinés séquentiellement sur le graphique de trading par cTrader. Il peut s'agir de chandeliers japonais, de briques Renko, de barres d'écart ou même de bougies Heiken Ashi.

Gérer l'événement BarOpened

Les événements de barre se produisent lorsqu'une nouvelle barre commence à se tracer sur le graphique de trading lié à un cBot. L'événement BarOpened se produit pour la nouvelle barre qui vient de commencer à être dessinée sur le graphique.

La gestion de cet événement se fait via la méthode OnBar(), qui est une méthode héritée de la classe de base Robot. Nous allons maintenant créer un cBot qui gère l'événement BarOpened dans le cadre de notre stratégie d'analyse du sentiment du marché. Nous allons supprimer les méthodes OnStart() et OnStop() du modèle et remplacer le gestionnaire OnTick() par le gestionnaire OnBar().

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
protected override void OnBar()
{
    var previousBar = Bars[Bars.Count - 2];
    var priceDifference = ((Bars.LastBar.Open - previousBar.Open) / previousBar.Open) * 100;
    if (priceDifference > 1)
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
    }
    else if (priceDifference < -1)
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000);
    }
    else 
    {
        foreach (var position in Positions) 
        {
            position.Close();
        }
    }
}

Le cBot est censé être lancé sur des graphiques avec la période D1 (quotidienne). À chaque barre, il compare la différence de prix d'ouverture avec le prix d'ouverture de la barre précédente et place un nouvel ordre dans une direction appropriée. Si la différence de prix est insignifiante, le bot ferme plutôt toutes les positions actuellement ouvertes.

Si nous effectuons un backtest de ce bot simple, les résultats semblent encourageants.

Gérer l'événement BarClosed

Lorsqu'une nouvelle barre s'ouvre, elle ne contient en fait aucune donnée de prix en dehors de son prix d'ouverture. Dans de nombreux cas, vous pouvez souhaiter que votre cBot accède aux données de la barre précédente pour assurer une exécution fluide de la stratégie. C'est pourquoi l'événement BarClosed se produit pour la barre qui vient de se fermer (celle qui précède immédiatement la nouvelle barre) et vous permet d'utiliser facilement ses données de prix et de volume. Lorsque l'événement BarClosed est déclenché, la barre nouvellement ouverte est entièrement omise de la collection Bars

Pour gérer l'événement BarClosed, l'API expose la méthode OnBarClosed.

Remarque

Dans l'exemple précédent, nous avons utilisé la propriété Bars.LastBar.Open pour obtenir le cours d'ouverture de la barre nouvellement ouverte. Si nous utilisions la même propriété dans la méthode OnBarClosed(), nous obtiendrions le cours d'ouverture de la barre qui vient de se fermer.

Nous allons créer un cBot simple qui utilise le gestionnaire OnBarClosed() comme suit.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBarClosed()
{
    var lowCloseDifference = ((Bars.LastBar.Close - Bars.LastBar.Low) / Bars.LastBar.Close) * 100;
    if (lowCloseDifference > 0.5)
    {
        foreach (var position in Positions)
        {
            position.Close();
        }
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, null, 50);

    }
}

Le cBot détecte un motif haussier (hammer) en évaluant la longueur de la mèche inférieure d'une bougie. Si un motif hammer est détecté, toutes les positions précédemment ouvertes sont fermées et un nouvel ordre d'achat est placé avec un stop loss de 50 pips.

Si nous effectuons un backtest du bot, nous obtiendrons des résultats corrects.

Ajouter des gestionnaires d'événements personnalisés

Lors de la gestion des événements BarOpened et BarClosed, vous pouvez également utiliser une syntaxe légèrement différente en attribuant ces événements à des gestionnaires personnalisés. Alors que OnBar() et OnBarClosed() ne sont déclenchés qu'une seule fois, vous pouvez attribuer autant de gestionnaires personnalisés que vous le souhaitez, ce qui permet d'ajouter une logique complexe.

Remarque

Les gestionnaires d'événements personnalisés doivent être ajoutés dans la méthode OnStart(). Les gestionnaires personnalisés doivent également accepter un argument des types BarOpenedEventArgs (pour l'événement BarOpened) ou BarClosedEventArgs (pour l'événement BarClosed).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnStart() 
{
    Bars.BarClosed += BarClosedHandler;
    Bars.BarClosed += AnotherClosedHandler;
    Bars.BarOpened += BarOpenedHandler;
}

void BarClosedHandler(BarClosedEventArgs args) {}
void AnotherClosedHandler(BarClosedEventArgs args) {}
void BarOpenedHandler(BarOpenedEventArgs args) {}

Nous allons créer un autre cBot qui utilise deux gestionnaires personnalisés pour l'événement BarOpened afin de réagir à d'éventuels retournements haussiers et baissiers.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected override void OnStart() 
{
    Bars.BarOpened += BullishReversal;
    Bars.BarOpened += BearishReversal;

}

private void BullishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open > Bars.Last(1).Close && Bars.LastBar.Open > Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, 10, 50);
    }
}

private void BearishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open < Bars.Last(1).Close && Bars.LastBar.Open < Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000, null, 10, 50);
    }
}

Le cBot vérifie si le cours d'ouverture de la barre nouvellement ouverte est supérieur aux cours de clôture des deux barres précédentes. Si c'est le cas, un ordre d'achat est placé. Si le cours d'ouverture est inférieur aux cours de clôture des deux barres précédentes, un ordre de vente est placé. L'utilisation de deux gestionnaires d'événements distincts nous permet de diviser notre logique de trading en composants plus petits que nous pouvons facilement modifier ultérieurement si nécessaire.

Les résultats du backtesting sur une période J1 sont également positifs.

Résumé

En apprenant à gérer correctement les événements de barre, vous pouvez faire en sorte que vos cBots fassent exactement ce que vous voulez qu'ils fassent et que vous voulez qu'ils le fassent.