バーイベントを処理する方法

バーイベントは、任意のcBotのライフサイクルにおいて重要な要素です。これらのイベントを適切に処理することは、新しい市場状況に対するcBotの反応を管理する上で非常に重要です。この記事と対応するビデオでは、主要なバーイベントの種類を示し、cTrader APIによって公開されているこれらのイベントのハンドラーについて説明します。

注記

「バー」という用語は、cTraderによって取引チャート上に順次描かれるさまざまなタイプのオブジェクトを指します。これには、ローソク足、レンコブリック、レンジバー、さらにはヘイキンアシキャンドルも含まれます。

BarOpenedイベントの処理

バーイベントは、新しいバーがcBotにアタッチされた取引チャート上に描画され始めたときに発生します。BarOpenedイベントは、チャート上に描画され始めた新しいバーに対して発生します。

このイベントの処理は、Robotクラスから継承されたOnBar()メソッドを介して行われます。ここでは、BarOpenedイベントを処理するcBotを作成し、市場のセンチメントを分析するための戦略の一部として使用します。テンプレートからOnStart()およびOnStop()メソッドを削除し、OnTick()ハンドラーをOnBar()ハンドラーに置き換えます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
protected override void OnBar()
{
    var previousBar = Bars[Bars.Count - 2];
    var priceDifference = ((Bars.LastBar.Open - previousBar.Open) / previousBar.Open) * 100;
    if (priceDifference > 1)
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
    }
    else if (priceDifference < -1)
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000);
    }
    else 
    {
        foreach (var position in Positions) 
        {
            position.Close();
        }
    }
}

このcBotはD1タイムフレームのチャート上で起動することを想定しています。各バーごとに、前のバーのオープン価格と比較し、適切な方向に新しい注文を出します。価格差がわずかである場合、ボットは代わりにすべての現在のポジションを閉じます。

このシンプルなボットのバックテストを実行すると、結果は有望です。

BarClosedイベントの処理

新しいバーが開くと、そのオープン価格以外の価格データは実質的に存在しません。多くの場合、戦略をスムーズに実行するために、前のバーのデータにアクセスすることが望ましいです。このため、BarClosedイベントは、閉じたばかりのバー(つまり新しいバーの直前のバー)に対して発生し、その価格とボリュームデータを簡単に使用できるようにします。BarClosedイベントがトリガーされると、新しく開かれたバーはBarsコレクションから完全に除外されます。

BarClosedイベントを処理するには、APIはOnBarClosedメソッドを公開しています。

注記

前の例では、Bars.LastBar.Openプロパティを使用して、新しく開かれたバーのオープン価格を取得しました。同じプロパティをOnBarClosed()メソッドで使用すると、閉じたばかりのバーのオープン価格を取得することになります。

以下のように、OnBarClosed()ハンドラーを使用するシンプルなcBotを作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBarClosed()
{
    var lowCloseDifference = ((Bars.LastBar.Close - Bars.LastBar.Low) / Bars.LastBar.Close) * 100;
    if (lowCloseDifference > 0.5)
    {
        foreach (var position in Positions)
        {
            position.Close();
        }
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, null, 50);

    }
}

このcBotは、ローソク足の下ヒゲの長さを評価して強気の「ハンマー」パターンを検出します。ハンマーパターンが検出された場合、以前に開かれたすべてのポジションが閉じられ、50ピップのストップロス付きで新しい買い注文が出されます。

このボットのバックテストを実行すると、良好な結果が得られます。

カスタムイベントハンドラーの追加

BarOpenedおよびBarClosedイベントを処理する際には、カスタムハンドラーを割り当てることで、やや異なる構文を使用することもできます。OnBar()およびOnBarClosed()は一度しかトリガーされませんが、カスタムハンドラーを必要なだけ割り当てることができ、複雑なロジックを追加することができます。

注記

カスタムイベントハンドラーは、OnStart()メソッド内で追加する必要があります。カスタムハンドラーはまた、BarOpenedEventArgsBarOpenedイベントの場合)またはBarClosedEventArgsBarClosedイベントの場合)の引数を受け入れる必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnStart() 
{
    Bars.BarClosed += BarClosedHandler;
    Bars.BarClosed += AnotherClosedHandler;
    Bars.BarOpened += BarOpenedHandler;
}
void BarClosedHandler(BarClosedEventArgs args) {}
void AnotherClosedHandler(BardClosedEventArgs args) {}
void BarOpenedHandler(BarOpenedEventArgs args) {}

次に、強気と弱気の反転に反応するために、BarOpenedイベント用の2つのカスタムハンドラーを使用するcBotを作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected override void OnStart() 
{
    Bars.BarOpened += BullishReversal;
    Bars.BarOpened += BearishReversal;
}
private void BullishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open > Bars.Last(1).Close && Bars.LastBar.Open > Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000, null, 10, 50);
    }
}
private void BearishReversal(BarOpenedEventArgs args) 
{
    if (Bars.LastBar.Open < Bars.Last(1).Close && Bars.LastBar.Open < Bars.Last(2).Close) 
    {
        ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000, null, 10, 50);
    }
}

このボットは、新しく開いたバーのオープン価格が2つ前のバーのクローズ価格よりも高い場合に買い注文を出します。オープン価格が2つ前のバーのクローズ価格よりも低い場合には、売り注文を出します。2つの別々のイベントハンドラーを使用することで、取引ロジックを小さなコンポーネントに分割し、必要に応じて簡単に変更できるようにします。

D1タイムフレームでのバックテストの結果も良好です。

まとめ

バーイベントの適切な処理方法を学ぶことで、cBotがあなたの望むとおりに動作し、望むタイミングで実行されるようにすることができます。cBotの使用方法や開発について詳しく知りたい場合は、ドキュメントの他のセクションをご覧いただき、新しいビデオを公開した際に通知を受け取るためにYouTubeチャンネルを購読してください。

Subscribe to our YouTube channel

目次

このページについて