콘텐츠로 이동

다중 시간대 전략 코딩

자동화된 전략은 종종 거래 결정을 내리기 전에 다양한 시간대의 정보를 고려해야 합니다. 다행히 cTrader는 알고리즘이 여러 시간대의 데이터에 쉽게 접근할 수 있도록 다양한 도구를 제공합니다. 이 비디오와 해당 기사에서는 이러한 도구를 사용하여 효과적인 cBot을 만드는 방법을 설명합니다.

cBot 매개변수 선언

먼저 이동 평균에 필요한 매개변수를 선언하겠습니다. 기간, 시간대 및 이동 평균 유형이 필요합니다.

1
2
3
4
5
6
7
8
[Parameter("MA 1 Period", DefaultValue = 14, Group = "Moving Averages")]
        public int MA1Period { get; set; }

[Parameter("MA 1 Timeframe", DefaultValue = "Hour", Group = "Moving Averages")]
public TimeFrame MA1Timeframe { get; set; }

[Parameter("MA 1 Type", Group = "Moving Averages")]
public MovingAverageType MA1Type { get; set; }

그런 다음 이동 평균을 정의할 수 있습니다.

1
private MovingAverage _ma1;

OnStart() 메서드에서 이동 평균을 초기화할 수 있습니다. 첫 번째 이동 평균의 바를 가져오기 위해 MarketData.GetBars() 메서드를 사용하고 이를 지표 생성자에 전달할 것입니다. GetBars() 메서드는 필요한 모든 시간대와 심벌에 대한 바 데이터를 가져오는 데 유용합니다.

1
_ma1 = Indicators.MovingAverage(MarketData.GetBars(MA1Timeframe).ClosePrices, MA1Period, MA1Type);

다른 두 이동 평균에 대해 이 과정을 반복할 것입니다. 아래 코드를 복사하여 붙여넣기만 하면 진행할 수 있습니다.

 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
37
Parameter("MA 1 Period", DefaultValue = 14, Group = "Moving Averages")]
public int MA1Period { get; set; }

[Parameter("MA 1 Timeframe", DefaultValue = "Hour", Group = "Moving Averages")]
public TimeFrame MA1Timeframe { get; set; }

[Parameter("MA 1 Type", Group = "Moving Averages")]
public MovingAverageType MA1Type { get; set; }

[Parameter("MA 2 Period", DefaultValue = 14, Group = "Moving Averages")]
public int MA2Period { get; set; }

[Parameter("MA 2 Timeframe", DefaultValue = "Hour2", Group = "Moving Averages")]
public TimeFrame MA2Timeframe { get; set; }

[Parameter("MA 2 Type", Group = "Moving Averages")]
public MovingAverageType MA2Type { get; set; }

[Parameter("MA 3 Period", DefaultValue = 14, Group = "Moving Averages")]
public int MA3Period { get; set; }

[Parameter("MA 3 Timeframe", DefaultValue = "Hour4", Group = "Moving Averages")]
public TimeFrame MA3Timeframe { get; set; }

[Parameter("MA 3 Type", Group = "Moving Averages")]
public MovingAverageType MA3Type { get; set; }

private MovingAverage _ma1;
private MovingAverage _ma2;
private MovingAverage _ma3;

protected override void OnStart()
{
    _ma1 = Indicators.MovingAverage(MarketData.GetBars(MA1Timeframe).ClosePrices, MA1Period, MA1Type);
    _ma2 = Indicators.MovingAverage(MarketData.GetBars(MA2Timeframe).ClosePrices, MA2Period, MA2Type);
    _ma3 = Indicators.MovingAverage(MarketData.GetBars(MA3Timeframe).ClosePrices, MA3Period, MA3Type);
}

트레이딩 로직 구현

이 시점에서 트레이딩 로직을 구현할 수 있습니다. 우리의 전략은 모든 이동 평균이 상승할 때 매수 포지션을 유지하고, 이동 평균이 하락할 때 매도 포지션을 유지할 것입니다. 다음은 모든 매수 측 로직을 위한 코드입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
if (_ma1.Result.IsRising() && _ma2.Result.IsRising() && _ma3.Result.IsRising())
{
    if (Positions.Count(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Buy) == 0)
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 100000);
}
else
{
    foreach (var position in Positions.Where(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Buy))
    {
        position.Close();
    }
}

그리고 다음은 매도 측 로직을 위한 코드입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
if (_ma1.Result.IsFalling() && _ma2.Result.IsFalling() && _ma3.Result.IsFalling())
{
    if (Positions.Count(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Sell) == 0)
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 100000);
}
else
{
    foreach (var position in Positions.Where(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Sell))
    {
        position.Close();
    }
}

다중 시간대 전략 백테스트

마지막으로, 우리의 새로운 cBot을 백테스트해야 합니다. cBot은 이동 평균이 동일한 방향으로 동기화될 때 포지션에 진입하고, 각 지표가 다른 방향을 가리킬 때는 시장에서 벗어나는 것을 확인할 수 있습니다.