特定のキー押下で処理をする
cTrader4.0でやっとできるようになりました。キーボードイベントの処理。これにより、自作インジケーターやcBot内でキーボードからいろんな処理を行わせることができます。
使い方
他のイベントと同様です。Chartオブジェクトが持つKeyDownイベントに処理を登録してあげてください。
どのキーを押されたかは引数となるChartKeyboardEventArgsオブジェクトを利用して判定します。
なお、単純にホットキーを作りたいだけであれば、後述のChart.AddHotKeyメソッドの方が使い勝手がいいです。
サンプルコード
イベントの使い方さえ知ってれば難しいことはないと思います。
protected override void Initialize() {
Chart.KeyDown += Chart_KeyDown;
}
private void Chart_KeyDown(ChartKeyboardEventArgs args) {
switch (args.Key) {
case Key.P:
// --- P押されたときの処理
break;
case Key.Q:
// --- Q押されたときの処理
break;
case Key.R:
// --- R押されたときの処理
if (args.ShiftKey) {
// --- Shift+R押されたときの処理
}
break;
default:
break;
}
}
ちなみにこのコードだとShift+PでもCtrl+PでもAlt+Pでも”P押されたときの処理”が走りますのであまり現実的ではないです。
cTrader本体のホットキーとかぶらないように注意
cTraderに最初から登録されてるホットキーについてはcTrader本体にとられてしまい機能しません。cBot、Indicatorには流してくれないようです。
cTraderのホットキーはユーザーが独自設定している可能性があるため、配布、販売するプログラムでは気を付ける必要がありそうです。
ChartKeyboardEventArgsクラス
押されたキーの情報を保持するクラスです。
public class ChartKeyboardEventArgs : Object
プロパティ
(Chart) Chart
イベントが発生したチャートを取得します。
(Key) Key
押されたキーを取得します。
(ModifierKeys) Modifiers
同時に押された修飾キー(Ctrl,Alt,Shift)を取得します。
(bool) AltKey
Altキーが同時に押されたかどうかを取得します。
(bool) CtrlKey
Ctrlキーが同時に押されたかどうかを取得します。
(bool) ShiftKey
Shiftキーが同時に押されたかどうかを取得します。
メソッドで新しいホットキーを登録する
ChartのメソッドにAddHotKey()メソッドが追加されました。単純に「このキー押されたらこの処理走らす」みたいな使い方をするのであればこっちを使った方がいいです。
また、このメソッドでホットキーを登録しようとするとcTrader本体のホットキーと被るとこんな感じにログに出力してはじいてくれます。
Failed to add hotkey "Control+W".
ホットキー登録するだけなら、KeyDownイベントではなくてできるだけAddHotKeyメソッドを使った方がいいでしょう。
(2021/3/4 返り値が誤っていたため修正)
(bool) AddHotkey(Action action, Key key, [ModifierKeys modifiers])
第一引数は引数なしのActionか上記ChartKeyBoardEventArgs型の引数をとるActionを指定します。簡単な処理ならラムダ式で書いてもいいですが、メソッド用意しておいて、それを渡してあげるのがわかりやすいかもしれませんね。
第二引数はKey列挙型を渡してあげます。Key.Pとかそのまんまです。
第三引数は省略可能。修飾キーをModifiedKey型で指定します。Alt押しながら、とかのときに指定します。Key単体でホットキーとして使うなら省略していいです。
返り値はboolで成功したかどうかを返します。すでにcTraderのホットキーとして設定されていると失敗し、falseを返します。
(bool) AddHotkey(Action action, string key)
第二引数が文字列になったバージョン。”P"とかそのまんまの文字列を渡します。
修飾キーを指定する場合は"Control+P"みたいに+でつなぎます。Alt,Shiftはそのまま、ControlはCtrlでも大丈夫です。すべて小文字でも構いません。
Key型とModifierKey型で指定したほうが間違いが少なそうですが、文字列にしておくと一目でわかりやすいというメリットはあるかもしれません。
サンプルコード
protected override void Initialize() {
// --- 第一引数Action型のラムダ式、修飾キーなし
Chart.AddHotkey(() => Print("P-KeyDown"), Key.P);
// --- 第一引数Action<ChartKeyboardEventArgs>型のメソッド、修飾キーあり
Chart.AddHotkey(PrintOpenTime, Key.P, ModifierKeys.Control);
// --- 第二引数を文字列で指定
Chart.AddHotkey(PrintOpenTime, "Alt+P");
}
private void PrintOpenTime(ChartKeyboardEventArgs args) {
Print(args.Chart.Bars.LastBar.OpenTime);
}
これでPだけ押したときには"P-KeyDown"がログに表示されます。Ctrl+PかAlt+Pを押すと、最後のローソク足のOpenTimeが表示されます。
サンプルコード書いてて思ったのですが、AddHotKeyのActionでEventArgs引数が必要な機会ってほとんどない気がします。外部のメソッド登録して、Chartを渡してあげたいときくらい?
関連する列挙型
Key列挙型
各キーを表す列挙型です。マルチメディアキーとかもそろってますので、だいたいどのキーでも使えると思っていいでしょう。
個人的に使いそう、かつ、わかりにくそうなとこだけ表にしておきます。
NumPad1~9 | テンキーの0~9 |
Multiply, Divide Add, Subtract | テンキーの* / + - (Add,Subtractはデフォルトだと拾えない) |
D0~9 | 数字キー0~9 |
Up,Down,Left,Right | 矢印キー(Left,Rightはデフォルトだと拾えない) |
全部確認してませんが、たぶん.NetのKeys列挙型とだいたい同じです。(どうでもいいけど、こっちはなんでKeysじゃなくてKey列挙型なんですかね?修飾キーはModifierKeysなのに。)
「このキーはどんな名前で登録されてるんだろう?」と思ったら、下記コードをcBotのOnStart()内に書いて試してみてください。
Chart.KeyDown += args => Print(args.Key);
このcBotを実行してる状態で何かキーを押せば、キーの名前がログに表示されます。
ModifierKeys列挙型
修飾キーを表します。
None | 修飾キーなし |
Alt | Altキー |
Control | Ctrlキー |
Shift | Shiftキー |
なお、Flags属性を持つため、ビット演算子を使った指定が可能です。
Chart.AddHotkey(() => Print("P-KeyDown"), Key.P, ModifierKeys.Control | ModifierKeys.Alt);
これでCtrlとAltを押しながらPを押したときにログにP-KeyDownと表示されるようになります。
この指定方法、馴染みがないと間違いやすいのですが、&じゃなくて|ですのでご注意ください。