コンテンツにスキップ

バーイベント

アルゴリズム開発者は、更新された価格に応じてタイミングよく取引戦略を実行するために、バーイベントを参照する必要がよくあります。 APIは、cBotを微調整し、バーサイクルの異なるポイントでチャンスを掴むために、アルゴリズム作成者にBarOpenedBarClosedイベントを提供しています。

注意

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

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

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

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

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を作成

以下の例のcBotは、EURCHFチャートの3本目のバーが開くたびに成行注文を出します。

 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分です。

Image title

以下は、ネストされた方向性移動システム(DMS)インジケーターを持つcBotの例で、DI+の値(緑線)がDI-の値(赤線) を超えると(上昇トレンド!)と表示します。

Image title

DI-がDI+より大きい場合、BarClosed イベントで(下降トレンド!) と表示されます。

Image title

 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() メソッドは、インジケーターを扱う際の OnBar() の便利なエイリアスです。