콘텐츠로 이동

cBot 거래 작업

이 가이드에서는 Algo API를 통해 개발된 cBot을 사용하여 실행할 수 있는 주요 거래 작업에 대해 자세히 설명합니다.

다음은 cBot에서 지원하는 작업 중 일부입니다:

  • 시장가 주문 전송.
  • 예약 주문 실행.
  • 예약 주문 및 오픈 포지션 수정.
  • 포지션 청산 및 주문 취소.
  • 거래 이벤트(포지션, 주문 및 관련 활동) 구독.

시장가 주문 전송

ExecuteMarketOrder() 메서드가 호출되면 시장가 주문이 거래 서버로 전송됩니다. 새 cBot을 생성한 후 시장가 주문의 여러 정의된 속성(심벌, 거래량, 이익실현, 손절매 등)을 포함하여 이 메서드를 추가할 수 있습니다. 아래 예제는 cBot이 시작될 때 시장가 주문을 실행합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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 TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
        }       
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import clr

clr.AddReference("cAlgo.API")

from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)

예제에서는 여러 주문 매개변수가 의도적으로 정의되지 않은 상태로 남아 있습니다 "". 모든 ExecuteMarketOrder() 매개변수의 시그니처와 순서는 참조에서 확인할 수 있습니다.

cBot을 빌드하고 인스턴스를 추가하면 시작 시 지정된 매개변수로 시장가 주문이 실행된 것을 확인할 수 있습니다. 트레이드 워치 패널의 포지션로그 탭에는 해당 포지션과 로그 항목이 표시됩니다.

Positions

Log

예약 주문 실행

cTrader는 스탑 주문, 리밋 주문 및 스탑-리밋 주문 세 가지 유형의 예약 주문을 지원합니다. 시작 시 예약 주문을 실행하려면 이전 cBot 예제에서 시장가 주문을 다음 코드 스니펫으로 대체할 수 있습니다.

1
2
3
PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);
1
2
3
api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

메서드의 매개변수를 빠르게 검사하려면 메서드 이름과 여는 괄호를 입력하세요. 추가 정보가 포함된 IntelliSense 팝업이 표시됩니다.

Image title

cTrader Algo에서 메서드/매개변수를 클릭하고 F1을 누르면 코드 창 오른쪽에 도움말 패널이 표시되어 일치하는 검색 결과를 보여줍니다. 텍스트 커서가 코드 창 외부에 있는 상태에서 F1을 누르면 도움말 센터 창이 나타나 도움을 제공합니다.

cBot을 성공적으로 빌드하고 실행한 후 트레이드 워치 패널에서 다음 기록을 확인할 수 있습니다.

Orders

Log

예약 주문 및 오픈 포지션 수정

예약 주문이 실행되면 cBot의 PendingOrders 컬렉션에서 사용할 수 있게 됩니다. 이 컬렉션을 통해 예약 주문에 접근하고 수정할 수 있습니다. 기존 예약 주문은 다음과 같이 손절매 수준을 조정하여 수정할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnStart()
{
    PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);

    foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
    {
        order.ModifyStopLossPips(20);
    }
}     
1
2
3
4
5
6
7
8
def on_start(self):
    api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

    for order in api.PendingOrders:
        if order.SymbolName == api.SymbolName:
            order.ModifyStopLossPips(20)

트레이드 워치 패널의 로그 탭에는 세 개의 예약 주문이 실행된 직후 성공적으로 수정된 것이 표시됩니다.

Image title

다양한 주문 유형이 성공적으로 실행된 후 계정에 포지션이 오픈됩니다. 모든 오픈 포지션은 cBot의 Positions 컬렉션에서 사용할 수 있습니다. 이전 예제에서 예약 주문을 수정한 것과 유사하게 오픈 포지션을 수정할 수 있습니다. 시장가 주문은 포지션을 오픈하는 가장 빠른 방법이므로 이 가이드의 첫 번째 cBot에 포지션 수정 작업이 포함된 OnBar() 메서드를 추가해 보겠습니다.

1
2
3
4
5
6
7
protected override void OnBar()
{
    foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
    {
        position.ModifyTakeProfitPips(20);
    }
}
1
2
3
4
def on_bar(self):
    for position in api.Positions:
        if position.SymbolName == api.SymbolName:
            position.ModifyTakeProfitPips(20)

로그에 반영된 대로 오픈 포지션은 첫 번째 오픈 바에서 수정되었습니다.

Image title

포지션 청산 및 주문 취소

