cAlgo Tips & Sample

【cAlgo】cBotでMessageBoxを表示する【Tips & Sample】

メッセージボックスを表示したい!

ツール系のcBotとか作ってるとユーザー向けにメッセージボックスを表示してあげたいことがでてきます。こーゆーの。

MT4(MQL)だとMessageBox関数呼び出すだけで簡単にこんなメッセージボックスが表示できるようになってるんですが、cTraderではそうはいきません。cAlgo APIにはメッセージボックスを表示する機能がないのです。

いや、簡単にできなきゃできないでメッセージボックスくらいなくてもなんとかなるんですが、ちょっとだけ不便なんですよね。

今回はこのプチ不便を解消してみようかと思います。

 

さてどうしましょうか

というわけでメッセージボックスらしき機能を実現するためにどうするか考えました。

 

方法1 ログで我慢する

一番お手軽簡単な方法。いきなりメッセージボックスじゃありませんが、まぁ目的の半分くらいは達成できそうです。

Print(”パラメータ設定が違うよ");

メッセージ出したいところでこう書いておけばcBot Logのタブには表示されるようになるため、一応お知らせは可能です。

ただ自分用cBotならこれで十分なのですが、他の人が使うことを考えるとそうはいきません。そもそもログウィンドウなんて見ない人もいるでしょう。気づかれなければ意味がありません。

また、もう一つ大きな問題としてcTraderではインジケーターのPrintメソッドは(Automate画面以外では)ログウィンドウに出力されないという残念仕様になってるため、インジケーターにおいてはこの方法はまったく使えません

 

方法2 Windows Formsのメッセージボックスを使う

C#使ってるんだからWindowsのメッセージボックスをそのまま使えばいいじゃん、と。ごく当然で一般的な対応策です。(そもそもこういう思想でメッセージボックスが実装されてないんだと思います。)

簡単にできないとか言いいましたが、別にそんな難しくはないんです。ちょっと参照設定して、標準のMessageBox呼び出すだけなので。Automateの編集画面からはこんな感じでSystem.Windows.Formsを参照設定します。

でコードはこんな感じ。メッセージボックス表示コードは4行目だけ。

    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class NewcBot : Robot{
        protected override void OnStart(){
            System.Windows.Forms.MessageBox.Show("パラメータ設定が違うよ","エラー");
        }

 

これでいわゆるフツーのメッセージボックスが表示できます。

ただ残念な点としてはAccessRight=Noneでは使えないのです。上記ソースコードにあるようにFullAccess、いわゆる「無制限のアクセス権限」を取得する必要があります

個人的にはちょっとメッセージ表示するだけのためにわざわざFullAccessとるのもいかがなものかと思ってしまいます。もちろん自分で使うだけなら別に気にしなくていいんですがなんとなく気持ち悪い。

あと見た目もイマイチなんですよね。Windows.Formsなのでどうも古臭く感じます。Windows.FormsじゃなくてWPF使ってデザインから作り込むこともできることはできるのですが、そこまでするのもねぇ・・・

 

方法3 cAlgo APIのコントロールでメッセージボックスもどきを作る

なければ作ればいいのです。ということで、それっぽいクラスをcAlgoAPIで作ってみました。

このクラスを組み込んでおけば、こんなコードを1行で

MessageBox.Show(Chart, "パラメータ設定が違うよ", "エラー", MessageBoxButtons.OKCancel);

こんな感じでチャート上にメッセージボックスらしきものを表示できるようになります。もちろんアクセス権限取得も不要です。

色合いはcTrader風にしておきました。ダークモード用です。

ちなみにあくまで「もどき」ですのでマウスで動かしたりできませんし、モーダルにもできませんが、ちょっとしたお知らせだけならこれで十分じゃないでしょうか。

一応ボタンの種類設定もできますし、ボタン押したときのコールバックも指定できます。作ってる途中で面倒になってしまったので、若干中途半端なコードにはなってますがよかったらご利用ください。

気まぐれで作りましたが、自分で使ってみて使えそうであればマウスで動かせるようにくらいはアップデートしようかと思ってます。

使い方は簡単で、ソースコード中のMessageBoxクラスを自分のコードに追記したらあとは表示させたい場所で

MessageBox.Show(Chart, メッセージ, タイトル, ボタン種類)の形で呼び出すだけです。第一引数にチャートを渡す必要がありますが、メッセージ、タイトル、ボタン種類を渡す部分はWindowsFormsと同じです。(引数の感覚はどっちかというとWindowsAPIのMessagebox関数に近いかも)

ボタンに応じてなにか処理させたいときは、(こっちはWindowsとは異なりますが)MessageBox.Show(Chart, タイトル、メッセージ、ボタン種類、Action、Action, Action)とボタンを押したときのActionを引数として渡してください。

一応使い方サンプルのcBot本体ソースコード全文載せておきます。なんとなく使い方のイメージがわけば幸いです。

[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
public class MessageBoxSample : Robot {
    protected override void OnStart() {
        // --- この部分はサンプルメッセージボックス表示用のボタンを並べてるだけです。
        var panel = new WrapPanel { HorizontalAlignment = HorizontalAlignment.Right, VerticalAlignment = VerticalAlignment.Bottom, Margin = 10 };
        var labels = new string[] { "一番シンプル", "2つボタン", "3つボタン+長文", "好きなボタン", "アクション付き" };
        var btns = labels.Select(l => { var b = new Button { Text = l, Margin = 5 }; panel.AddChild(b); return b; }).ToArray();
        Chart.AddControl(panel);

        // --- ボタンクリックでメッセージボックスを表示させる
        btns[0].Click += _ => MessageBox.Show(Chart, "パラメーターを修正してください。\r\n(シンプルメッセージタイトルなし)");
        btns[1].Click += _ => MessageBox.Show(Chart, "このまま続けますか?\r\n(第3引数にMessageBoxButtons.YesNoを指定)", "2つボタン+タイトル付き", MessageBoxButtons.YesNo);
        btns[2].Click += _ => MessageBox.Show(Chart, "このcBotは〇〇〇のため、パラメータはXXXXに設定する必要があります。また、時間足は〇時間足に設定してください。それとついでにこれとそれとあれと・・・\r\n(第3引数にMessageBoxButtons.YesNoCancelを指定)", "3つボタン+長文サンプル", MessageBoxButtons.YesNoCancel);
        btns[3].Click += _ => Chart.ShowMessageBox("逆張りはありかなしか。\r\n(表示するボタンは最大4つ、それ以上は例外投げる仕様)", "カスタムボタン", new string[] { "あり", "なし", "論外", "考え中" });
        btns[4].Click += _ => Chart.ShowMessageBox("再試行でログ表示\r\n無視でcBot停止", "アクション付き", MessageBoxButtons.AbortRetryIgnore, null, () => Print("再試行が押されました"), ()=>Stop());
        //            ⇧ Chartの拡張メソッドになってるのでChartのメンバのように呼び出すことも可能。
    }
}

実際の動作はダウンロードして動かしてみてください。メッセージボックスクラスのソースコードも一つのファイルに入ってるので、気に入らない部分は適当に手直ししてご利用ください。

 

-cAlgo Tips & Sample

© 2021 cTrader's Life Powered by AFFINGER5