もっと細かい値動き
cTraderはMT4とは違いティックデータも保持しています。さほど使わないからかBarsのようにプロパティからさくっと使えるようにはなってないのですが、MarketData.GetTicks()から取得して使うことができます。
ポイント
Ticksインターフェース
BarとBarsの関係と同じようにTicksもTickの配列のようなインターフェースが定義されています。
public interface Ticks : IEnumerable<Tick>
Barsと似たようなメンバを持ちます。
プロパティ
(Tick) this[int index]
Tick要素を取り出します。Bars同様の並び順は過去→未来です。
(int) Count
Ticksに入ってるTickの数を取得します。
(Tick) LastTick
最新のTickを取得します。
(string) SymbolName
Barsの通貨ペアを文字列で取得します。
メソッド
(Tick) Last(int index)
後ろ、つまり最新のTickから数えて(index+1)本目のTickを取り出します。
(int) LoadMoreHistory()
今読み込まれているより古いティックデータを読み込みます。追加されたTickの数が返ってきます。
(void) LoadMoreHistoryAsync([Action<BarsHistoryLoadedEventArgs> callback])
非同期で古いティックデータを読み込みます。コールバックは指定しなくてもかまいません。
イベント
Tick
ティックを受信した(価格が動いた)
HistoryLoaded
チャートのスクロールやプログラムによって過去のTickが読み込まれた
Reloaded
再接続などでTicksが再度読み込まれた
Tick構造体
Ticksの要素です。
public sealed struct Tick : ValueType, IEquatable
Barと同じように読み取り専用の構造体になってます。
プロパティ
(double) Ask
Ask値を取得します。
(double) Bid
Bid値を取得します。
(DateTime) Time
Tickを受信した時間です。
サンプルコード
// 冒頭に using System.Linqが必要
// 過去の平均スプレッドを計算してログに出力
double spread;
Ticks ticks = MarketData.GetTicks();
for (int i = 0; i < 10; i++) {
spread = ticks.Select(t => t.Ask - t.Bid).Average();
Print("{0}の{1}から{2}までの平均スプレッドは{3:f1}pips", SymbolName, ticks.First().Time, ticks.Last().Time, spread / Symbol.PipSize);
ticks.LoadMoreHistory();
}
ちなみにLoadMoreHistoryは呼び出すごとにどんどんさかのぼってデータを読み込みます。このサンプルでは10回ループにしてますが、while(ticks.LoadMoreHistory()!=0)でループを回せばかなり昔のデータまで持ってこれます。が、めちゃくちゃ重たくなるのでやめた方がいいです。