Saltar a contenido

Eventos de barras

Los desarrolladores de algoritmos a menudo necesitan referirse a eventos de barras para ejecutar estrategias de operación a tiempo en respuesta a los precios actualizados. La API ofrece los eventos BarOpened y BarClosed para que los creadores de algoritmos ajusten los cBots y aprovechen las oportunidades en diferentes puntos del ciclo de la barra.

Nota

Los eventos de barras solo se pueden manejar al programar cBots. Los indicadores, en cambio, tienen el método Calculate() que se llama en cada tick.

En esta guía, explicamos la diferencia entre los métodos OnBar() y OnBarClosed() y proporcionamos varios casos de uso.

¡Eventos de barras en un minuto!

  • El método OnBar() se activa cada vez que se dibuja una nueva barra en el gráfico al que se añade una instancia. Se llama para la barra recién formada.
  • El manejador de eventos OnBarClosed() también se activa en cada nueva barra. Sin embargo, se llama para la última barra cerrada (es decir, la anterior a la actual).
  • Al referirse al evento de barra correcto, aumenta la precisión de su análisis técnico y selecciona el momento apropiado para las acciones del algoritmo.
  • Los tipos de gráficos compatibles para BarOpened y BarClosed son barras de tiempo, velas, tics, Renko, rangos y gráficos Heikin Ashi.

Usar el método OnBar()

La ocurrencia del evento BarOpened depende del horario del símbolo y la frecuencia de los precios entrantes. Normalmente, los usuarios de la plataforma pueden ajustar la ocurrencia de BarClosed con la configuración del marco temporal del gráfico.

Nota

El método OnBar() puede ser llamado tan frecuentemente como lo permita la configuración del marco temporal del gráfico. Una vez que se cierra una barra, OnBar() no se activará hasta que llegue el siguiente tick, lo que lógicamente desencadena la formación de una nueva barra.

El método OnBar() se invoca simultáneamente con cada nueva barra dibujada en el gráfico al que se adjunta un algoritmo. Como resultado, el manejador OnBar() es el lugar perfecto para definir la lógica de operación personalizada que su cBot debe repetir regularmente.

En el editor de código, puede especificar el manejador OnBar() de la siguiente manera:

override void OnBar()

Usar el método OnBarClosed()

La API de Algo también permite ejecutar lógica para la última barra cerrada, lo cual, dependiendo de la estrategia que desee implementar, puede ser una alternativa más conveniente y precisa que manejar el evento BarOpened. En la apertura de la barra, la nueva barra aparece como una (vela doji) y no contiene datos completos para el análisis técnico.

El evento BarClosed es un alias del evento BarOpened, lo que significa que solo ocurre en caso de que se produzca el evento BarOpened. Por ejemplo, el evento BarClosed para la última barra del viernes ocurrirá con la primera barra abierta del lunes, siempre que el símbolo no se negocie durante el fin de semana.

Nota

El método OnBarClosed() no se llamará hasta que llegue un tick para formar la nueva barra.

El manejador de eventos OnBarClosed() se puede declarar de la siguiente manera:

override void OnBarClosed()

En el cuerpo del método OnBarClosed(), puede determinar qué acciones conectadas realizarán sus cBots cuando se active el evento BarClosed (por ejemplo, ejecutar una orden, delinear un patrón, dibujar visuales de análisis técnico, etc.).

Cuando se accede en este manejador de eventos, la colección Bars no contiene la barra actual en vivo, mientras que otras colecciones (como Positions, Symbols, etc.) contienen datos reales.

Los manejadores de eventos OnBar() y OnBarClosed() funcionan como se espera en backtesting y optimización. Ambos métodos se pueden usar en diferentes tipos de gráficos, incluyendo barras de tiempo, velas, tics, Renko, rangos y gráficos Heikin Ashi.

Crear cBots de ejemplo

El siguiente cBot de ejemplo coloca una orden de mercado cuando se abre cada tercera barra en el gráfico 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);
            }
        }
    }
}

Como el cBot se lanzó en un gráfico m1, el intervalo de tiempo aproximado entre las órdenes de mercado ejecutadas es de tres minutos.

Image title

A continuación se muestra un ejemplo de cBot con el indicador de Sistema de Movimiento Direccional (DMS) anidado, que imprime (¡Tendencia alcista!) si el valor DI+ (línea verde) excede el valor DI- (línea roja).

Image title

Cuando DI- es mayor que DI+, se imprime (¡Tendencia bajista!) en el 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!");
            }

        }
    }
}

Resumen

La variedad de eventos de barras existentes en la API de Algo permite a los desarrolladores de algoritmos elegir el momento preciso para los métodos llamados. El método OnBar() puede ser invocado con diferente frecuencia dependiendo del horario del símbolo y la configuración del marco temporal del gráfico, lo que también añade funcionalidad a los cBots. El método OnBarClosed() es un alias conveniente de OnBar() para trabajar con indicadores.