コンテンツにスキップ

cBot でインジケーターを使用する方法

この記事と対応する動画では、cBotで内蔵インジケーターを使用する方法を説明します。 cBotでインジケーターを使用するのは、通常、さまざまな目的のためであり、特にインジケーターの出力に応じてcBotが取引決定を行うためです。 これを実証するために、Relative Strength Index (RSI)に基づいたシンプルな自動取引戦略を開発します。

新しい cBot を作成する

新しいcBotを作成するには、Algoタブに切り替えて新しいcBotをクリックします。

cBotの名前を「RSI cBot」に変更します。 これが私たちの自動取引戦略の機能です。

  • RSIインジケーターが事前に定義されたしきい値を下回ると、ボットは買いポジションに入ります。
  • RSIインジケーターが事前に定義されたしきい値を上回ると、ボットは売りポジションに入ります。

インジケーターの定義と初期化

最初にやるべきことは、cBotクラスでRSIインジケーターを定義することです。 そのために、新しいフィールドを宣言します。

1
private RelativeStrengthIndicator rsi;

プライベートクラスメンバーの使用

rsiフィールドはcBot内でのみ使用されるため、プライベートにしても安全です。

すべてのcTraderインジケーターは、使用する前に初期化する必要があります。 これは、OnStart()メソッドの本体で行うのが最適です。これにより、cBotが実行を開始した後にインジケーターの出力にアクセスできます。 cTraderは、組み込みインジケーターを簡単に初期化できる便利なクラスを提供しています。 これがどのように行われるかを見る前に、RSIインジケーターを初期化するために必要な2つのパラメーターを追加します。

1
2
3
4
5
[Parameter("Source", Group = "RSI")]
public DataSeries Source { get; set; }

[Parameter("Periods", Group = "RSI", DefaultValue = 14)]
public int Periods { get; set; }

パラメーターを追加したので、インジケーターを初期化する準備が整いました。

1
2
3
4
protected override void OnStart()
{
    rsi = Indicators.RelativeStrengthIndex(Source, Periods);
}

取引ロジックを実装する

インジケーターを初期化したので、それを呼び出して取引ロジックで使用できます。 RSIインジケーターの場合、Resultsコレクションを使用して出力を読み取ることができます。

これを行うために、OnBar()メソッドを使用し、次の条件を実装します。

  • 現在のRSI値がRSIの買いしきい値を下回っている場合、新しい買いポジションに入ります。
  • 現在のRSI値がRSIの売りしきい値を上回っている場合、新しい売りポジションに入ります。

事前に定義されたしきい値に依存して取引ロジックを実行するため、cBotにさらに2つのパラメーターを追加します。

1
2
3
4
5
[Parameter("Buy Level", Group = "RSI", DefaultValue = 30)]
public int BuyLevel { get; set; }

[Parameter("Sell Level", Group = "RSI", DefaultValue = 70)]
public int SellLevel { get; set; }

次に、cBotコードに条件を実装します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBarClosed()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
    // Enter buy position
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
    // Enter sell position
    }
}

取引注文を実行するための補助メソッドを実装する時が来ました。 これは、コードの抽象化レベルを追加し、可読性と再利用性を向上させるために行われます。

まず、取引高を設定できるcBotパラメーターを追加します。

1
2
[Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }

その後、新しいポジションに入るためのOpen()メソッドと、特定の方向でcBotによって開かれたすべてのポジションを閉じるためのClose()メソッドを追加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
private void Open(TradeType tradeType)
{
    var position = Positions.Find("SampleRSI", SymbolName, tradeType);
    var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity);

    if (position == null)
        ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "RSI cBot");
}

private void Close(TradeType tradeType)
{
    foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType))
        ClosePosition(position);
}

補助メソッドを使用して、自動取引戦略を完成させることができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnTick()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
        Close(TradeType.Sell);
        Open(TradeType.Buy);
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
        Close(TradeType.Buy);
        Open(TradeType.Sell);
    }
}

cBotをバックテストする

cBotのコーディングが完了したら、それをビルドしてバックテストタブに切り替え、過去のデータでどのようにパフォーマンスするかを確認できます。

また、RSIインジケーターを現在のチャートにアタッチして、cBotによって実行された取引が意図したエントリーポイントと一致するかどうかを確認することもできます。

Image title