恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

[MQL5]買いラインの表示・非表示を切り替える手間を減らしたい・・・

インジ作成の背景

MT5でトレードする時に買いライン(Ask価格を表すライン)を表示させることがあるのですが、そのたびに

(1)チャート上で右クリック
(2)プロパティを開く
(3)「表示」タブの中にある『買いラインを表示』を選択

という風にして、買いラインを表示させています。
はっきり言って面倒くさいです(汗)。

私が知らないだけでもっと手軽な方法があるのかもしれませんが、この手間を軽くするために簡単なインジケーターを1つ作ってみました。

【備考】この記事に登場するコードはMT5用です(MT4では動作しません)。

インジの使い方

インジをチャートに挿入すると、買いラインの表示・非表示を切り替えるボタンが現れます。

チャート上に買いラインが表示されていない時にこのボタンをクリックすると、買いラインが表示されます。一方、買いラインが表示されている時にこのボタンをクリックすると、買いラインが表示されなくなります。



コード(MT5用)

MQL5のヘルプに載っているコードはもう少し真面目な作りになっていますが(たとえば、ChartSetInteger関数が成功したかチェックする等)、以下のコードではそこまでやっていません(ぼそっ)。

#property copyright "Copyright 2022. PHILOJUAN"
#property link      "https://uhoho.hatenablog.jp/"
#property strict
#property indicator_chart_window
#property indicator_plots   0

// ボタンのパラメーター
input int buttonXdis1 = 70; // ボタンの表示位置(X軸)
input int buttonYdis1 = 75; // ボタンの表示位置(Y軸)

string buttonName = "GKKZPQ_SWITCHASK_BUTTON";  // ボタン名

//------------------------------------------------------------------
//  初期化 (インジケーター挿入時の処理)
//------------------------------------------------------------------
int OnInit()
{
    CreateButton(buttonName, "Ask_OFF", CORNER_RIGHT_UPPER, buttonXdis1, buttonYdis1,
                 60, 17, 7, clrWhite, clrNONE, clrGray);

    // Askラインが既に表示されている場合は、ボタン内のテキストと押下状態を変更
    if(ChartGetInteger(0, CHART_SHOW_ASK_LINE)) {
        ObjectSetString (0, buttonName, OBJPROP_TEXT, "Ask_ON");
        ObjectSetInteger(0, buttonName, OBJPROP_STATE, true);
    }

    return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
// Tick受信ごとに行う処理                     (今回は処理なし)
//------------------------------------------------------------------
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 OnDeinit(const int reason)
{
    ObjectDelete(0, buttonName);  // ボタンを除去
    ChartRedraw();
}

//------------------------------------------------------------------
//  ボタンをクリックしたら、Askラインの表示・非表示を切り替える
//------------------------------------------------------------------
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
    if(id == CHARTEVENT_OBJECT_CLICK && sparam == buttonName) {
        
        // ボタンが押下状態 → Askラインを表示 / ボタンが押下状態でない → Askラインを非表示
        long buttonState = ObjectGetInteger(0, buttonName, OBJPROP_STATE);  // 0 か 1 しか返ってこないので、buttonStateは bool型でも可(ぼそっ)
        ChartSetInteger(0, CHART_SHOW_ASK_LINE, buttonState ? true : false);
        ObjectSetString (0, buttonName, OBJPROP_TEXT, buttonState ? "Ask_ON" : "Ask_OFF");
        ChartRedraw();
    }
}

//--------------------------------------------------------------------
// ボタンを作成する関数
//--------------------------------------------------------------------
void CreateButton(string name,        // オブジェクト名
                  string caption,     // ボタン内に表示するテキスト
                  int corner,         // 基点(ボタンを配置する時に基準とする場所)
                  int xshift,         // 基点からの距離(横方向)
                  int yshift,         // 基点からの距離(縦方向)
                  int xsize,          // ボタンのサイズ(横)
                  int ysize,          // ボタンのサイズ(縦)
                  int font_Size,      // ボタン内に表示するテキストのサイズ
                  color textColor,    // ボタン内に表示するテキストの色
                  color bo_color,     // ボタンの縁の色
                  color bg_Color)     // ボタンの色
{
    ObjectCreate(    0, name, OBJ_BUTTON, 0, 0, 0);
    ObjectSetInteger(0, name, OBJPROP_CORNER, corner);
    ObjectSetInteger(0, name, OBJPROP_XDISTANCE, xshift);
    ObjectSetInteger(0, name, OBJPROP_YDISTANCE, yshift);
    ObjectSetInteger(0, name, OBJPROP_XSIZE, xsize);
    ObjectSetInteger(0, name, OBJPROP_YSIZE, ysize);
    ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, bo_color);
    ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bg_Color);
    ObjectSetString (0, name, OBJPROP_TEXT, caption);
    ObjectSetString (0, name, OBJPROP_FONT, "Arial");
    ObjectSetInteger(0, name, OBJPROP_FONTSIZE, font_Size);
    ObjectSetInteger(0, name, OBJPROP_COLOR, textColor);
    ObjectSetInteger(0, name, OBJPROP_STATE, false);
    ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
    ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
    ObjectSetInteger(0, name, OBJPROP_SELECTED, false);
    ObjectSetInteger(0, name, OBJPROP_ZORDER, 0);
}