価格情報をまとめたオブジェクトを表す
Barsインターフェース
価格情報を保持するオブジェクトを参照するインターフェースです。自分が起動してるチャートの通貨ペア、時間足の価格であれば本体(Robot)のプロパティBarsで直接参照できます。cBotにせよIndicatorにせよとにかくお世話になることが多いクラスです。
public interface Bars : IEnumerable
IEnumerableを継承しているものは「配列のすげーやつ」くらいに思っといてください。オブジェクト自身が特定の型の配列みたいな挙動を示すと同時に、クラス特有の機能(プロパティやメソッド)を持ちます。
BarsはBar型の配列を参照するインターフェースです。Bars[index]で個々のBarを取得して使うこともできますし、Barsのプロパティを使って高値だけのリスト、終値だけのリストなどを取り出して使うこともできる便利な奴です。
プロパティ
(Bar) this[int index]
thisは自分自身を表します。プロパティ欄にこう書いてあったらBars[index]みたいな感じで配列として要素が取り出されると思ってください。
index番目のBar要素を取得します。ちなみにBars内のBarの並び順は過去→未来のため、MT4でArraySetAsSeries(array, true);された配列を普段使ってる方は並びが逆になりますので注意して下さい。
(int) Count
Barsに入ってるBarの本数を取得します。インデックスは0から始まるため、最大のインデックスはBars.Count-1です。最新のBarをインデックス指定で取得するならBars[Bars.Count-1]となります。
(Bar) LastBar
最新のBarを取得します。上のBars[Bars.Count-1]と全く同じです。よく使うためプロパティで用意されてます。
ポイント
(DataSeriese) OpenPrices
始値をDataSerieseで取得します。DataSerieseはdoubleの配列みたいなもんです。Barsの始値部分だけ配列で取り出すイメージです。
(DataSeriese) ClosePrices
終値をDataSerieseで取得します。
(DataSeriese) HighPrices
高値をDataSerieseで取得します。
(DataSeriese) LowPrices
安値をDataSerieseで取得します。
(TimeSeriese) OpenTimes
ローソク足の開始時刻をTimeSerieseで取得します。TimeSerieseはDataTimeの配列みたいなもんです。
(DataSeriese) TickVolumes
ティックボリュームをDataSerieseで取得します。
(DataSeriese) MedianPrices
中央値(Barの高値と安値の平均値)をDataSerieseで取得します。
(DataSeriese) TypicalPrices
TypicalPrice (Barの高値、安値、終値の平均値)をDataSerieseで取得します。
(DataSeriese) WeightedPrices
出来高加重平均価格をDataSerieseで取得します。
(string) SymbolName
Barsの通貨ペアを文字列で取得します。
(TimeFrame) TimeFrame
Barsがどの時間足か(1時間足とか15分足とか)を取得します。
メソッド
(Bar) Last(int index)
後ろ、つまり最新のBarから数えて(index+1)本目のBarを取り出します。0指定で一番最新のBar、2本前を取り出したいなら1と指定します。
(int) LoadMoreHistory()
今読み込まれているより古い価格データを読み込みます。追加されたBarの本数が返ってきます。
(void) LoadMoreHistoryAsync([Action<BarsHistoryLoadedEventArgs> callback])
非同期で古い価格データを読み込みます。コールバックは指定しなくてもかまいません。
イベント
バー関連の以下のイベントを拾えますが、本体クラスではOnTick()とOnBar()が最初からあるためあまり使いません。自作クラスではお世話になることも。(HistoryLoadedとReloadedはそもそもあまり使わない。)
BarOpened
ローソク足が更新された。(2021/4/20追記 機能しないケースがあるようです。cTrader4.0にて確認)
Tick
ティックを受信した(価格が動いた)
HistoryLoaded
チャートのスクロールやプログラムによって過去のBarが読み込まれた
Reloaded
再接続などでBarsが再度読み込まれた
メモ
OnTick(),OnBar()とイベントの処理の順序は?
試してみたところTickイベント→OnTick()でした。
またBar更新時は
Tickイベント→BarOpendイベント→OnTick()→OnBar()
の順で呼び出されました。
ただし、一般的にイベントデリゲート(イベント発生時の処理)の呼び出し順は不定と考えておいた方がいいため、どのような順番で呼び出されても困らないような実装にしておくことをお勧めします。