콘텐츠로 이동

cBot에서 지표를 사용하는 방법

이 글과 해당 동영상에서는 cBot에서 내장 지표를 사용하는 방법을 설명합니다. cBot에서 지표를 사용하는 것은 일반적으로 다양한 목적으로 이루어지며, 가장 주목할 만한 것은 지표 출력에 따라 cBot이 거래 결정을 내리도록 하는 것입니다. 이를 보여주기 위해 Relative Strength Index(RSI)를 기반으로 한 간단한 자동 트레이딩 전략을 개발할 것입니다.

새로운 cBot 생성

새로운 cBot을 만들려면 Algo 탭으로 전환하고 새 cBot을 클릭하세요.

우리의 cBot 이름을 "RSI cBot"으로 변경할 것입니다. 다음은 우리의 자동 트레이딩 전략이 작동하는 방식입니다.

  • RSI 지표가 미리 정의된 임계값 아래로 이동할 때 봇이 매수 포지션을 진입합니다.
  • RSI 지표가 미리 정의된 임계값 위로 이동할 때 봇이 매도 포지션을 진입합니다.

지표 정의 및 초기화

우리가 가장 먼저 해야 할 일은 cBot 클래스에서 RSI 지표를 정의하는 것입니다. 이를 위해 새로운 필드를 선언합니다.

1
private RelativeStrengthIndicator rsi;

비공개 클래스 멤버 사용

rsi 필드는 우리의 cBot에서만 사용될 것이므로 안전하게 private으로 만들 수 있습니다.

모든 cTrader 지표는 사용하기 전에 초기화해야 합니다. 이는 cBot이 실행을 시작한 후 지표 출력에 접근할 수 있도록 OnStart() 메서드의 본문에서 수행하는 것이 가장 좋습니다. cTrader는 내장 지표를 미리 만들어진 생성자를 사용하여 쉽게 초기화할 수 있는 편리한 클래스를 제공합니다. 이것이 어떻게 이루어지는지 보기 전에, RSI 지표를 초기화하는 데 필요한 두 개의 매개변수를 추가할 것입니다.

1
2
3
4
5
[Parameter("Source", Group = "RSI")]
public DataSeries Source { get; set; }

[Parameter("Periods", Group = "RSI", DefaultValue = 14)]
public int Periods { get; set; }

이제 매개변수를 추가했으므로 지표를 초기화할 준비가 되었습니다.

1
2
3
4
protected override void OnStart()
{
    rsi = Indicators.RelativeStrengthIndex(Source, Periods);
}

거래 로직 구현하기

이미 지표를 초기화했으므로 이를 호출하여 거래 로직에서 사용할 수 있습니다. RSI 지표의 경우, Results 컬렉션을 사용하여 출력값을 읽을 수 있습니다.

이를 위해 OnBar() 메서드를 사용하고 다음 조건을 구현할 것입니다.

  • 현재 RSI 값이 RSI 매수 임계값 아래에 있으면 새로운 매수 포지션을 진입합니다.
  • 현재 RSI 값이 RSI 매도 임계값 위에 있으면 새로운 매도 포지션을 진입합니다.

우리의 거래 로직을 실행하기 위해 미리 정의된 임계값에 의존하므로, cBot에 두 개의 매개변수를 더 추가할 것입니다.

1
2
3
4
5
[Parameter("Buy Level", Group = "RSI", DefaultValue = 30)]
public int BuyLevel { get; set; }

[Parameter("Sell Level", Group = "RSI", DefaultValue = 70)]
public int SellLevel { get; set; }

다음으로, cBot 코드에 우리의 조건을 구현할 것입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBarClosed()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
    // Enter buy position
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
    // Enter sell position
    }
}

이제 거래 주문을 실행하기 위한 보조 메서드를 구현할 차례입니다. 이는 코드에 추가적인 추상화 수준을 만들어 가독성과 재사용성을 향상시키기 위해 수행됩니다.

먼저 거래량을 설정할 수 있는 cBot 매개변수를 하나 더 추가합니다.

1
2
[Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }

그 후, 새로운 포지션을 진입하고 cBot이 특정 방향으로 열어둔 모든 포지션을 종료하기 위한 Open()Close() 메서드를 추가할 것입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
private void Open(TradeType tradeType)
{
    var position = Positions.Find("SampleRSI", SymbolName, tradeType);
    var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity);

    if (position == null)
        ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "RSI cBot");
}

private void Close(TradeType tradeType)
{
    foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType))
        ClosePosition(position);
}

우리의 보조 메서드를 사용하여 자동화된 거래 전략을 완성할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnTick()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
        Close(TradeType.Sell);
        Open(TradeType.Buy);
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
        Close(TradeType.Buy);
        Open(TradeType.Sell);
    }
}

cBot 백테스트

cBot 코딩을 마친 후, 이를 빌드하고 백테스팅 탭으로 전환하여 과거 데이터에서 어떻게 수행되는지 확인할 수 있습니다.

또한 현재 차트에 RSI 지표를 부착하여 cBot이 실행한 거래가 의도한 진입 지점과 일치하는지 확인할 수 있습니다.

Image title