一定時間ごとの処理
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→イベント処理の順で実行されそうですが、あまりあてにせずにどっちが先でもいいような実装にしておくことをお勧めします。