콘텐츠로 이동

cBot의 주요 유형

cBot은 그 코드와 로직에 따라 완전 자동화된 트레이딩부터 수동 거래 전략 구현을 지원하는 데 이르기까지 다양한 역할과 기능을 수행할 수 있는 다재다능한 도구입니다. 이 글과 해당 비디오에서 우리는 cBot의 주요 유형을 정의하고 주요 차이점을 설명하며 다양한 유형의 cBot을 생성하고 사용하기 위한 몇 가지 모범 사례를 나열할 것입니다.

넓게 보면, cBot에는 네 가지 주요 유형이 있습니다.

참고

아래 카테고리는 순전히 cBot의 동작에 따라 구분됩니다. 실제 cBot 코드 내에는 카테고리가 지정되지 않습니다. 또한 일부 개발자는 사용자 정의 cBot 분류를 만들 수도 있습니다.

  • 자동화된 트레이딩 전략 - 이름에서 알 수 있듯이, 이 유형의 cBot은 자율적으로 트레이딩 전략을 실행합니다. 예를 들어, Three black crows & three white soldiers cBot은 연속된 세 개의 녹색 캔들을 만난 후 새로운 매수 주문을 실행하고, 연속된 세 개의 빨간색 캔들을 만나면 새로운 매도 주문을 실행합니다.
  • 스크립트 - 이 유형에 속하는 cBot은 시작 시 작업을 수행하고 실행이 완료된 후 중지합니다. 예를 들어, 스크립트 cBot은 현재 열려 있는 모든 포지션의 방향, 거래량 또는 상품에 관계없이 손절매를 설정할 수 있습니다.
  • 트레이딩 어시스턴트 - 이 유형의 cBot은 수동 또는 자동 트레이딩 전략을 보완하는 유용한 작업을 수행하도록 설계되었습니다. 예를 들어, 이 유형의 cBot은 cTrader에서 제공하는 내장 트레일링 손절매 기능과 다른 사용자 정의 규칙을 사용하여 트레일링 손절매를 관리할 수 있습니다.
  • 트레이딩 패널 - 이 유형의 cBot은 자율적으로 거래하지 않습니다. 대신, 다양한 목적으로 사용할 수 있는 사용자 정의 컨트롤을 생성합니다. 예를 들어, cBot은 Forex 뉴스 애그리게이터의 WebView를 실행하면서 WebView 내부에 사용자 정의 매수 및 매도 버튼과 심벌 선택기를 통합하여 사용자가 뉴스 사이트를 떠나지 않고도 거래할 수 있도록 할 수 있습니다.

아래 하위 섹션에서 우리는 위의 각 유형에 대해 자세히 논의하고 그 이점과 한계를 설명하며 다양한 사용 사례를 제안합니다.

알고리즘 트레이딩 전략

자동화된 트레이딩 전략 유형에 속하는 cBot은 복잡하지만 강력합니다. 이들은 위험 관리, 포지션 크기 조정 및 기술 분석과 같은 모든 측면을 포함한 트레이딩 전략을 올바르게 구현해야 합니다.

아래 코드로 기본 새 cBot 템플릿을 간단히 교체하여 2분 이내에 간단한 자동화된 트레이딩 전략을 생성할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using cAlgo.API;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicTrendBot : Robot
    {
        protected override void OnBar()
        {
            if (Bars.ClosePrices.Last(1) > Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "FollowTrend");
            }
            else if (Bars.ClosePrices.Last(1) < Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000, "FollowTrend");
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicTrendBot():
    def on_bar(self):
        if api.Bars.ClosePrices.Last(1) > api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "FollowTrend")
        elif api.Bars.ClosePrices.Last(1) < api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000, "FollowTrend")

이 cBot은 모든 바에서 새로운 포지션을 엽니다. 이전 바와 비교하여 가격이 상승한 경우 롱 포지션이 열립니다. 반대로 가격이 하락한 경우 숏 포지션이 열립니다.

백테스트 및 최적화

자동화된 트레이딩 전략은 일반적으로 많은 움직이는 부분과 매개변수를 포함합니다. 결과적으로 이러한 cBot은 라이브 계정에서 실행되기 전에 광범위하게 백테스트되고 최적화되어야 하는 경우가 많습니다. 다행히 cTrader는 백테스트 처리최적화를 대신할 수 있는 내장 도구를 제공합니다.

cTrader 명령줄 도구 (CLI)

자동화된 트레이딩 전략은 일반적으로 다양한 기술 분석 신호에 반응할 수 있도록 장기간 실행되어야 합니다. 이러한 경우 RAM과 CPU 소비를 절약하기 위해 cTrader Windows를 열지 않고 cTrader CLI를 통해 cBot을 실행할 수 있습니다(이 유형의 cBot뿐만 아니라 모든 cBot을 cTrader CLI를 통해 실행할 수 있음).

스크립트

스크립트는 일반적으로 수동으로 수행하기 어렵거나 시간이 많이 걸리는 작업을 수행하는 데 필요합니다. 이러한 작업은 일반적으로 cBot 시작 시 수행되므로 스크립트를 실행하고 작업 결과를 관찰한 후 성공 시 인스턴스를 중지하여 RAM과 CPU 소비를 절약할 수 있습니다.

