Ir para o conteúdo

Eventos de barra

Os desenvolvedores de algoritmos frequentemente precisam de se referir a eventos de barra para executar estratégias de negociação a tempo em resposta aos preços atualizados. A API oferece os eventos BarOpened e BarClosed para os criadores de algoritmos ajustarem os cBots e aproveitarem oportunidades em diferentes pontos do ciclo da barra.

Nota

Os eventos de barra só podem ser tratados ao codificar cBots. Os indicadores, em vez disso, têm o método Calculate() que é chamado a cada tick.

Neste guia, explicamos a diferença entre os métodos OnBar() e OnBarClosed() e fornecemos vários casos de uso.

Eventos de barra em um minuto!

  • O método OnBar() é acionado cada vez que uma nova barra é desenhada no gráfico ao qual uma instância é adicionada. É chamado para a barra recém-formada.
  • O manipulador de eventos OnBarClosed() também é acionado em cada nova barra. No entanto, é chamado para a última barra fechada (ou seja, anterior à atual).
  • Referindo-se ao evento de barra correto, você aumenta a precisão da sua análise técnica e seleciona o momento apropriado para as ações do algoritmo.
  • Os tipos de gráfico suportados para BarOpened e BarClosed são gráficos de barras de tempo, velas, tick, Renko, intervalo e Heikin Ashi.

Usar o método OnBar()

A ocorrência do evento BarOpened depende de um cronograma de símbolos e da frequência dos preços recebidos. Normalmente, os utilizadores da plataforma podem ajustar a ocorrência de BarClosed com as configurações de prazo do gráfico.

Nota

O método OnBar() pode ser chamado tão frequentemente quanto as configurações de prazo do gráfico permitirem. Uma vez que uma barra se fecha, OnBar() não será acionado até que o próximo tick chegue, o que logicamente aciona a formação de uma nova barra.

O método OnBar() é invocado simultaneamente com cada nova barra desenhada no gráfico ao qual um algoritmo está anexado. Como resultado, o manipulador OnBar() é o lugar perfeito para definir lógica de negociação personalizada que o seu cBot deve repetir regularmente.

No editor de código, pode especificar o manipulador OnBar() da seguinte forma:

override void OnBar()

Usar o método OnBarClosed()

A API Algo também permite executar lógica para a última barra fechada, o que, dependendo da estratégia que deseja implementar, pode ser uma alternativa mais conveniente e precisa ao tratamento do evento BarOpened. Na abertura da barra, a nova barra aparece como uma (vela doji) e não contém dados completos para análise técnica.

O evento BarClosed é um alias do evento BarOpened, o que significa que ocorre apenas no caso de o evento BarOpened acontecer. Por exemplo, o evento BarClosed para a última barra na sexta-feira ocorrerá com a primeira barra aberta na segunda-feira, desde que o símbolo não seja negociado durante o fim de semana.

Nota

O método OnBarClosed() não será chamado até que chegue um tick para formar a nova barra.

O manipulador de eventos OnBarClosed() pode ser declarado da seguinte forma:

override void OnBarClosed()

No corpo do método OnBarClosed(), pode determinar quais ações conectadas os seus cBots irão executar quando o evento BarClosed for acionado (por exemplo, executar uma ordem, delinear um padrão, desenhar elementos visuais de análise técnica, etc.).

Quando acedida neste manipulador de eventos, a coleção Bars não contém a barra atual em tempo real, enquanto outras coleções (como Positions, Symbols, etc.) contêm dados reais.

Os manipuladores de eventos OnBar() e OnBarClosed() funcionam conforme pretendido em testes de verificação e otimização. Ambos os métodos podem ser utilizados em diferentes tipos de gráficos, incluindo barras de tempo, velas, tick, Renko, intervalo e gráficos Heikin Ashi.

Criar cBots de exemplo

O seguinte cBot de exemplo coloca uma ordem de mercado quando cada terceira barra no gráfico EURCHF é aberta.

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

Como o cBot foi lançado num gráfico m1, o intervalo de tempo aproximado entre as ordens de mercado executadas é de três minutos.

Image title

Abaixo está um exemplo de cBot com o indicador Directional Movement System (DMS) aninhado, que imprime (Uptrend!) se o valor DI+ (linha verde) exceder o valor DI- (linha vermelha).

Image title

Quando DI- é maior que DI+, (Downtrend!) é impresso no 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!");
            }

        }
    }
}

Resumo

A variedade de eventos de barra existentes na API Algo permite que os desenvolvedores de algoritmos escolham o momento preciso para os métodos chamados. O método OnBar() pode ser invocado com frequência diferente dependendo do calendário do símbolo e das configurações de prazo do gráfico, o que também adiciona funcionalidade aos cBots. O método OnBarClosed() é um alias conveniente de OnBar() para trabalhar com indicadores.