Vai al contenuto

Eventi delle barre

Gli sviluppatori di algoritmi spesso devono fare riferimento agli eventi delle barre per eseguire strategie di trading in tempo in risposta ai prezzi aggiornati. L'API offre gli eventi BarOpened e BarClosed per consentire ai creatori di algoritmi di perfezionare i cBot e cogliere le opportunità in diversi punti del ciclo della barra.

Nota

Gli eventi delle barre possono essere gestiti solo quando si codificano i cBot. Gli indicatori, invece, hanno il metodo Calculate() che viene chiamato ad ogni tick.

In questa guida, spieghiamo la differenza tra i metodi OnBar() e OnBarClosed() e forniamo diversi casi d'uso.

Eventi delle barre in un minuto!

  • Il metodo OnBar() viene attivato ogni volta che una nuova barra viene disegnata sul grafico a cui viene aggiunta un'istanza. Viene chiamato per la barra appena formata.
  • Il gestore di eventi OnBarClosed() viene anch'esso attivato ad ogni nuova barra. Tuttavia, viene chiamato per l'ultima barra chiusa (cioè, precedente a quella corrente).
  • Facendo riferimento all'evento della barra corretto, aumenti l'accuratezza della tua analisi tecnica e selezioni il momento appropriato per le azioni dell'algoritmo.
  • I tipi di grafico supportati per BarOpened e BarClosed sono barre temporali, candele, tick, Renko, intervallo e grafici Heikin Ashi.

Utilizzare il metodo OnBar()

Il verificarsi dell'evento BarOpened dipende dalla pianificazione del simbolo e dalla frequenza dei prezzi in arrivo. Di solito, gli utenti della piattaforma possono regolare il verificarsi di BarClosed con le impostazioni del periodo temporale del grafico.

Nota

Il metodo OnBar() può essere chiamato con la stessa frequenza consentita dalle impostazioni del periodo temporale del grafico. Una volta che una barra si chiude, OnBar() non verrà attivato fino all'arrivo del tick successivo, che logicamente attiva la formazione di una nuova barra.

Il metodo OnBar() viene richiamato simultaneamente con ogni nuova barra disegnata sul grafico a cui è collegato un algoritmo. Di conseguenza, il gestore OnBar() è il luogo perfetto per definire la logica di trading personalizzata che il tuo cBot dovrebbe ripetere regolarmente.

Nell'editor di codice, puoi specificare il gestore OnBar() come segue:

override void OnBar()

Utilizzare il metodo OnBarClosed()

Algo API consente anche di eseguire la logica per l'ultima barra chiusa, che, a seconda della strategia che desideri implementare, può essere un'alternativa più comoda e accurata alla gestione dell'evento BarOpened. All'apertura della barra, la nuova barra appare come una (candela doji) e non contiene dati completi per l'analisi tecnica.

L'evento BarClosed è un alias dell'evento BarOpened, il che significa che si verifica solo nel caso in cui si verifichi l'evento BarOpened. Ad esempio, l'evento BarClosed per l'ultima barra di venerdì si verificherà con la prima barra aperta di lunedì, a condizione che il simbolo non venga scambiato durante il fine settimana.

Nota

Il metodo OnBarClosed() non verrà chiamato fino all'arrivo di un tick per formare la nuova barra.

Il gestore dell'evento OnBarClosed() può essere dichiarato come segue:

override void OnBarClosed()

Nel corpo del metodo OnBarClosed(), puoi determinare quali azioni connesse eseguiranno i tuoi cBot quando viene attivato l'evento BarClosed (ad esempio, eseguire un ordine, delineare un pattern, disegnare elementi visivi di analisi tecnica, ecc.).

Quando vi si accede in questo gestore di eventi, la raccolta Bars non contiene la barra live corrente, mentre altre raccolte (come Positions, Symbols, ecc.) contengono dati effettivi.

I gestori di eventi OnBar() e OnBarClosed() funzionano come previsto nel backtesting e nell'ottimizzazione. Entrambi i metodi possono essere utilizzati su diversi tipi di grafici, inclusi barre temporali, candele giapponesi, tick, Renko, intervallo e grafici Heikin Ashi.

Crea cBot di esempio

Il seguente cBot di esempio piazza un ordine di mercato quando viene aperta ogni terza barra sul grafico EURCHF.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class ThirdBarMarketOrderBot : Robot
    {
        private int barCount;

        protected override void OnStart()
        {
            barCount = 0;
        }

        protected override void OnBar()
        {
            barCount++;

            if (barCount % 3 == 0)
            {
                var symbol = Symbols.GetSymbol("EURCHF");
                ExecuteMarketOrder(TradeType.Buy, symbol, 100);
            }
        }
    }
}

Poiché il cBot è stato avviato su un grafico min1, l'intervallo di tempo approssimativo tra gli ordini di mercato eseguiti è di tre minuti.

Image title

Di seguito è riportato un esempio di cBot con l'indicatore Directional Movement System (DMS) nidificato, che stampa (Uptrend!) se il valore DI+ (linea verde) supera il valore DI- (linea rossa).

Image title

Quando DI- è maggiore di DI+, (Downtrend!) viene stampato nell'evento BarClosed.

Image title

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class OnBarClosedTest : Robot
    {

        private DirectionalMovementSystem _dms;

        [Parameter("DMS Period", DefaultValue = 14)]
        public int Period { get; set; }

        protected override void OnStart()
        {
            _dms = Indicators.DirectionalMovementSystem(Period);
        }

        protected override void OnBarClosed() 
        {

            if (_dms.DIPlus.LastValue > _dms.DIMinus.LastValue) 
            {
                Print("Uptrend!");
            }
            else if (_dms.DIPlus.LastValue == _dms.DIMinus.LastValue) 
            {
                Print("Undecided!");
            }
            else 
            {
                Print("Downtrend!");
            }

        }
    }
}

La varietà di eventi barra esistenti in Algo API consente agli sviluppatori di algoritmi di scegliere la tempistica accurata per i metodi chiamati. Il metodo OnBar() può essere richiamato con frequenza diversa a seconda della pianificazione del simbolo e delle impostazioni del periodo temporale del grafico, il che aggiunge anche funzionalità ai cBot. Il metodo OnBarClosed() è un comodo alias di OnBar() per lavorare con gli indicatori.