マルチタイムフレーム戦略のコーディング

多くの場合、自動化された戦略はトレーディングの決定を下す前に異なる時間枠からの情報を考慮する必要があります。幸いなことに、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);

他の2つの移動平均についても同じプロセスを繰り返します。以下のコードをコピーして貼り付けるだけで進めることができます。

 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がポジションを取ることがわかります。また、各インディケーターが異なる方向を指しているときには市場に参入しません。

このビデオと記事がお役に立てば幸いです。このビデオの下部でお気軽に質問してください。また、新しいビデオを公開した際に更新情報を受け取るために、チャンネル登録をお願いします。

YouTubeチャンネルを登録してください

目次

このページについて