バーイベント

アルゴリズム開発者は、更新された価格に対応して取引戦略をタイムリーに実行するために、バーイベントを参照する必要があります。APIは、cBotの調整を行い、バーサイクルの異なるポイントで機会を捉えるために、BarOpenedおよびBarClosedイベントを提供します。

注意

バーイベントはcBotをコーディングするときにのみ処理できます。代わりに、インジケーターには、毎ティック呼び出されるCalculate()メソッドがあります。

このガイドでは、OnBar()メソッドとOnBarClosed()メソッドの違いを説明し、いくつかの使用例を紹介します。

1分でわかるバーイベント!

  • OnBar()メソッドは、インスタンスが追加されたチャートに新しいバーが描かれるたびにトリガーされます。これは、新しく形成されたバーに対して呼び出されます。
  • OnBarClosed()イベントハンドラーも新しいバーが作成されるたびにトリガーされます。ただし、これは現在のバーの前に閉じたバーに対して呼び出されます。
  • 正しいバーイベントを参照することで、テクニカル分析の精度が向上し、アルゴリズムのアクションに適したタイミングを選択できます。
  • BarOpenedおよびBarClosedがサポートするチャートタイプは、時間バー、ローソク足、ティック、レンコ、レンジ、および平均足チャートです。

OnBar()メソッドの使用方法

BarOpenedイベントの発生は、シンボルのスケジュールと価格の更新頻度に依存します。通常、プラットフォームユーザーは、チャートの時間枠設定でBarClosedの発生頻度を調整できます。

注意

OnBar()メソッドは、チャートの時間枠設定が許す限り頻繁に呼び出されることがあります。バーが閉じると、次のティックが到着し、新しいバーが形成されるまでOnBar()はトリガーされません。

OnBar()メソッドは、アルゴリズムが添付されているチャートに新しいバーが描かれるたびに同時に呼び出されます。そのため、OnBar()ハンドラーは、cBotが定期的に繰り返すべきカスタム取引ロジックを定義するのに最適な場所です。

コードエディタで、以下のようにOnBar()ハンドラーを指定できます。

override void OnBar()

OnBarClosed()メソッドの使用方法

Algo APIは、最後に閉じたバーに対してロジックを実行することも可能にします。これにより、実装したい戦略によっては、BarOpenedイベントを処理するよりも便利で正確な代替手段となる場合があります。バーが開くと、新しいバーは「十字線」として表示され、テクニカル分析に必要な完全なデータを持っていません。

BarClosedイベントはBarOpenedイベントのエイリアスであり、BarOpenedイベントが発生する場合にのみ発生します。例えば、金曜日の最後のバーに対するBarClosedイベントは、シンボルが週末に取引されない場合、月曜日に最初に開かれたバーで発生します。

注意

OnBarClosed()メソッドは、新しいバーを形成するためにティックが到着するまで呼び出されません。

OnBarClosed()イベントハンドラーは、次のように宣言できます。

override void OnBarClosed()

OnBarClosed()メソッドのボディでは、BarClosedイベントがトリガーされたときにcBotが実行する関連アクション(例:注文を実行する、パターンを描く、テクニカル分析のビジュアルを描画するなど)を決定できます。

このイベントハンドラーでアクセスされたとき、Barsコレクションには現在のライブバーは含まれていませんが、他のコレクション(例:PositionsSymbolsなど)には実際のデータが含まれています。

OnBar()およびOnBarClosed()イベントハンドラーは、バックテストおよび最適化で意図通りに機能します。両方のメソッドは、時間バー、ローソク足、ティック、レンコ、レンジ、平均足チャートなどのさまざまなチャートタイプで使用できます。

サンプルcBotの作成

次の例では、EURCHFチャートの3本目のバーが開かれるたびに、マーケットオーダーを発注するcBotを作成します。

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class ThirdBarMarketOrderBot : Robot
    {
        private int barCount;

        protected override void OnStart()
        {
            barCount = 0;
        }

        protected override void OnBar()
        {
            barCount++;

            if (barCount % 3 == 0)
            {
                var symbol = Symbols.GetSymbol("EURCHF");
                ExecuteMarketOrder(TradeType.Buy, symbol, 100);
            }
        }
    }
}

このcBotはm1チャート上で起動されたため、実行されたマーケットオーダーの間隔はおよそ3分です。

画像タイトル

以下は、DI+値(緑のライン)がDI-値(赤のライン)を超えた場合に「Uptrend!」と表示するネストされた方向性運動システム(DMS)インジケーターを含むcBotの例です。

画像タイトル

DI- > DI+のとき、BarClosedイベント内で「Downtrend!」と表示されます。

画像タイトル

 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
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class OnBarClosedTest : Robot
    {

        private DirectionalMovementSystem _dms;

        [Parameter("DMS Period", DefaultValue = 14)]
        public int Period { get; set; }

        protected override void OnStart()
        {
            _dms = Indicators.DirectionalMovementSystem(Period);
        }

        protected override void OnBarClosed() 
        {

            if (_dms.DIPlus.LastValue > _dms.DIMinus.LastValue) 
            {
                Print("Uptrend!");
            }
            else if (_dms.DIPlus.LastValue == _dms.DIMinus.LastValue) 
            {
                Print("Undecided!");
            }
            else 
            {
                Print("Downtrend!");
            }

        }
    }
}

まとめ

Algo APIに存在するさまざまなバーイベントは、アルゴリズム開発者がメソッドを呼び出す際のタイミングを正確に選択できるようにします。OnBar()メソッドは、シンボルのスケジュールやチャートのタイムフレーム設定に応じて異なる頻度で呼び出すことができ、cBotの機能性を向上させます。OnBarClosed()メソッドは、インジケーターと連携して作業するための便利なエイリアスとして機能します。

目次

このページについて