Zum Inhalt

Wie man Bar-Ereignisse handhabt

Bar-Ereignisse sind für den Lebenszyklus jedes cBots von wesentlicher Bedeutung. Die ordnungsgemäße Handhabung dieser Ereignisse ist entscheidend für die Verwaltung, wie Ihre cBots auf neue Marktbedingungen reagieren. In diesem Artikel und dem dazugehörigen Video zeigen wir die wichtigsten Arten von Bar-Ereignissen und besprechen die Handler für diese Ereignisse, die von der cTrader API bereitgestellt werden.

  • Bar - bezieht sich auf verschiedene Arten von Objekten, die sequenziell auf dem Handelschart von cTrader gezeichnet werden. Es können Candlesticks, Renko-Steine, Range-Bars oder sogar Heiken Ashi-Kerzen sein.

Behandeln Sie das BarOpened-Ereignis

Bar-Ereignisse treten auf, wenn eine neue Bar auf dem mit einem cBot verknüpften Handelschart gezeichnet wird. Das BarOpened-Ereignis tritt für die neue Bar auf, die gerade auf dem Chart gezeichnet wird.

Die Behandlung dieses Ereignisses erfolgt über die OnBar()-Methode, die eine geerbte Methode aus der Basis-Robot-Klasse ist. Wir werden jetzt einen cBot erstellen, der das BarOpened-Ereignis als Teil unserer Strategie zur Analyse der Marktstimmung behandelt. Wir löschen die OnStart()- und OnStop()-Methoden aus der Vorlage und ersetzen den OnTick()-Handler durch den OnBar()-Handler.

 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();
        }
    }
}

Der cBot soll auf Charts mit dem D1 (täglich)-Zeitrahmen gestartet werden. Bei jeder Bar vergleicht er die Eröffnungspreisdifferenz mit dem Eröffnungspreis der vorherigen Bar und platziert eine neue Order in eine geeignete Richtung. Wenn die Preisdifferenz unbedeutend ist, schließt der Bot stattdessen alle aktuell offenen Positionen.

Wenn wir einen Backtest dieses einfachen Bots durchführen, scheinen die Ergebnisse ermutigend zu sein.

Behandeln Sie das BarClosed-Ereignis

Wenn eine neue Bar geöffnet wird, fehlen ihr im Wesentlichen alle Preisdaten außer ihrem Eröffnungspreis. In vielen Fällen möchten Sie möglicherweise, dass Ihr cBot auf Daten der vorherigen Bar zugreift, um eine reibungslose Strategieausführung zu gewährleisten. Aus diesem Grund tritt das BarClosed-Ereignis für die Bar auf, die gerade geschlossen wurde (die unmittelbar vor der neuen Bar), und ermöglicht es Ihnen, ihre Preis- und Volumendaten einfach zu verwenden. Wenn das BarClosed-Ereignis ausgelöst wird, wird die neu geöffnete Bar vollständig aus der Bars-Sammlung ausgelassen

Um das BarClosed-Ereignis zu behandeln, stellt die API die OnBarClosed-Methode bereit.

Hinweis

Im vorherigen Beispiel haben wir die Bars.LastBar.Open-Eigenschaft verwendet, um den Eröffnungspreis der neu geöffneten Bar zu erhalten. Wenn wir dieselbe Eigenschaft in der OnBarClosed()-Methode verwenden würden, würden wir den Eröffnungspreis der Bar erhalten, die gerade geschlossen wurde.

Wir werden einen einfachen cBot erstellen, der den OnBarClosed()-Handler wie folgt verwendet.

 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);

    }
}

Der cBot erkennt ein bullisches (Hammer-)Muster, indem er die Länge des unteren Dochts einer Kerze bewertet. Wenn ein Hammer-Muster erkannt wird, werden alle zuvor offenen Positionen geschlossen und eine neue Kauforder mit einem 50-Pip-Stop-Loss platziert.

Wenn wir den Bot einem Backtest unterziehen, erhalten wir anständige Ergebnisse.

Fügen Sie benutzerdefinierte Event-Handler hinzu

Bei der Behandlung der BarOpened- und BarClosed-Ereignisse können Sie auch eine etwas andere Syntax verwenden, indem Sie diesen Ereignissen benutzerdefinierte Handler zuweisen. Während OnBar() und OnBarClosed() nur einmal ausgelöst werden, können Sie so viele benutzerdefinierte Handler zuweisen, wie Sie möchten, was das Hinzufügen komplexer Logik ermöglicht.

Hinweis

Benutzerdefinierte Event-Handler müssen in der OnStart()-Methode hinzugefügt werden. Benutzerdefinierte Handler müssen auch ein Argument der Typen BarOpenedEventArgs (für das BarOpened-Ereignis) oder BarClosedEventArgs (für das BarClosed-Ereignis) akzeptieren.

 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) {}

Wir werden einen weiteren cBot erstellen, der zwei benutzerdefinierte Handler für das BarOpened-Ereignis verwendet, um auf mögliche bullische und bärische Umkehrungen zu reagieren.

 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);
    }
}

Der cBot prüft, ob der Eröffnungskurs des neu eröffneten Balkens höher ist als die Schlusskurse der beiden vorangegangenen Balken. Wenn dies der Fall ist, wird eine Kauforder übermittelt. Wenn der Eröffnungskurs niedriger ist als die Schlusskurse der beiden vorangegangenen Balken, wird eine Verkaufsorder übermittelt. Die Verwendung von zwei separaten Event-Handlern ermöglicht es uns, unsere Handelslogik in kleinere Komponenten zu unterteilen, die wir später bei Bedarf leicht ändern können.

Die Ergebnisse des Backtestings auf einem T1-Zeitrahmen sind ebenfalls positiv.

Zusammenfassung

Indem Sie lernen, wie Sie Balken-Events richtig handhaben, können Sie Ihre cBots genau das tun lassen, was Sie von ihnen erwarten und wann Sie es von ihnen erwarten.