다중 시간대 전략 코딩 VIDEO
자동화된 전략은 종종 거래 결정을 내리기 전에 다양한 시간대의 정보를 고려해야 합니다. 다행히 cTrader는 알고리즘이 여러 시간대의 데이터에 쉽게 접근할 수 있도록 다양한 도구를 제공합니다. 이 비디오와 해당 기사에서는 이러한 도구를 사용하여 효과적인 cBot을 만드는 방법을 설명합니다.
cBot 매개변수 선언 먼저 이동 평균에 필요한 매개변수를 선언하겠습니다. 기간, 시간대 및 이동 평균 유형이 필요합니다.
[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 ; }
그런 다음 이동 평균을 정의할 수 있습니다.
private MovingAverage _ma1 ;
OnStart () 메서드에서 이동 평균을 초기화할 수 있습니다. 첫 번째 이동 평균의 바를 가져오기 위해 MarketData . GetBars () 메서드를 사용하고 이를 지표 생성자에 전달할 것입니다. GetBars () 메서드는 필요한 모든 시간대와 심벌에 대한 바 데이터를 가져오는 데 유용합니다.
_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은 이동 평균이 동일한 방향으로 동기화될 때 포지션에 진입하고, 각 지표가 다른 방향을 가리킬 때는 시장에서 벗어나는 것을 확인할 수 있습니다.