【MQL5】チャートに改行付きテキストを表示するインジケーターコード公開

チャート上にテキストを表示

【MQL5】チャート上に複数行のテキストを表示するインジケーターコードを公開しています。実際には改行ではなく、複数のテキストラベルを縦に並べることで改行風に見せています。これは、MQL5ではテキストボックスに直接改行を入れる機能が用意されていないためです。

チャートに改行付きテキストを表示するインジケーターコード公開


//+------------------------------------------------------------------+
//| テキストボックス表示のみのインジケーター|
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_plots 0
#property strict

string textboxName   = "TopTextbox";
string textboxBGName = "TopTextbox_BG";

//+------------------------------------------------------------------+
//| 初期化                                                           |
//+------------------------------------------------------------------+
int OnInit()
{
   CreateTopTextbox();
   return INIT_SUCCEEDED;
}

//+------------------------------------------------------------------+
//| ダミーの OnCalculate                                             |
//+------------------------------------------------------------------+
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 CreateTopTextbox()
{
   string texts[] = {
      "これは1行目です。",
      "これは2行目です。"
   };

   int baseX = 20;
   int baseY = 60;
   int spacing = 20;

   ObjectDelete(0, textboxBGName);
   ObjectCreate(0, textboxBGName, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, textboxBGName, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, textboxBGName, OBJPROP_XDISTANCE, 10);
   ObjectSetInteger(0, textboxBGName, OBJPROP_YDISTANCE, 50);
   ObjectSetInteger(0, textboxBGName, OBJPROP_XSIZE, 900);
   ObjectSetInteger(0, textboxBGName, OBJPROP_YSIZE, 80);
   ObjectSetInteger(0, textboxBGName, OBJPROP_BGCOLOR, clrWhite);
   ObjectSetInteger(0, textboxBGName, OBJPROP_BORDER_TYPE, BORDER_RAISED);
   ObjectSetInteger(0, textboxBGName, OBJPROP_WIDTH, 1);
   ObjectSetInteger(0, textboxBGName, OBJPROP_HIDDEN, false);

   for (int i = 0; i < ArraySize(texts); i++)
   {
      string lineName = textboxName + "_line" + (string)i;
      ObjectDelete(0, lineName);
      ObjectCreate(0, lineName, OBJ_LABEL, 0, 0, 0);
      ObjectSetInteger(0, lineName, OBJPROP_CORNER, CORNER_LEFT_UPPER);
      ObjectSetInteger(0, lineName, OBJPROP_XDISTANCE, baseX);
      ObjectSetInteger(0, lineName, OBJPROP_YDISTANCE, baseY + i * spacing);
      ObjectSetInteger(0, lineName, OBJPROP_COLOR, clrBlack);
      ObjectSetInteger(0, lineName, OBJPROP_FONTSIZE, 14);
      ObjectSetInteger(0, lineName, OBJPROP_HIDDEN, false);
      ObjectSetString(0, lineName, OBJPROP_TEXT, texts[i]);
   }
}

//+------------------------------------------------------------------+
//| 終了時にオブジェクト削除                                         |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   ObjectDelete(0, textboxBGName);
   for (int i = 0; i < 2; i++)
      ObjectDelete(0, textboxName + "_line" + (string)i);
}

#propertyの設定(インジケーターの基本構成)

プロパティ 説明
indicator_chart_window メインチャート上にインジケータを表示。
indicator_plots 0 ラインやシグナルなどの描画は行わない時の処理。
strict 古い書き方やミスを防ぐためのチェックが有効になり、コードの安定性が上がります。

使われている変数の説明

変数名 内容
textboxName 文字を表示するときの名前の最初の部分です。行ごとに「_line0」や「_line1」などをつけて、どの行かを区別します。
textboxBGName 文字の背景となる白いボックスの名前です。背景が無いとテキストがローソク足やチャートの線と重なって見づらくなることがあります。

OnInit() の処理内容

処理 説明
CreateTopTextbox() チャートに複数行のテキストと白い背景ボックスを表示する処理を行います。

CreateTopTextbox() の動き

ステップ やっていること
表示する文章を texts[] 配列に定義します。ここでは2行分のテキストを設定しています。
白い背景ボックス(OBJ_RECTANGLE_LABEL)を表示して、文字を見やすくします。
テキストは1行ずつ OBJ_LABEL として作成し、縦に並べて表示します。これにより改行されているように見せています。

OnCalculate() の役割

処理 説明
再計算なし 価格やインジケーターの計算は行わないため、rates_total をそのまま返すだけの処理です。

OnDeinit() の処理内容

処理 説明
ObjectDelete() チャートに表示された背景ボックスとテキストラベルをすべて削除します。インジケーターを停止したときに画面が元通りになるようにするためです。