Lewati ke isi

Membuat kode strategi multi-timeframe

Seringkali, strategi otomatis perlu mempertimbangkan informasi dari berbagai timeframe sebelum membuat keputusan trading. Untungnya, cTrader menyediakan banyak alat yang memungkinkan algo untuk dengan mudah mengakses data dari beberapa timeframe. Dalam video ini dan artikel terkait, kami akan menjelaskan bagaimana Anda dapat menggunakan alat-alat ini untuk membuat cBot yang efektif.

Deklarasikan parameter cBot

Kita akan mulai dengan mendeklarasikan parameter yang diperlukan untuk moving average. Kita akan membutuhkan periode, timeframe, dan jenis moving average.

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 dapat mendefinisikan moving average tersebut.

1
private MovingAverage _ma1;

Kita dapat menginisialisasi moving average di metode OnStart(). Kita akan menggunakan metode MarketData.GetBars() untuk mendapatkan bar dari moving average pertama dan meneruskannya ke konstruktor indikator. Metode GetBars() berguna untuk mendapatkan data bar untuk timeframe dan simbol apa pun yang Anda butuhkan.

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

Kita akan mengulangi proses ini untuk dua moving average lainnya. Anda dapat menyalin dan menempelkan kode di bawah ini untuk melanjutkan.

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

Implementasikan logika trading

Pada titik ini, kita dapat mengimplementasikan logika trading. Strategi kita akan mempertahankan posisi beli ketika semua moving average naik dan posisi jual ketika moving average turun. Berikut adalah kode untuk semua logika sisi 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 adalah kode untuk logika sisi 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();
    }
}

Lakukan backtesting strategi multi-timeframe

Terakhir, kita harus melakukan backtesting cBot baru kita. Kita dapat melihat bahwa cBot memasuki posisi ketika moving average disinkronkan ke arah yang sama dan keluar dari pasar ketika setiap indikator menunjuk ke arah yang berbeda.