콘텐츠로 이동

바 이벤트

알고리즘 개발자는 업데이트된 가격에 대한 응답으로 적시에 트레이딩 전략을 실행하기 위해 바 이벤트를 참조해야 하는 경우가 많습니다. API는 BarOpenedBarClosed 이벤트를 제공하여 알고리즘 개발자가 cBot을 미세 조정하고 바 주기의 다양한 시점에서 기회를 잡을 수 있도록 합니다.

참고

바 이벤트는 cBot 코딩 시에만 처리할 수 있습니다. 대신, 지표는 모든 틱에서 호출되는 Calculate() 메서드를 가지고 있습니다.

이 가이드에서는 OnBar()OnBarClosed() 메서드의 차이점을 설명하고 여러 사용 사례를 제공합니다.

1분 바 이벤트!

  • OnBar() 메서드는 인스턴스가 추가된 차트에 새 바가 그려질 때마다 트리거됩니다. 이 메서드는 새로 형성된 바에 대해 호출됩니다.
  • OnBarClosed() 이벤트 핸들러도 각 새 바에서 트리거됩니다. 그러나 이 메서드는 마지막으로 닫힌(즉, 현재 바 이전의) 바에 대해 호출됩니다.
  • 올바른 바 이벤트를 참조하면 기술 분석의 정확도를 높이고 알고리즘 작업에 적절한 타이밍을 선택할 수 있습니다.
  • BarOpenedBarClosed에 지원되는 차트 유형은 시간 바, 캔들 스틱, 틱, 렌코, 레인지 및 하이킨 아시 차트입니다.

OnBar() 메서드 사용

BarOpened 이벤트의 발생은 심볼 스케줄과 도착하는 가격의 빈도에 따라 달라집니다. 일반적으로 플랫폼 사용자는 차트 시간대 설정을 통해 BarClosed의 발생을 조정할 수 있습니다.

참고

OnBar() 메서드는 차트 시간대 설정이 허용하는 만큼 자주 호출될 수 있습니다. 한 번 바가 닫히면, OnBar()는 다음 틱이 도착할 때까지 트리거되지 않으며, 이는 논리적으로 새로운 바가 형성되도록 합니다.

OnBar() 메서드는 알고리즘이 연결된 차트에 새로운 바가 그려질 때마다 동시에 호출됩니다. 결과적으로, OnBar() 핸들러는 cBot이 정기적으로 반복해야 하는 맞춤형 트레이딩 로직을 정의하기에 완벽한 장소입니다.

코드 편집기에서 OnBar() 핸들러를 다음과 같이 지정할 수 있습니다:

override void OnBar()

OnBarClosed() 메서드 사용

Algo API는 또한 마지막으로 닫힌 바에 대한 로직을 실행할 수 있도록 하여, 구현하려는 전략에 따라 BarOpened 이벤트를 처리하는 것보다 더 편리하고 정확한 대안이 될 수 있습니다. 바가 열릴 때, 새로운 바는 (도지 캔들)로 나타나며 기술 분석을 위한 완전한 데이터를 포함하지 않습니다.

BarClosed 이벤트는 BarOpened 이벤트의 별칭으로, BarOpened 이벤트가 발생하는 경우에만 발생합니다. 예를 들어, 금요일의 마지막 바에 대한 BarClosed 이벤트는 주말 동안 심볼이 거래되지 않는 경우 월요일에 열린 첫 번째 바와 함께 발생합니다.

참고

OnBarClosed() 메서드는 새로운 바를 형성하기 위한 틱이 도착할 때까지 호출되지 않습니다.

OnBarClosed() 이벤트 핸들러는 다음과 같이 선언될 수 있습니다:

override void OnBarClosed()

OnBarClosed() 메서드의 본문에서, BarClosed 이벤트가 트리거될 때 cBot이 수행할 연결된 작업을 결정할 수 있습니다 (예: 주문 실행, 패턴 개요, 기술 분석 시각화 등).

이 이벤트 핸들러에서 접근할 때, Bars 컬렉션은 현재 라이브 바를 포함하지 않지만, 다른 컬렉션 (예: Positions, Symbols 등)은 실제 데이터를 포함합니다.

OnBar()OnBarClosed() 이벤트 핸들러는 백테스팅과 최적화에서 의도한 대로 작동합니다. 두 메서드는 시간 바, 캔들스틱, 틱, 렌코, 레인지 및 헤이킨 아시 차트를 포함한 다양한 차트 유형에서 사용될 수 있습니다.

예제 cBots 생성

다음 예제 cBot은 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);
            }
        }
    }
}

cBot이 m1 차트에서 시작되었기 때문에, 실행된 시장 주문 간의 대략적인 시간 간격은 3분입니다.

Image title

아래는 Directional Movement System (DMS) 지표가 포함된 cBot 예제로, 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() 메서드는 심볼 스케줄과 차트 시간대 설정에 따라 다른 빈도로 호출될 수 있으며, 이는 cBot의 기능성을 더욱 향상시킵니다. OnBarClosed() 메서드는 지표 작업을 위한 OnBar()의 편리한 별칭입니다.