CRTIndicator를 사용하여 손절매 및 이익 실현 수준을 설정하는 cBot을 만들었습니다.
아이디어는 이전 캔들(CandleIndex로 지정된)의 CRT 레벨(고가, 중간, 저가)을 사용하여 새로운 거래의 손절매 및 이익 실현을 설정하는 것입니다.
단계:
- 일부 조건(테스트를 위해 매개변수로 정의할 것)에 따라 거래(매수 또는 매도)를 여는 cBot을 만듭니다.
- CRTIndicator를 사용하여 이전 캔들(사용자가 설정한 캔들 인덱스)의 레벨을 가져옵니다.
- 매수 거래의 경우, 참조 캔들의 CRT 저가에 손절매를, CRT 고가에 이익 실현을 설정합니다.
- 매도 거래의 경우, 참조 캔들의 CRT 고가에 손절매를, CRT 저가에 이익 실현을 설정합니다.
하지만, 우리가 가진 CRTIndicator는 각 캔들에 대해 레벨을 계산하고 표시만 합니다.
cBot에서 인디케이터에 접근하여 관심 있는 특정 캔들의 값을 가져와야 합니다.
cBot을 설계해 봅시다:
매개변수:
- CandleIndex: 사용할 이전 캔들 (0 = 현재, 1 = 이전 등)
- TradeType: 테스트를 위해 매수와 매도 중 선택할 수 있는 매개변수를 설정하거나, 이동평균 교차와 같은 신호를 사용하여 결정할 수 있습니다.
간단히 하기 위해 거래 유형을 선택하는 매개변수를 만듭시다.
하지만 주의: 실거래에서는 진입 조건을 사용합니다. 현재 포지션이 없으면 현재 캔들에서 거래를 여는 간단한 cBot을 만들겠습니다.
우리는 차트의 시간 프레임에서 거래한다고 가정합니다.
cBot의 단계:
- 포지션이 열려 있는지 확인합니다. 없으면 열기를 고려합니다.
- 지정된 CandleIndex(현재에 상대적인 과거 캔들)에 대한 CRTIndicator 값을 가져옵니다.
- 매수 거래의 경우:
손절매 = 참조 캔들의 CRT 저가
이익 실현 = 참조 캔들의 CRT 고가 - 매도 거래의 경우:
손절매 = 참조 캔들의 CRT 고가
이익 실현 = 참조 캔들의 CRT 저가
하지만 인디케이터는 각 인덱스마다 계산합니다. 우리는 고정된 CandleIndex 오프셋을 사용하기 때문에 모든 인덱스에 대해 동일한 값을 표시하고 있습니다.
하지만 cBot에서는 지정된 CandleIndex에 대해 현재 시점(가장 최근 완료된 캔들)에서 인디케이터의 레벨을 가져오고자 합니다.
중요: 인디케이터의 Calculate 메서드는 각 인덱스마다 호출되며, 현재 인덱스에서 참조 캔들(인덱스 - CandleIndex)의 값을 저장합니다.
따라서 특정 과거 캔들의 CRT 레벨을 얻고 싶다면, 그 캔들의 인덱스에서 인디케이터 출력 시리즈를 읽으면 됩니다.
하지만 주의: 인디케이터 출력은 현재 인덱스와 정렬되어 있습니다. 실제로 인디케이터는 다음과 같이 설정하기 때문에 모든 바에 대해 동일한 값을 표시합니다:
CRTHigh[index] = crtHigh; // crtHigh는 (index - CandleIndex) 캔들의 고가
따라서 인덱스가 100이고 CandleIndex=1이면, 인덱스 99의 고가를 가져와 인덱스 100에 표시하는 것입니다.
즉, CandleIndex 바 전의 캔들에 대한 CRT 레벨을 원한다면 현재 바(인덱스)에서 인디케이터 출력을 가져오면 CandleIndex 바 전의 레벨을 얻을 수 있습니다.
하지만 cBot에서는 OnBar 또는 OnTick을 실행합니다. 가장 최근 완료된 바(인덱스 = MarketSeries.Close.Count - 2)에 관심이 있고, 우리가 원하는 캔들은 (현재 인덱스 - CandleIndex)입니다.
또는 인디케이터를 변경하여 참조 캔들과 동일한 인덱스에서 레벨을 출력하도록 할 수 있지만, 그러면 플롯을 CandleIndex만큼 이동해야 합니다.
하지만 현재 인디케이터는 이전 바의 레벨을 현재 바에 표시하도록 설계되었습니다. 따라서 CandleIndex=1이면 각 바에서 이전 바의 레벨을 표시합니다.
cBot에서 이를 사용하는 방법:
인디케이터를 cBot에 추가한 후 가장 최근 바(인덱스 = MarketSeries.Close.Count - 1)의 값을 가져오면 CandleIndex 바 전의 레벨을 얻을 수 있습니다.
예:
현재 바 인덱스 = 마지막 바 (인덱스 = MarketSeries.Close.Count - 1)
이 인덱스에서 인디케이터 출력(CRTHigh[MarketSeries.Close.Count-1])은 (현재 인덱스 - CandleIndex) 바의 고가입니다.
하지만 인디케이터의 Calculate 메서드는 각 과거 바와 새 바마다 호출됩니다. 따라서 마지막 바의 출력 시리즈는 우리가 원하는 값을 갖습니다.
cBot 코드를 작성해 봅시다:
매개변수를 가집니다:
[Parameter("Candle Index", DefaultValue = 1, MinValue = 0)]
public int CandleIndex { get; set; }
[Parameter("Trade Type", DefaultValue = TradeType.Buy)]
public TradeType SelectedTradeType { get; set; }
[Parameter("Volume (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Volume { get; set; }
CRTIndicator 인스턴스도 생성합니다.
OnBar의 단계:
포지션이 없으면, 현재 바에 대한 인디케이터 출력(이는 CandleIndex 바 전의 레벨에 해당)에서 손절매와 이익 실현을 설정하여 새 포지션을 엽니다.
하지만 주의: 현재 바(마지막 바)에 대한 인디케이터 출력은 (현재 바 인덱스 - CandleIndex)의 레벨로 설정됩니다. 하지만 시작 시점에는 충분한 바가 있는지 확인해야 합니다.