MT4/MT5でボタンを配置してみよう@MQLプログラミング

MQLプログラミング

インジケータやEAにボタンを配置したいと思ったことはありませんか?
シンプルにボタンを配置して、ON/OFFで表示を切り替える方法を伝授します!

なお、描画関係のプログラムはMT4/MT5共通でどちらでも使えます!

完成イメージ

ボタンON/ボタンOFFをComment関数を使って表示するだけ

プログラム

黄色マーカの箇所をデフォルトのインジケータから書き加えました。

//+------------------------------------------------------------------+
//|                                            yIND_Button.mql4/mql5 |
//|                                   Copyright Rikei Trader Yoshiki |
//+------------------------------------------------------------------+
//|------------------------------------------------------------------+
//|   プログラムの解説
//|   ボタンを使ってみよう
//|
//|   
//+------------------------------------------------------------------+
// ---変更履歴                        
//Ver1.0 210915 デモ用に新規作成

// ---インクルード設定

// ---プロパティ設定
#property copyright "Copyright Rikei Trader Yoshiki."
#property version   "1.0"
#property description "yIND_Button"
#property indicator_chart_window    //メインウィンドウに表示
#property indicator_buffers 1       //インディケータに表示するバッファの総数を定義
#property indicator_plots   1       //インディケータに表示するplot総数を定義
#property strict                    //MT4でインプット定数を日本語にする

// ---ボタンパラメータ
string            Btn_Name="Button";                  // ボタンの名称
int               Btn_Xpos = 100;                     // ボタンのX座標
int               Btn_Ypos = 100;                     // ボタンのY座標
int               Btn_Xsize = 100;                    // ボタンのXサイズ
int               Btn_Ysize = 100;                    // ボタンのYサイズ
string            Btn_Message = "Test";               // ボタンメッセージ
string            Btn_Font = "Arial";                 // ボタンのフォント
int               Btn_FontSize = 10;                  // ボタンのフォントサイズ
color             Btn_Color = clrBlack;               // ボタンの文字カラー
color             Btn_BackColor = C'236,233,216';     // ボタンの背景カラー
ENUM_BASE_CORNER  Btn_Corner=CORNER_LEFT_UPPER;       // アンカーに使用されるチャートのコーナー
color             Btn_BorderColor=clrNONE;            // 境界線の色
bool              Btn_State=false;                    // 押される/放される
bool              Btn_Back=false;                     // 背景オブジェクト
bool              Btn_Selection=false;                // 強調表示して移動
bool              Btn_Hidden=true;                    // オブジェクトリストに隠す
long              Btn_ZOrder=0;                       // マウスクリックの優先順位

//+------------------------------------------------------------------+
//| 初期化関数の定義                                                 |
//+------------------------------------------------------------------+
int OnInit(){

// ---ボタン作成
   ButtonCreate(0,Btn_Name,0,Btn_Xpos,Btn_Ypos,Btn_Xsize,Btn_Ysize,Btn_Corner,Btn_Message,Btn_Font,Btn_FontSize,
     Btn_Color,Btn_BackColor,Btn_BorderColor,Btn_State,Btn_Back,Btn_Selection,Btn_Hidden,Btn_ZOrder);
 
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 更新処理関数の定義                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);
  }


//+------------------------------------------------------------------+
//| ティック時関数の定義                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
}

//+------------------------------------------------------------------+
//| イベント関数の定義                                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
{
   bool GetBtnState = ObjectGetInteger(0,Btn_Name,OBJPROP_STATE);
   string mes;
// ---ボタン1処理
   if(GetBtnState == 1)//ボタンON
      mes = "ボタンON";
   if(GetBtnState == 0)//ボタンOFF
      mes = "ボタンOFF";
   Comment(mes);
}


//+------------------------------------------------------------------+
//| 終了時関数の定義                                                    |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectDelete(0,Btn_Name);
}

//+------------------------------------------------------------------+
//| ボタンを作成する                                                      |
//+------------------------------------------------------------------+
bool ButtonCreate(const long            chart_ID=0,               // チャート識別子
                const string            name="Button",            // ボタン名
                const int               sub_window=0,             // サブウィンドウ番号
                const int               x=0,                      // X 座標
                const int               y=0,                      // Y 座標
                const int               width=50,                 // ボタンの幅
                const int               height=18,                // ボタンの高さ
                const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // アンカーに使用されるチャートのコーナー
                const string            text="Button",            // テキスト
                const string            font="Arial",             // フォント
                const int               font_size=10,             // フォントサイズ
                const color             clr=clrBlack,             // テキストの色
                const color             back_clr=C'236,233,216',  // 背景色
                const color             border_clr=clrNONE,       // 境界線の色
                const bool              state=false,              // 押される/放される
                const bool              back=false,               // 背景で表示する
                const bool              selection=false,          // 強調表示して移動
                const bool              hidden=true,              // オブジェクトリストに隠す
                const long              z_order=0)                // マウスクリックの優先順位
 {
//--- エラー値をリセットする
  ResetLastError();
//--- ボタンを作成する
  if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
    {
    Print(__FUNCTION__,
          ": failed to create the button! Error code = ",GetLastError());
    return(false);
    }
//--- ボタン座標を設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
  ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- ボタンサイズを設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
  ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
//--- ポイント座標が相対的に定義されているチャートのコーナーを設定
  ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- テキストを設定する
  ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- テキストフォントを設定する
  ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- フォントサイズを設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- テキストの色を設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- 背景色を設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
//--- 境界線の色を設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
//--- 前景(false)または背景(true)に表示
  ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- ボタンの状態を設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
//--- マウスでのボタンを移動させるモードを有効(true)か無効(false)にする
  ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
  ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- オブジェクトリストのグラフィックオブジェクトを非表示(true)か表示(false)にする
  ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- チャートのマウスクリックのイベントを受信するための優先順位を設定する
  ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- 実行成功
  return(true);
 }

よくわかる解説

ボタンを使った条件分岐がポイントなので解説しますね。

void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
{
   bool GetBtnState = ObjectGetInteger(0,Btn_Name,OBJPROP_STATE);
   string mes;
// ---ボタン1処理
   if(GetBtnState == 1)//ボタンON
      mes = "ボタンON";
   if(GetBtnState == 0)//ボタンOFF
      mes = "ボタンOFF";
   Comment(mes);
}

ボタンのON/OFF判断は、ChartEventの中で記載します。マウスやキーボード操作があるとこのイベントが呼ばれます。Oncalculate や Startで書いてもいいですが、ちょっと更新が遅いのでこちらがおすすめです。

ObjectGetInteger 関数を使ってボタンのON/OFFを取得します。あとはif分を使って、ONのとき、OFFの時の処理を記載していきます。今回はComment()で表示するだけですが、応用して色々なインジケータ・EAに活用してみてください。

もしよろしければ、自作インジケータについてもご覧いただけると幸いです。

コメント

タイトルとURLをコピーしました