cBot 라이프사이클
이 글과 동반된 비디오에서, 우리는 cTrader cBot의 코드 구조를 단계별로 살펴보고 이벤트와 라이프사이클 뒤에 있는 논리를 설명합니다.
참고로, cTrader의 Algo 애플리케이션에서 cBot에 접근할 수 있습니다. 새로운 cBot을 생성하려면, 새 cBot 버튼을 클릭하거나 아래 표시된 드롭다운에서 이 옵션을 선택하세요.

기본 템플릿 해석
새로운 cBot을 생성한 후, 코드 편집기 창에서 다음과 같은 기본 구조를 볼 수 있습니다.
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 | |
기본 템플릿에는 OnStart(), OnTick(), OnStop() 메서드로 처리되는 세 가지 이벤트만 표시됩니다. 나중에 OnBar()와 OnException() 메서드를 추가하고 그 작동 방식을 설명할 것입니다; 먼저 OnStart() 메서드에 대해 논의하겠습니다.
OnStart() 메서드 사용
OnStart() 메서드는 cBot이 처음 시작될 때 트리거됩니다. 이 메서드는 cBot에서 사용할 변수, 지표, 카운터, 이벤트 핸들러 또는 타이머를 초기화하는 데 사용됩니다.
참고
초기 코드 템플릿에는 cBot이 시작될 때 로그에 메시지를 출력하는 코드 문장이 이미 포함되어 있습니다. 보시다시피, 우리의 cBot에는 Message 매개변수가 있으며, OnStart() 메서드는 이 매개변수의 값을 Print() 메서드에 전달합니다.
OnStart() 메서드가 어떻게 작동하는지 확인하려면 Trade 애플리케이션에서 cBot 인스턴스를 시작하고 로그 탭을 열어 결과를 확인하면 됩니다.

또한 언제든지 cBot을 중지하고 매개변수 탭에서 Message 매개변수의 값을 변경한 후 인스턴스를 다시 시작할 수 있습니다. 시작 시 새로운 메시지가 로그에 출력될 것입니다.


OnTick() 메서드 사용
OnTick() 메서드는 심벌의 매도 또는 매수 가격이 변경될 때마다 트리거됩니다. 이 메서드 내에서는 일반적으로 포지션 진입 및 청산 조건과 새로운 틱 데이터가 도착할 때 실행해야 하는 기타 보조 기능을 프로그래밍할 수 있습니다.
OnTick() 메서드에 다음 코드를 추가하여 로그에 메시지를 출력하도록 하겠습니다.
1 | |
아래에서 볼 수 있듯이, 우리의 cBot은 이제 가격이 변경될 때마다 매도 및 매수 가격을 로그에 출력합니다.

OnBar() 메서드 사용
OnBar() 메서드는 기본 cBot 코드 템플릿에 포함되어 있지 않으므로 다음 코드 스니펫을 추가하여 이를 추가하겠습니다.
1 2 3 4 | |
OnBar() 메서드는 cBot이 연결된 차트에 새로운 바 또는 캔들이 그려질 때마다 트리거됩니다. OnTick() 메서드와 마찬가지로, OnBar() 메서드를 사용하여 포지션 진입 및 청산 조건과 각 새로운 바가 형성될 때 실행해야 하는 기타 로직을 프로그래밍할 수 있습니다.
OnBar() 메서드가 어떻게 트리거되는지
H1 차트가 있는 경우, 매시간 새로운 바가 형성되므로 OnBar() 메서드는 매시간 한 번씩 호출됩니다. m1 차트가 있는 경우, 동일한 메서드가 매분 한 번씩 호출됩니다.
우리의 OnBar() 메서드는 새로운 바/캔들마다 "OnBar"를 출력할 것입니다. 이것이 어떻게 작동하는지 확인하려면 cBot을 m1 차트에 연결하고 로그를 확인하면 됩니다.

