Vai al contenuto

Come gestire gli eventi delle barre

Gli eventi delle barre sono essenziali per il ciclo di vita di qualsiasi cBot. Gestire correttamente questi eventi è fondamentale per controllare come i tuoi cBot reagiscono alle nuove condizioni di mercato. In questo articolo e nel video corrispondente, dimostreremo i tipi principali di eventi delle barre e discuteremo i gestori per questi eventi esposti dall'API cTrader.

  • Barra - si riferisce a diversi tipi di oggetti che vengono disegnati in sequenza sul grafico di trading da cTrader. Potrebbero essere candele giapponesi, mattoni Renko, barre a intervallo o persino candele Heikin Ashi.

Gestire l'evento BarOpened

Gli eventi delle barre si verificano quando una nuova barra inizia a essere tracciata sul grafico di trading collegato a un cBot. L'evento BarOpened si verifica per la nuova barra che ha appena iniziato a essere disegnata sul grafico.

La gestione di questo evento avviene tramite il metodo OnBar(), che è un metodo ereditato dalla classe base Robot. Creeremo ora un cBot che gestisce l'evento BarOpened come parte della nostra strategia per analizzare il sentiment di mercato. Elimineremo i metodi OnStart() e OnStop() dal modello e sostituiremo il gestore OnTick() con il gestore 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();
        }
    }
}

Il cBot dovrebbe essere avviato su grafici con il periodo D1 (giornaliero). Su ogni barra, confronta la differenza del prezzo di apertura con il prezzo di apertura della barra precedente e piazza un nuovo ordine in una direzione adeguata. Se la differenza di prezzo è insignificante, il bot chiude invece tutte le posizioni attualmente aperte.

Se eseguiamo un backtest di questo semplice bot, i risultati sembrano essere incoraggianti.

Gestire l'evento BarClosed

Quando si apre una nuova barra, essa manca effettivamente di qualsiasi dato di prezzo oltre al suo prezzo di apertura. In molti casi, potresti volere che il tuo cBot acceda ai dati della barra precedente per garantire un'esecuzione fluida della strategia. Questo è il motivo per cui l'evento BarClosed si verifica per la barra che si è appena chiusa (quella immediatamente precedente alla nuova barra) e ti consente di utilizzare facilmente i suoi dati di prezzo e volume. Quando viene attivato l'evento BarClosed, la barra appena aperta viene completamente omessa dalla raccolta Bars

Per gestire l'evento BarClosed, l'API espone il metodo OnBarClosed.

Nota

Nell'esempio precedente abbiamo utilizzato la proprietà Bars.LastBar.Open per ottenere il prezzo di apertura della barra appena aperta. Se utilizzassimo la stessa proprietà nel metodo OnBarClosed(), otterremmo il prezzo di apertura della barra che si è appena chiusa.

Creeremo un semplice cBot che utilizza il gestore OnBarClosed() come segue.

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

    }
}

Il cBot rileva un pattern rialzista (hammer) valutando la lunghezza dello stoppino inferiore di una candela. Se viene rilevato un pattern hammer, tutte le posizioni precedentemente aperte vengono chiuse e viene piazzato un nuovo ordine di acquisto con uno stop loss di 50 pip.

Se eseguiamo il backtest del bot, otterremo risultati discreti.

Aggiungere gestori di eventi personalizzati

Quando si gestiscono gli eventi BarOpened e BarClosed, è possibile utilizzare anche una sintassi leggermente diversa assegnando questi eventi a gestori personalizzati. Mentre OnBar() e OnBarClosed() vengono attivati una sola volta, puoi assegnare tutti i gestori personalizzati che desideri, il che consente di aggiungere una logica complessa.

Nota

I gestori di eventi personalizzati devono essere aggiunti nel metodo OnStart(). I gestori personalizzati devono inoltre accettare un argomento dei tipi BarOpenedEventArgs (per l'evento BarOpened) o BarClosedEventArgs (per l'evento 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) {}

Creeremo un altro cBot che utilizza due gestori personalizzati per l'evento BarOpened per reagire a possibili inversioni rialziste e ribassiste.

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

Il cBot verifica se il prezzo di apertura della barra appena aperta è superiore ai prezzi di chiusura delle due barre precedenti. In questo caso viene piazzato un ordine di acquisto. Se il prezzo di apertura è inferiore ai prezzi di chiusura delle due barre precedenti, viene piazzato un ordine di vendita. L'utilizzo di due gestori di eventi separati ci consente di dividere la nostra logica di trading in componenti più piccoli che possiamo facilmente modificare in seguito, se necessario.

I risultati del backtesting su un periodo di tempo G1 sono anch'essi positivi.

Imparando a gestire correttamente gli eventi delle barre, puoi far sì che i tuoi cBot facciano esattamente ciò che vuoi che facciano e che lo facciano quando vuoi tu.