[MQL] チャートに画像ファイルを表示する方法

MQLでチャートに画像ファイルを表示したい場合のプログラムの書き方を説明します。

チャートに画像ファイルを表示させる

MQLでは、任意の「bmp(ビットマップ)ファイル」を呼び出してチャートに表示することができます。

利用シーンとしては、例えば「インジのサインを独自の画像で表示」したり「ボタン等のインターフェイスに画像を表示」したりする場合などです。画像を使うことによって直感的にわかりやすくしたり、表示スペースを小さくする場合などに有効です。

なお、表示できる画像ファイルはbmp形式のみです。他の形式(jpgやpngなど)は表示できません。

またbmpは透過色には非対応です。透明な画像は表示できませんのでご注意ください。

画像ファイルの保存場所

表示したいbmpファイルは「メニュー」→「データフォルダを開く」の先にある「MQL4」フォルダの中に保存します。MQL4フォルダ以下に適当な名前のフォルダを作成してその中にbmpを保存すると分かりやすいでしょう。

またMQL4¥Include¥Controls¥resフォルダには標準でたくさんのbmpファイルが用意されています。一般的なボタンなどであればここにあるbmpファイルを使用すれば新たに画像を用意する必要がないため簡単です。(下図)

標準で用意されているbmp画像ファイル

↑よくありがちなボタン類のbmpはもともとそろってますので、ここの画像を使うのもアリです。イメージに合う画像が無ければ自分で作成して用意しましょう。

画像ファイルの表示方法

画像ファイルはObjectCreate()にてオブジェクトを生成することにより表示します。引数のオブジェクトタイプにはOBJ_BITMAP_LABELまたは、OBJ_BITMAPを指定します。

また表示する画像ファイルはObjectSetString()で指定します。

書き方は以下の通り(OBJ_BITMAP_LABELの場合)。

ObjectCreate(0, オブジェクト名, OBJ_BITMAP_LABEL, 0, 0, 0);
ObjectSetString (0, オブジェクト名, OBJPROP_BMPFILE, 0, ファイルパス); 

OBJ_BITMAP_LABELOBJ_BITMAPは、下表のように表示する座標系によって使い分けます。

オブジェクトタイプ 用途
OBJ_BITMAP_LABEL 画像の表示位置を(X, Y)座標で指定する
OBJ_BITMAP 画像の表示位置を(time, price)座標で指定する

画像ファイルの表示カスタマイズ

画像ファイルの表示は、プロパティでいくつかカスタマイズすることができます。座標関係のプロパティが少しややこしいので下にまとめます。(表はOBJ_BTMAP_LABELの場合)

プロパティ カスタマイズ内容
OBJPROP_XDISTANCE チャートのX座標(画像を表示させる座標の指定)
OBJPROP_YDISTANCE チャートのY座標(画像を表示させる座標の指定)
OBJPROP_CORNER チャートのXY座標の原点とするコーナー
OBJPROP_ANCHOR 画像のアンカー位置
OBJPROP_XSIZE 表示サイズ(X方向)を指定。元の画像のXサイズよりも小さい値を指定することで画像の一部のみ切り出して表示される。(※1)
OBJPROP_YSIZE 表示サイズ(Y方向)を指定。元の画像のYサイズよりも小さい値を指定することで画像の一部のみ切り出して表示される。(※1)
OBJPROP_XOFFSET 画像を切り出して表示する場合の切り出し開始位置(X方向)を指定。
OBJPROP_YOFFSET 画像を切り出して表示する場合の切り出し開始位置(Y方向)を指定。

※1:画像を縮小表示するわけではなく、画像の一部が切り取られたような表示となります。また元の画像サイズよりも大きな値を指定すると、画像が表示されなくなるので注意してください。

OBJPROP_XSIZEOBJPROP_XOFFSETなどの画像切り出しが少し分かりにくいのですが、自分で画像を用意してプロパティを適当に変えて試すと理解しやすいと思います。または、ジャストサイズの画像を用意すればこのあたりのややこしいプロパティを使わなくても済みます。

画像ファイルを表示するサンプルコード

サンプルコードを用意しました。下記コードは標準で用意されているHelpOn.bmpを表示します。

//+------------------------------------------------------------------+
  //|                                          bitmap_label_sample.mq4 |
  //|                                                     minagachi FX |
  //|                                            https://minagachi.com |
  //+------------------------------------------------------------------+
  #property copyright "minagachi FX"
  #property link      "https://minagachi.com"
  #property version   "1.00"
  #property strict
  #property indicator_chart_window
  
  string obj_name  = "label";
  string file_path = "\\Include\\Controls\\res\\HelpOn.bmp";
  
  //+------------------------------------------------------------------+
  //| Custom indicator initialization function                         |
  //+------------------------------------------------------------------+
  int OnInit(){
  
     //画像オブジェクト生成
     ObjectCreate(0, obj_name, OBJ_BITMAP_LABEL, 0, 0, 0);
  
     //画像ファイルを指定
     ObjectSetString (0, obj_name, OBJPROP_BMPFILE, 0, file_path); 
  
     //チャートの原点コーナー
     ObjectSetInteger(0, obj_name, OBJPROP_CORNER, CORNER_LEFT_UPPER); 
     
     //画像のアンカー位置
     ObjectSetInteger(0, obj_name, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER); 
     
     //表示位置(XY座標)
     ObjectSetInteger(0, obj_name, OBJPROP_XDISTANCE, 100);
     ObjectSetInteger(0, obj_name, OBJPROP_YDISTANCE, 100);
  
     //下記は必要に応じて数値を変えて使用する(サイズのカスタマイズ)
     //ObjectSetInteger(0, obj_name, OBJPROP_XSIZE, 0); 
     //ObjectSetInteger(0, obj_name, OBJPROP_YSIZE, 0); 
     //ObjectSetInteger(0, obj_name, OBJPROP_XOFFSET, 0); 
     //ObjectSetInteger(0, obj_name, OBJPROP_YOFFSET, 0); 
  
     return(INIT_SUCCEEDED);
  }
  //+------------------------------------------------------------------+
  //| Custom indicator termination function                            |
  //+------------------------------------------------------------------+
  void OnDeinit(const int reason)
  {
     //画像削除
     ObjectDelete(obj_name);
  }
  //+------------------------------------------------------------------+
  //| Custom indicator iteration function                              |
  //+------------------------------------------------------------------+
  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);
  }
  //+------------------------------------------------------------------+

このサンプルコードを実行すると下図のようになります。

画像ファイルの表示結果

まとめ

MQLでチャートに画像ファイルを表示する方法を説明しました。

何かのサインやUIを画像で表示すると、直感的に分かりやすくすることができます。やりすぎない程度で画像を使ってみるのも良いかもしれませんね。

それでは。

コメント

この記事へのコメント(0 件)