Перейти к содержанию

События баров

Разработчикам алгоритмов часто необходимо обращаться к событиям баров, чтобы своевременно выполнять торговые стратегии в ответ на обновленные цены. API предлагает события BarOpened и BarClosed, чтобы создатели алгоритмов могли точно настраивать сиБотов и использовать возможности в разных точках цикла бара.

Примечание

События баров могут обрабатываться только при написании кода сиБотов. Индикаторы вместо этого имеют метод Calculate(), который вызывается на каждом тике.

В этом руководстве мы объясняем разницу между методами OnBar() и OnBarClosed() и приводим несколько примеров использования.

События баров за одну минуту!

  • Метод OnBar() срабатывает каждый раз, когда на графике, к которому добавлен экземпляр, рисуется новый бар. Он вызывается для вновь сформированного бара.
  • Обработчик события OnBarClosed() также срабатывает на каждом новом баре. Однако он вызывается для последнего закрытого (то есть предыдущего по отношению к текущему) бара.
  • Обращаясь к правильному событию бара, вы повышаете точность вашего технического анализа и выбираете подходящее время для действий алгоритма.
  • Поддерживаемые типы графиков для BarOpened и BarClosed — это временные бары, свечи, тиковые, Рэнко, range и графики Хайкен Аши.

Использование метода OnBar()

Возникновение события BarOpened зависит от расписания инструмента и частоты поступления цен. Обычно пользователи платформы могут настроить частоту возникновения BarClosed с помощью настроек таймфрейма графика.

Примечание

Метод OnBar() может вызываться так часто, как позволяют настройки таймфрейма графика. После закрытия бара OnBar() не будет вызван до прихода следующего тика, который логически запускает формирование нового бара.

Метод OnBar() вызывается одновременно с каждым новым баром, отображаемым на графике, к которому прикреплен алгоритм. В результате обработчик OnBar() является идеальным местом для определения пользовательской торговой логики, которую ваш сиБот должен повторять регулярно.

В редакторе кода вы можете указать обработчик OnBar() следующим образом:

override void OnBar()

Используйте метод OnBarClosed()

Algo API также позволяет выполнять логику для последнего закрытого бара, что, в зависимости от стратегии, которую вы хотите реализовать, может быть более удобной и точной альтернативой обработке события BarOpened. При открытии бара новый бар появляется как doji и не содержит полных данных для технического анализа.

Событие BarClosed является псевдонимом события BarOpened, что означает, что оно происходит только в случае, если происходит событие BarOpened. Например, событие BarClosed для последнего бара в пятницу произойдет с первым открытым баром в понедельник, при условии, что инструмент не торгуется в выходные дни.

Примечание

Метод OnBarClosed() не будет вызван до тех пор, пока не придет тик для формирования нового бара.

Обработчик события OnBarClosed() может быть объявлен следующим образом:

override void OnBarClosed()

В теле метода OnBarClosed() вы можете определить, какие связанные действия будут выполнять ваши сиБоты при срабатывании события BarClosed (например, выполнить ордер, обозначить паттерн, нарисовать визуальные элементы технического анализа и т. д.).

При обращении в этом обработчике событий коллекция Bars не содержит текущий активный бар, тогда как другие коллекции (такие как Positions, Symbols и т. д.) содержат актуальные данные.

Обработчики событий OnBar() и OnBarClosed() работают должным образом при бэктестинге и оптимизации. Оба метода могут использоваться на различных типах графиков, включая временные бары, свечи, тиковые графики, графики Ренко, диапазонные графики и графики Хайкен Аши.

Создайте примеры сиБотов

Следующий пример сиБота размещает рыночный ордер при открытии каждого третьего бара на графике 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);
            }
        }
    }
}

Поскольку сиБот был запущен на графике m1, приблизительный временной интервал между выполненными рыночными ордерами составляет три минуты.

Image title

Ниже приведен пример сиБота со встроенным индикатором Directional Movement System (DMS), который выводит (Восходящий тренд!), если значение DI+ (зеленая линия) превышает значение DI- (красная линия).

Image title

Когда DI- больше, чем DI+, (Нисходящий тренд!) выводится в событии 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!");
            }

        }
    }
}

Обзор

Разнообразие событий бара, существующих в Algo API, позволяет разработчикам алгоритмов выбирать точное время для вызываемых методов. Метод OnBar() может вызываться с различной частотой в зависимости от расписания инструмента и настроек таймфрейма графика, что также добавляет функциональности сиБотам. Метод OnBarClosed() является удобным псевдонимом OnBar() для работы с индикаторами.