Langkau tajuk talian

Kod strategi pelbagai tempoh masa

Selalunya, strategi automatik perlu mempertimbangkan maklumat dari pelbagai tempoh masa sebelum membuat keputusan dagangan. Mujurlah, cTrader menyediakan banyak alat yang membolehkan algo mengakses data dari pelbagai tempoh masa dengan mudah. Dalam video ini dan artikel yang sepadan, kami akan menerangkan bagaimana anda boleh menggunakan alat ini untuk membuat cBot yang berkesan.

Isytiharkan parameter cBot

Kita akan mula dengan mengisytiharkan parameter yang diperlukan untuk purata bergerak. Kita akan memerlukan tempoh, tempoh masa, dan jenis purata bergerak.

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

Kemudian, kita boleh menentukan purata bergerak.

1
private MovingAverage _ma1;

Kita boleh memulakan purata bergerak dalam kaedah OnStart(). Kita akan menggunakan kaedah MarketData.GetBars() untuk mendapatkan bar purata bergerak pertama dan memasukkannya ke pembina indikator. Kaedah GetBars() berguna untuk mendapatkan data bar untuk mana-mana tempoh masa dan mana-mana simbol yang anda perlukan.

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

Kita akan mengulangi proses ini untuk dua purata bergerak yang lain. Anda boleh menyalin dan menampal kod di bawah untuk meneruskan.

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

Laksanakan logik dagangan

Pada ketika ini, kita boleh melaksanakan logik dagangan. Strategi kita akan memegang posisi beli apabila semua purata bergerak meningkat dan posisi jual apabila purata bergerak menurun. Berikut ialah kod untuk semua logik bahagian beli.

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

Dan berikut ialah kod untuk logik bahagian jual.

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

Uji belakang strategi pelbagai tempoh masa

Akhir sekali, kita perlu menguji belakang cBot baharu kita. Kita boleh melihat bahawa cBot memasuki posisi apabila purata bergerak diselaraskan ke arah yang sama dan kekal di luar pasaran apabila setiap indikator menunjuk ke arah yang berbeza.