cAlgo API リファレンス

Timer【cAlgo API】

2020年10月28日

一定時間ごとの処理

cAlgoではSystem.Timersを使わなくても一定時間ごとに処理をするためのTimerが最初から用意されています。使い方は簡単でOnStart()内でTimer.Start(n)を呼び出して、OnTimer()メソッドをオーバーライドするだけ。これだけでn秒ごとにOnTimerの処理を繰り返してくれます。

protected override void OnStart() {
    //5秒周期でタイマースタート
    Timer.Start(5);
}
protected override void OnTimer() {
    //
    // ここに定期的に繰り返させたい処理を書く
    //
}

これだけで5秒おきにOnTimer内の処理が実行されます。もう少し細かいことやりたい人だけ(といっても大したことできませんが)この先の解説までどうぞ。

 

Timerインターフェース

本体クラス(Algo)がTimerプロパティとしてもってます。

public interface Timer

 

プロパティ
Interval

OnTimerが実行される間隔を取得します。

 

メソッド
(void) Start(int interval)

interval秒の周期でタイマーを開始します。冒頭サンプルコードで使ってるメソッドです。

(void) Start(TimeSpan interval)

TimeSpanでもインターバルの設定ができます。ミリ秒単位で制御したい場合はこちらを。ちなみにタイマーの精度は10ms程度です。

(void) Stop()

タイマーを止めます。

 

イベント
TimerTick

Timer処理の時間(=OnTimerが呼び出されるタイミング)になった。

 

サンプルコード

OnTimerあるのにこのイベント何に使うんだよ、って思うかもしれませんが、例えば一度起動させたタイマーに条件に応じて処理を追加したり、自作クラス内でRobotがStartさせたタイマーに便乗させたりすることができるようになります。

protected override void OnStart() {
    //500ミリ秒周期でタイマースタート
    var timeSpan = new TimeSpan(0, 0, 0, 0, 500);
    Timer.Start(timeSpan);
}
protected override void OnBar() {
    // ローソク足更新したらタイマーに処理追加
    Timer.TimerTick += AdditionalRoutine;
}
protected override void OnTimer() {
    Print("OnTimer");
}
private void AdditionalRoutine() {
    Print("AdditionalRoutine");
}

これを実行すると、最初は”OnTimer"だけがログに出力されますが、一度ローソク足を更新するとその後は"OnTimer"に続いて”AdditionalRoutine"が出力されるようになります。

なお、OnTimer→イベント処理の順で実行されそうですが、あまりあてにせずにどっちが先でもいいような実装にしておくことをお勧めします。

-cAlgo API リファレンス
-

© 2021 cTrader's Life Powered by AFFINGER5