Ana içeriğe geç

Çoklu zaman dilimi stratejilerini kodlayın

Genellikle, otomatik stratejiler bir işlem kararı vermeden önce farklı zaman dilimlerinden gelen bilgileri dikkate almalıdır. Neyse ki, cTrader algoların birden fazla zaman diliminden verilere kolayca erişmesini sağlayan birçok araç sağlar. Bu videoda ve ilgili makalesinde, etkili bir cBot oluşturmak için bu araçları nasıl kullanabileceğinizi açıklayacağız.

cBot parametrelerini bildirin

Bir hareketli ortalama için gerekli parametreleri bildirerek başlayacağız. Döneme, zaman dilimine ve hareketli ortalama türüne ihtiyacımız olacak.

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; }

Sonra, hareketli ortalamayı tanımlayabiliriz.

1
private MovingAverage _ma1;

Hareketli ortalamayı OnStart() metodunda başlatabiliriz. İlk hareketli ortalamanın barlarını almak ve bunları gösterge yapıcısına geçirmek için MarketData.GetBars() metodunu kullanacağız. GetBars() metodu, ihtiyacınız olan herhangi bir zaman dilimi ve herhangi bir sembol için bar verilerini almak için kullanışlıdır.

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

Diğer iki hareketli ortalama için süreci tekrarlayacağız. Devam etmek için aşağıdaki kodu kopyalayıp yapıştırabilirsiniz.

 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);
}

İşlem mantığını uygulayın

Bu noktada, işlem mantığını uygulayabiliriz. Stratejimiz, tüm hareketli ortalamalar yükselirken bir alış pozisyonu ve hareketli ortalamalar düşerken bir satış pozisyonu tutacaktır. İşte tüm alış tarafı mantığı için kod.

 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();
    }
}

Ve işte satış tarafı mantığı için kod.

 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();
    }
}

Çoklu zaman dilimi stratejisini geriye dönük test edin

Son olarak, yeni cBot'umuzu geriye dönük test etmeliyiz. Hareketli ortalamalar aynı yöne senkronize olduğunda cBot'un pozisyonlara girdiğini ve her gösterge farklı bir yöne işaret ettiğinde piyasadan uzak durduğunu görebiliriz.