OnStop() 메서드 사용
OnStop() 메서드는 사용자에 의해 또는 코드를 통해 cBot이 중지될 때 호출됩니다. 이 경우 OnStop() 메서드 내의 모든 코드가 실행됩니다. 이 메서드는 포지션 청산과 같은 최종 작업을 수행하는 데 사용할 수 있습니다.
우리는 OnStop() 메서드에 다음 코드를 추가할 것입니다 - 평소처럼, 우리의 cBot은 중지될 때 Message 매개변수의 값을 출력할 것입니다.
1 | |
아래 스크린샷에서 우리는 cBot 인스턴스를 시작하고 중지하여 이것이 어떻게 작동하는지 보여줍니다.

OnException() 메서드 사용
OnException() 메서드는 처리되지 않은 예외를 캡처하여 이를 어떻게 처리할지 결정할 수 있도록 함으로써 내결함성을 제공합니다. 이 메서드는 기본 코드 템플릿에 포함되어 있지 않으므로 다음 스니펫을 사용하여 직접 추가하겠습니다.
1 2 3 4 | |
OnException() 메서드를 트리거하기 위해, 더 이상 존재하지 않는 거래에 대한 정보에 접근하려고 할 때 발생하는 예외를 캡처하는 코드를 작성할 것입니다. 우리는 OnStart() 메서드에 아래 코드를 추가할 것입니다.
1 | |
OnStart() 메서드에 작성한 코드는 다음 구성 가능한 매개변수로 시장가 주문을 실행할 것입니다.
- 거래 유형은 매수 주문이 될 것입니다.
- 거래는 cBot이 연결된 차트의 현재 심벌에 대해 실행될 것입니다.
- 주문 거래량은 1,000 단위가 될 것입니다.
- 주문에 첨부된 고유 레이블은 "my label"이 될 것입니다.
우리는 또한 OnTick() 메서드에 다음 코드를 추가할 것입니다.
1 2 3 | |
OnTick() 메서드에 작성한 코드는 OnStart() 메서드에서 열린 포지션을 "my label"이라는 레이블 이름을 사용하여 찾을 것입니다.
동일한 레이블로 포지션이 발견되면 열린 거래의 포지션 ID를 로그에 출력할 것입니다. 또한 다음 코드 줄이 실행될 때 "Message below"라는 다른 메시지를 출력할 것입니다.
우리의 cBot이 시작되고 OnTick() 메서드가 호출되어 주문이 발견되면, cBot은 주문 ID를 로그에 출력하고, 주문 ID 다음에 "Message below" 메시지를 출력할 것입니다.

보시다시피, 예외가 발생하지 않으며 우리의 cBot은 완벽하게 작업을 수행합니다.
그러나 이제 우리는 cBot에 의해 열린 포지션을 수동으로 청산하고 코드를 약간 변경하여 예외가 발생하도록 할 것입니다. OnStart() 메서드에서 주문 레이블을 "cTrader"로 변경할 것입니다. OnTick() 메서드에서 "my label" 레이블이 있는 포지션이 존재하는지 확인하는 조건을 주석 처리할 것입니다.
다음은 우리의 cBot의 최종 코드입니다 - 이 코드는 항상 예외를 트리거할 것입니다.
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 | |
우리는 cBot을 다시 실행하고 어떤 일이 발생하는지 확인할 것입니다.

발생한 일은 cBot이 시작될 때 새로운 시장가 주문이 생성되었다는 것입니다. 이 주문에 첨부된 레이블은 "cTrader"였습니다. OnTick() 메서드에서 코드는 “my label” 레이블이 있는 포지션을 얻으려고 시도했으며 조건문이 있는 코드 줄을 주석 처리했습니다. 그런 다음 포지션 ID를 로그에 출력하려고 시도했습니다.
이로 인해 예외 오류가 발생했으며 이전 버전의 cTrader에서는 cBot이 중지되었을 것입니다. 그러나 새로운 OnException() 메서드를 사용하면 이제 이를 캡처하여 오류를 처리할 수 있습니다. cBot은 계속 실행되며 오류를 기록하여 수정할 수 있습니다.
요약
cBot 라이프사이클은 OnStart(), OnTick(), OnStop(), OnBar() 및 OnException() 메서드를 통해 처리할 수 있는 여러 주요 이벤트로 구성됩니다. 주요 이벤트에 대한 cBot의 응답 방식을 사용자 정의함으로써 알고리즘이 예상대로 작동하도록 할 수 있습니다.