예를 들어, 스크립트는 총 이익이 트레이더의 계정 예치금 통화로 50단위를 초과하는 모든 포지션을 청산할 수 있습니다. 결과적으로 이 스크립트는 언제든지 트리거할 수 있는 모든 오픈 포지션에 대한 보편적인 이익실현 역할을 합니다. 이 스크립트의 코드는 다음과 같습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicScriptBot : Robot
    {

        protected override void OnStart()
        {
            foreach (var position in Positions) 
            {
                if (position.GrossProfit > 50) 
                {
                    ClosePosition(position);
                }
            }
            Stop();
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicScriptBot():
    def on_start(self):
        for position in api.Positions:
            if position.GrossProfit > 50:
                api.ClosePosition(position)
        api.Stop()

cBot을 실행한 후 수익성이 있는 여러 포지션이 점차 청산되는 것을 볼 수 있습니다.

스크립트 중지

스크립트는 특정 작업을 한 번만 실행해야 하므로 cTrader에 실행이 성공적으로 완료된 후 즉시 스크립트를 종료하도록 지시할 수 있습니다. 위의 예에서와 같이 Stop() 메서드를 호출하여 이를 수행할 수 있습니다.

트레이딩 어시스턴트

트레이딩 어시스턴트의 목적은 정기적으로 유용한 작업을 수행하는 것입니다. 이것은 스크립트와 유사하지만 스크립트는 인스턴스 시작 시에만 작업을 수행합니다. 반면, 트레이딩 어시스턴트는 시장 상황이나 기타 요인에 지속적으로 반응하고 특정 패턴에 대한 응답으로 작업을 실행하도록 설계되었습니다.

예를 들어, 포지션을 열자마자 자동으로 헤징하는 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
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicAssistantBot : Robot

    {
        private bool hasHedgedPosition = false;

        protected override void OnStart()
        {
            Positions.Opened += Positions_Opened;
        }

        private void Positions_Opened(PositionOpenedEventArgs args) 
        {
            if (!hasHedgedPosition) 
            {
                hasHedgedPosition = true;
                var position = args.Position;
                var oppositeTradeType = position.TradeType == TradeType.Buy ? TradeType.Sell : TradeType.Buy;
                ExecuteMarketOrder(oppositeTradeType, SymbolName, position.VolumeInUnits / 2);
            }
            else 
            {
                hasHedgedPosition = false;            
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicAssistantBot():
    def on_start(self):
        self.hasHedgedPosition = False
        api.Positions.Opened += self.positions_opened

    def positions_opened(self, args):
        if not self.hasHedgedPosition:
            self.hasHedgedPosition = True
            position = args.Position
            opposite = TradeType.Sell if position.TradeType == TradeType.Buy else TradeType.Buy
            api.ExecuteMarketOrder(opposite, api.SymbolName, position.VolumeInUnits / 2)
        else:
            self.hasHedgedPosition = False

포지션을 열면 cBot은 즉시 반대 방향으로 다른 포지션을 열려고 시도합니다. 이 새로운 포지션의 볼륨은 원래 포지션 볼륨의 정확히 절반입니다.

무한 루프를 방지하기 위해 hasHedgedPosition 필드를 사용하여 cBot이 새로운 포지션을 한 번만 헤징하도록 합니다.

콜백 함수

트레이딩 어시스턴트는 종종 다양한 이벤트에 대한 핸들러 역할을 하는 콜백 함수를 사용합니다. 특정 클래스에 대해 처리할 수 있는 이벤트를 알아보려면 내장 API 문서를 열고 필요한 클래스를 검색한 후 목차의 이벤트 섹션으로 이동하세요.

트레이딩 패널

트레이딩 패널은 상호 작용 시 다양한 작업을 트리거하는 사용자 정의 컨트롤을 표시합니다. 이들은 일반적으로 기본 cTrader UI에 대한 삶의 질을 향상시킵니다. 예를 들어, cBot은 클릭 시 cTrader에서 미리 정의된 볼륨으로 시장 주문을 실행하는 매수 버튼을 표시할 수 있습니다.

이러한 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
using System;
using cAlgo.API;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicPanelBot : Robot
    {

        Button buttonBuyOrder;

        protected override void OnStart()
        {

            buttonBuyOrder = new Button
            {
                Text = "Buy",
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
            };

            buttonBuyOrder.Click += ButtonBuyOrder_Click;

            Chart.AddControl(buttonBuyOrder);
        }

        private void ButtonBuyOrder_Click(ButtonClickEventArgs args) 
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicPanelBot():
    def on_start(self):
        self.buttonBuyOrder = Button()
        self.buttonBuyOrder.Text = "Buy"
        self.buttonBuyOrder.HorizontalAlignment = HorizontalAlignment.Center
        self.buttonBuyOrder.VerticalAlignment = VerticalAlignment.Center
        self.buttonBuyOrder.Click += self.button_buy_order_click
        api.Chart.AddControl(self.buttonBuyOrder)

    def button_buy_order_click(self, args):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 10000)

매수 버튼을 클릭하면 10,000단위의 새로운 시장 주문이 실행됩니다. 버튼의 편리한 배치를 통해 새로운 시장 기회에 빠르게 대응할 수 있습니다.

다른 유형의 cBot과 트레이딩 패널 결합

트레이딩 패널은 다양한 작업을 수행할 수 있는 사용자 정의 UI 컨트롤을 제공합니다. 이들을 다른 유형의 cBot과 함께 사용할 수 있습니다. 예를 들어, 트레이딩 패널에는 클릭 시 현재 열려 있는 모든 포지션을 헤징하는 사용자 정의 헤징 버튼이 포함될 수 있으며, 이는 위의 트레이딩 어시스턴트 예제와 유사합니다.

요약

네 가지 범주의 cBot 모두 유효한 용도가 있으며 선호도에 따라 결합할 수 있습니다. 예를 들어, 자동화된 트레이딩 전략과 트레이딩 어시스턴트를 동시에 실행하여 가능한 최상의 결과를 얻을 수 있습니다. 다양한 유형의 cBot을 실험하여 선호하는 트레이딩 접근 방식이 완전하고 오류 없이 실행되도록 할 수 있습니다.

Image title