イベント処理
例えばチャート上でマウスが押されたとか、トレンドラインが描かれたとか、ポジションが決済されたとか、なにかイベントが起きた時に特定の処理を走らせたいことはよくありますよね。
MT4だとOnChartEvent内で引数のパラメータ調べて場合分けして...と結構面倒だった記憶がある方もいるのではないでしょうか。cAlgoではそんな心配は無用です。C#のeventの仕組みを使うことでイベント発生時の処理はすっきりわかりやすく簡単に書くことができます。
イベント処理の方法
簡単に言うと、「イベントが起きた時にやってもらいたい処理を、担当オブジェクトにあらかじめ伝えておけば、あとは勝手にやっといてくれる」仕組みになってます。細かい仕組みは置いておいて、使い方だけさらっといきましょう。
例として、チャートでマウスボタンが押されたらログに”クリック!”と表示するという単純なcBotを作ってみます。
using cAlgo.API;
namespace cAlgo.Robots {
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class ClickPrint : Robot {
// ①イベント発生時に呼び出してもらいたいメソッドを作る
private void OnClick(ChartMouseEventArgs args) {
Print("クリック!");
}
protected override void OnStart() {
// ② 目的のイベントに作成したメソッドを登録する
Chart.MouseDown += OnClick;
}
}
}
これだけです。これでコード全文なのでcBotを新規作成して、丸っとコピペで置き換えてビルドすれば動きます。
内容としては、Chartさんに「MouseDownしたらOnClickの処理やっといてね!」とお願いしておくだけのコードです。少し詳しく説明します。
①イベント発生時に呼び出してもらいたいメソッドを作る
private void OnClick(ChartMouseEventArgs args) {
Print("クリック!");
}
この部分。返り値は必ずvoidで引数の型はイベントごとに決まってます。cAlgoの場合、イベントごとに決まった~EventArgsと名前の付く型の引数が用意されています。
型さえあっていればメソッド名と引数名は自由に決めて構いません。(普通はイベント名に紐づいた名前を付けます。)
引数内にイベントの情報を持っており、例えばChartMouseEventArgsであれば、イベントの発生した座標や、発生時に修飾キー(Ctrl,Alt,Shift) が押されていたかどうか、などの情報を持ってます。
private void OnClick(ChartMouseEventArgs args) {
if (args.CtrlKey) Print("({0},{1})をクリック!", args.MouseX, args.MouseY);
}
例えばこんな風にすれば、クリック時、Ctrlキーが押されてたときのみクリックされた座標を表示する、ということができます。
② 目的のイベントに作成したメソッドを登録する
Chart.MouseDown += OnClick;
この行です。つまりChartさんに「MouseDownってイベントおきたらOnClick呼んでね!」と依頼しています。+= OnClick;とこの書き方は覚えてください。OnClickのあとは()はつけません。
+=という演算子から想像つくと思いますが、他にも追加したい処理があればどんどん追加することができます。不要になったら-=で処理を外すこともできます。
ちなみにこのコードはあくまでMouseDownイベントにOnClickという処理を登録しているだけです。この行ではOnClickメソッド自体は呼び出されません。
実際の流れ
まず目的のイベントを探す
何か起きた時にやりたい処理がでてきたら、まずはその「何か」をイベントとして持ってるオブジェクトを探します。
チャート上で起きるイベントならChartが持ってますし、ローソク足関連ならBarsかBarが持ってます。そんなに迷うことはないと思います。
リファレンス画面のイナズマアイコンが用意されてるイベントです。cAlgoのイベント一覧も用意しましたのでざっと見てみると目的のものがみつかるかもしれません。
なお、探す人が多そうなので先に言っておくと、cTraderではキーダウンイベント(MT4でいうCHARTEVENT_KEYDOWN) は拾えません。アップデートに期待しましょう。(2021/3/3追記)cTrader4.0にてChart.KeyDownイベントが追加されました!
イベントにメソッドを登録して、実装する
上記では説明の都合上①メソッド作成②登録の順で書きましたが、実際に使うイベントが決まったら、OnStart()内にでもまずChart.MouseDown+=まで先に書いてタブキーを押してみてください。(cTrader組み込み環境の場合はポップアップメニューから"generate ~"を選択。)
自動的にメソッドが作成されます。メソッド名が気にいらなければその場で変更できます。最後に自動的に作成されたメソッドの中身を作れば完成です。ちなみにメソッドの登録はOnStart()である必要はありません。必要に応じて変えてください。
ね?簡単でしょ?
蛇足
ラムダ式を知ってるなら登録の行をラムダ式でも書けます。難点はラムダ式で登録してしまうと -=演算子で登録を外すことができなくなることですが、登録を外す必要のない簡単な処理ならラムダ式のがすっきり書けますね。
using cAlgo.API;
namespace cAlgo.Robots {
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class ClickPrint : Robot {
protected override void OnStart() {
// ① 目的のイベントに処理を直接登録する、以上!
Chart.MouseDown += (_ => Print("クリック"));
}
}
}