MQLプログラミング言語でチャートにボタンを追加する方法
チャートにボタンを追加
「MQLプログラミング言語で3本表示のRCIを作成する方法」という記事では、RCIの表示を3本にして短期、中期、長期と順に並んだときに矢印を表示する「3RCI_Sign」を作成しました。その内容を引き継ぐ形で、この記事では当該プログラムを改修しながら、よく利用するいくつかの基本的な機能を解説していきます。
参考記事:MQLプログラミング言語で3本表示のRCIを作成する方法
まずはボタンオブジェクトを描画する方法です。このプログラムを1から作ると時間がかかってしまうので、MQL4リファレンスでサンプルコードをコピーして使います。MQL4リファレンスは、メニューバーの「ヘルプ」→「MQL4リファレンス」を選択すると立ち上げることができます。
MQL4リファレンスを立ち上げたら、画面左にある目次の「Constants, Enumerations and Structures」→「Object Constants」→「Object Types」→「OBJ_BUTTON」を選びます。すると、ボタンを描画するためのサンプルコードが出てくるので、「Create the button」のコード(bool ButtonCreateから始まる関数)をコピーし、任意の箇所に貼り付けます。
このButtonCreate関数をinit関数のところに記述します。初期値があらかじめ入っているので、何も指定しなくてもコンパイルするとチャート画面左上にボタンが作られます。
ButtonCreate();
これが初期状態のボタンです。ただし、このままではボタンを一度作ると二度目からの変更ができないようになっているので、「パラメーターが変更されたとき(REASON_PARAMETERS)」「コンパイルされたとき(REASON_RECOMPILE)」「チャートからインジケーターが削除されたとき(REASON_REMOVE)」にボタンを一旦リセットするように、OnDeinit関数の中に次の式を記述していきます。
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, "3RCI_Sign_");
if (reason == REASON_PARAMETERS || reason == REASON_RECOMPILE || reason == REASON_REMOVE)
ObjectDelete(“Button”);
}
これでパラメーターが変更されたときなどにボタンを消すことができます。
パラメーターを変更
追加したボタンのパラメーターの設定をしていきます。
まず一つ目を「0」にします。これはどのチャートに表示するかを指定するもので、0は今表示されているチャートを表します。
ボタンの名前は「Button」にして、次はサブウィンドウの番号を選びます。今回は一番目のサブウィンドウに表示したいので「1」としますが、二番目のサブウィンドウにも機能するようにChartWindowFind関数にします。この関数を使用すると、自分のインジケーターのあるウィンドウの番号が自動的に入るようになります。
そして、最後にボタンの座標を指定します。今回はX軸が「0」、Y軸は少し下の方に下げて表示するため「15」としておきます。
ButtonCreate(0, “Button”, ChartWindowFind(), 0, 15);
これでコンパイルすると、ボタンがチャートの左上からサブウィンドウに移動したのが分かります。
なお、パラメーターは初期値を変更することでも指定できます。例えば、「Button」というテキストを「Sign」に変更してコンパイルすれば、ボタンの文字がSignに変わります。
矢印の表示/非表示を切り替える
続いて、ボタンの操作でチャート上に表示さている矢印の表示/非表示を切り替える機能を実装していきます。具体的には、ボタンが押されたときに(ONの状態のときに)矢印を表示し、戻ったときに(OFFの状態のときに)非表示にする方法です。
まず、ボタンの初期状態がオフになっているので、パラメータの「state」の部分を「true」に変更します。これでボタン描画時の最初の状態が、押された状態になります。そしてfor文の中にボタンが押されていなかったときの条件を加えます。押されていなかったときの条件なので、否定の論理演算子「!」をつけます。
if (!ObjectGetInteger(0, "Button", OBJPROP_STATE)) continue;
これでコンパイルすると、ボタン操作(オン/オフ)で、矢印の表示/非表示を切り替えることができます。ただし、このプログラムはstart関数なのでティックが配信されるまで反応しないようになっており、ボタンを押した瞬間には表示/非表示が切り替わりません。そこで活用したいのが「OnChartEvent」関数です。この関数もMQL4リファレンスからサンプルコードをコピーして利用します。
今回使うのは、ボタンがクリックされたときに処理を実行するチャートイベントのオブジェクトクリックです。MQL4リファレンスの目次にある「Constants, Enumerations and Structures」→「Chart Constants」→「Types of Chart Events」を選ぶと一覧画面が表示されるので、その中の「ChartEvent function」のコードをコピーし、start関数の下に貼り付けます。
実際に使うのは、CHARTEVENT_OBJECT_CLICKのコードなので、CHARTEVENT_CLICKのコードは消しましょう。今回はボタンをクリックしたときだけ処理を実行したいので、Print関数の前に次のif文を追加します。
if (sparam == “Button”) {
これでコンパイルすると、ボタンを押したときだけ機能する動きが確認できます。
続いて、DrawArrowという関数を一つ定義して、この中で矢印を描画するためのプログラムを記述します。以下のコンテンツを、御覧ください。
本記事の監修者・HT FX
2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。