MessageBox関数はインジケーターでは機能しない
MT4の組込み関数の1つ、MessageBox関数はご存知でしょうか?
小さなダイアログボックスで、ユーザーに何かを通知する際に使うものですね。
こんなやつです。
エラーメッセージや確認メッセージで使うのが一般的でしょうか。
さて、このMessageBox関数。実は、インジケーターでは無視されて動作しません。
公式リファレンスにも「The function can’t be called from custom indicators」とあります。
でも、インジケーターでメッセージボックスを出したい時ってありますよね?
そんな時はWindows APIの登場です!
脱線しますが、MT4に無いならWindows APIで何とかできないか?と考えると良いと思います。
Windows APIにはMessageBoxW関数というメッセージボックスを出力する関数がuser32.dllの中にあります。
これを使います。
まず、プログラムの最初の方で以下のインポートを行います。
#import "user32.dll" int MessageBoxW(int hWnd, string lpText, string lpCaption, int uType); #import
これで、MQL4内でMessageBoxWを呼び出すことができるようになります。
あとは、メッセージボックスを出力したい箇所で以下のように呼び出します。
int hwnd = WindowHandle(Symbol(), Period()); MessageBoxW(hwnd, "メッセージ本文", "メッセージタイトル", MB_OKCANCEL);
hwndはウィンドウハンドルと呼ばれるもので、私はウィンドウの識別子と理解しています。
あとは、MessageBox関数と同じなので割愛します。
これで、無事インジケーター内でメッセージボックスを出力できるようになりました。
ちなみに、MessageBoxW関数に似た関数でMessageBoxA関数というのがありますが、MessageBoxA関数だと文字化けを起こします。
取り扱う文字コードの違いが原因です。末尾のAとWで分けられています。
MessageBoxWに関わらず、今後AとWの両方が存在する関数があったら、Wを使いましょう。
Windows APIを使えるようになると、アプリケーションのバリエーションが増えます。
私は偉そうに語れるほどWindows APIに精通しているわけではないので、いつも試行錯誤ですがとっても便利ですよ^-^