아래에는 금요일 11:00(UTC)에 OnTick() 메서드를 호출하여 모든 오픈 포지션을 청산하고 모든 예약 주문을 취소하는 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
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
            PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
        }  

        protected override void OnTick()
        {
            if(Server.Time.DayOfWeek == DayOfWeek.Friday && Server.Time.Hour >= 11)
            {
                foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
                {
                    position.Close();    
                }

                foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
                {
                    order.Cancel();
                }
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)
        api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)

    def on_tick(self):
        # Friday == 5 (Sunday=0)
        if api.Server.Time.DayOfWeek == 5 and api.Server.Time.Hour >= 11:
            for position in api.Positions:
                if position.SymbolName == api.SymbolName:
                    position.Close()
            for order in api.PendingOrders:
                if order.SymbolName == api.SymbolName:
                    order.Cancel()

Image title

거래 이벤트 구독

cTrader는 알고리즘 개발자가 거래 이벤트를 구독하고 거래 활동을 모니터링할 수 있도록 허용하며, 이러한 활동이 cBot에 의해 시작되었든 수동으로 시작되었든 상관없이 가능합니다. 이는 앞서 설명한 두 컬렉션인 PositionsPendingOrders에서 사용 가능한 이벤트를 수신함으로써 달성됩니다.

포지션에 대해 사용 가능한 세 가지 이벤트가 있습니다:

  • Open
  • Modified
  • Closed

이 이벤트는 각각 계정에서 포지션을 오픈, 수정 및 클로즈할 때 트리거됩니다.

아래 코드 스니펫에서는 OnStart() 메서드에서 세 가지 이벤트를 선언하고 호출할 메서드를 할당합니다. 이렇게 하면 사용할 코드 시그니처가 자동으로 생성됩니다. 이후 각 이벤트 메서드에 Print() 문이 추가됩니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void OnStart()
{
    Positions.Opened += Positions_Opened;
    Positions.Modified += Positions_Modified;
    Positions.Closed += Positions_Closed;                    
}  

private void Positions_Opened(PositionOpenedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was opened");
}

private void Positions_Modified(PositionModifiedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was modified");
}

private void Positions_Closed(PositionClosedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was closed");
}   
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def on_start(self):
    api.Positions.Opened += self.positions_opened
    api.Positions.Modified += self.positions_modified
    api.Positions.Closed += self.positions_closed

def positions_opened(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was opened")

def positions_modified(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was modified")

def positions_closed(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was closed")

Open, ModifiedClosed 이벤트를 수행하는 것이 사용자이든 cBot이든, 알고리즘은 아래 로그에 표시된 것처럼 매번 인쇄된 메시지와 함께 이벤트에 도달할 것입니다.

Image title

마찬가지로 예약 주문과 관련된 이벤트를 구독할 수 있습니다. 예약 주문에 대해 사용 가능한 네 가지 이벤트가 있습니다:

  • Created
  • Modified
  • Filled
  • Cancelled

네 가지 이벤트는 OnStart() 메서드에서 선언되며, 이벤트 핸들러는 다음과 같이 추가됩니다.

 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
protected override void OnStart()
{
    PendingOrders.Created += PendingOrders_Created;
    PendingOrders.Modified += PendingOrders_Modified;
    PendingOrders.Filled += PendingOrders_Filled;
    PendingOrders.Cancelled += PendingOrders_Cancelled;
}

private void PendingOrders_Created(PendingOrderCreatedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was created");
}

private void PendingOrders_Modified(PendingOrderModifiedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was modified");
}

private void PendingOrders_Filled(PendingOrderFilledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was filled");
}

private void PendingOrders_Cancelled(PendingOrderCancelledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was cancelled");
}       
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def on_start(self):
    api.PendingOrders.Created += self.pending_orders_created
    api.PendingOrders.Modified += self.pending_orders_modified
    api.PendingOrders.Filled += self.pending_orders_filled
    api.PendingOrders.Cancelled += self.pending_orders_cancelled

def pending_orders_created(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was created")

def pending_orders_modified(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was modified")

def pending_orders_filled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was filled")

def pending_orders_cancelled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was cancelled")

예약 주문과 관련된 이벤트를 구독하면 cBot은 수동 및 프로그래밍된 거래 활동 모두에 반응할 것입니다.

Image title

요약

결론적으로, cTrader는 알고리즘 개발자에게 cBot을 통해 실행할 수 있는 인상적인 거래 작업 무기를 제공합니다. 이를 능숙하게 적용하면 맞춤형이고 정교한 거래 전략을 추구할 수 있습니다.

Image title