FX自動売買基礎と応用

Labelオブジェクトでマークや簡易チェックボックスを表示する自動売買の作成方法


Labelオブジェクトを設定


この記事では、Labelオブジェクトでマークや記号を表示する方法を解説します。

通常、マークや記号はArrowオブジェクトで表示しますが、Labelオブジェクトを利用することでアンカー(基準)位置をセンターにしたり、XY座標で配置したりできます。例えば、チャートの左上の隅にマークや記号を表示できるので、視認性の良いインジケーターを作るのに役立ちます。

初めにファイルの新規作成で「カスタムインディケータ」を選択し、ファイル名を「TextTest」とします。パラメーターは追加せず次へ進み、「カスタムインディケータのイベントハンドラ」の画面で「OnChartEvent」にチェックを入れます。次の画面で「完了」をクリックすれば、ひな形の完成です。

「カスタムインディケータのイベントハンドラ」の画面で「OnChartEvent」にチェック

今回は記号を集めた特殊なフォントを使い、文字コードを指定してマークを表示します。

まずLabelオブジェクトのサンプルコードを、MQL4リファレンスからコピーして使います。MQL4リファレンスの目次にある「Constants, Enumerations and Structures」→「Objects Constants」→「Object Types」をクリックするとオブジェクトの一覧が表示されるので、その中から「OBJ_LABEL」を選択し、あらかじめ用意されている「Create a text label」のコードをコピーしてファイル下部に貼り付けます。

「//--- reset the error value」「ResetLastError();」の2行と、「Print(__FUNCTION__,」「”: failed to create text label! Error code = “,GetLastError());」の2行は不要なので削除してください。


//+------------------------------------------------------------------+ 
//| Create a text label                                              | 
//+------------------------------------------------------------------+ 
bool LabelCreate(const long              chart_ID=0,               // chart's ID 
                 const string            name="Label",             // label name 
                 const int               sub_window=0,             // subwindow index 
                 const int               x=0,                      // X coordinate 
                 const int               y=0,                      // Y coordinate 
                 const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // chart corner for anchoring 
                 const string            text="Label",             // text 
                 const string            font="Arial",             // font 
                 const int               font_size=10,             // font size 
                 const color             clr=clrRed,               // color 
                 const double            angle=0.0,                // text slope 
                 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // anchor type 
                 const bool              back=false,               // in the background 
                 const bool              selection=false,          // highlight to move 
                 const bool              hidden=true,              // hidden in the object list 
                 const long              z_order=0)                // priority for mouse click 
{ 
//--- create a text label 
   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0)) { 
      return(false); 
   } 
//--- set label coordinates 
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 
//--- set the chart's corner, relative to which point coordinates are defined 
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 
//--- set the text 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 
//--- set text font 
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 
//--- set font size 
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 
//--- set the slope angle of the text 
   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle); 
//--- set anchor type 
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); 
//--- set color 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- display in the foreground (false) or background (true) 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- enable (true) or disable (false) the mode of moving the label by mouse 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- hide (true) or display (false) graphical object name in the object list 
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- set the priority for receiving the event of a mouse click in the chart 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- successful execution 
   return(true); 
}


「CharToStr」で文字コードを指定


設定したLabelCreateは、OnInit関数内に記述します。

パラメーターの指定で、名前は「Text0」、X位置、Y位置は「10」、配置場所は左上にしたいので「CORNER_LEFT_UPPER」とします。ここで文字コードを文字列に変換する「CharToStr」を使い、カッコ内にコードを入力します。今回は白抜きの上矢印を使うので「221」を指定しましょう。

フォントは「Wingdings」、サイズは「100」、色は「White」としておきます。

また、オブジェクトを消してから表示するようにしたいので、指定された型のオブジェクトをチャートから全て削除する「ObjectsDeleteAll」をLabelCreateの上で実行します。


ObjectsDeleteAll(0, "Text");
LabelCreate(0, "Text0", 0, 10, 10, CORNER_LEFT_UPPER, CharToStr(221), "Wingdings", 100, clrWhite);

これでコンパイルしてチャートにセットすると、左上に白抜きの上矢印が表示されることが分かります。

左上に白抜きの上矢印が表示

なお、CharToStrで指定している文字コードを「221」から「222」にすると、白抜きの下矢印に変わります。Wingdingsフォントのコード番号とマークの対応については、MQL4リファレンスに記載されています。

MQL4のリファレンス

白抜きの下矢印に変化


背景付きのテキストを表示


Labelオブジェクトを使ってチャートの左上に白抜きの上矢印や下矢印を表示する方法を応用して、背景付きのテキストを表示する方法を紹介します。

まず背景の準備です。先ほどは「Wingdings」という記号を集めた特殊なフォントを利用しましたが、今回は「Webdings」を使います。

背景として表示したいのは、Webdingsの文字コード「103」に該当する大きな「■」です。文字コードではなく、対応するアルファベットで指定することもできるので、ここでは■に対応しているアルファベットの「g」で指定します。赤背景にしたいので、色を「Red」にしましょう。


LabelCreate(0, "Text_back", 0, 250, 100, CORNER_LEFT_UPPER, "g", "Webdings", 100, clrRed);

続いて、背景となる■の上に表示するテキストを作ります。ここでは試しに「a」というテキストを白字で表示するので、次のように指定します。


LabelCreate(0, "Text_text", 0, 250, 100, CORNER_LEFT_UPPER, "a", "メイリオ", 100, clrWhite);

背景とテキストはセンター合わせにしたいので、「Create a text label」に記述されているLabelCreateのパラメーターを変更します。「// anchor type」のところのアンカーポイントを「ANCHOR_LEFT_UPPER」から「ANCHOR_CENTER」に変えましょう。


const ENUM_ANCHOR_POINT anchor = ANCHOR_CENTER, // anchor type

また、前回表示した下矢印と並べて表示したいので、下矢印のX位置とY位置を共に「10」から「100」に変更します。


LabelCreate(0, "Text0", 0, 100, 100, CORNER_LEFT_UPPER, CharToStr(222), "Wingdings", 100, clrWhite);

これでコンパイルすると、赤い■を背景とした白字の「a」が下矢印の横に並んで表示されることが分かります。

赤い■を背景とした白字の「a」が下矢印の横に並んで表示


表示するテキストの数を増やす


このようにLabelオブジェクトによるマークや記号を活用すれば、背景付きのテキストを簡単に作ることができます。上で紹介したのは1文字のみの表示方法ですが、テキストの数は簡単に増やすことが可能です。

例えば「MQL」という3文字を表示したい場合、背景となる■を三つ用意します。コードのgは一つで■一つを表すので、「ggg」と指定すれば三つの■を表示することができます。


LabelCreate(0, "Text_back", 0, 250, 100, CORNER_LEFT_UPPER, "ggg", "Webdings", 100, clrRed);

あとはテキストの文字を「MQL」に変更するだけです。「a」としていたところを「MQL」に変えましょう。


LabelCreate(0, "Text_text", 0, 250, 100, CORNER_LEFT_UPPER, "MQL", "メイリオ", 100, clrWhite);

これでコンパイルすると、チャート上に赤い■を背景とした白字の「MQL」が描かれます。

赤い■を背景とした白字の「MQL」が表示


簡易チェックボックスを作成


続いて、簡易的なチェックボックスを作っていきます。

まずはLabelCreateで「Wingdings」の文字コード「111」に該当する四角を表示します。X位置とY位置は共に「250」、色は「Aqua」としましょう。


LabelCreate(0, “Text_box”, 0, 250, 250, CORNER_LEFT_UPPER, CharToStr(111), “Wingdings”, 100, clrAqua);

これでコンパイルすると、チャートに水色の四角が表示されます。

チャートに水色の四角が表示

この水色の四角をクリックしたときに、「Wingdings」の文字コード「254」に該当するチェックボックスのマーク(四角にチェックが入っているマーク)に切り替わるようにします。

OnChartEvent配下に次のif文を加えましょう。この記述で、クリックしたオブジェクトが「Text_box」で、かつそのオブジェクトの文字コードが「111」だった場合は「254」のチェックの入ったマークをセットする処理が、そうではなかった場合は「111」の四角に戻す処理が実行されます。


if (id == CHARTEVENT_OBJECT_CLICK) {
if (sparam == “Text_box”) {
if (ObjectGetString(0, sparam, OBJPROP_TEXT) == CharToStr(111)) ObjectSetString(0, sparam, OBJPROP_TEXT, CharToStr(254));
else ObjectSetString(0, sparam, OBJPROP_TEXT, CharToStr(111));
}
}

これでコンパイルし、チャートの水色の四角をクリックすると、チェックの入ったマークに切り替わります。また、クリックするたびに、チェックありのマークとチェックなしのマークが切り替わるのが分かります。

このようにLabelオブジェクトを利用することで、簡易的なチェックボックスを作ることが可能です。

クリックするたびに、チェックありのマークとチェックなしのマークが切り替わる


ソースコード


今回、作成したソースコードは下記の通りです。


//+------------------------------------------------------------------+
//| TextTest.mq4 |
//| Copyright 2022, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright “Copyright 2022, MetaQuotes Software Corp.”
#property link “https://www.mql5.com”
#property version “1.00”
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
ObjectsDeleteAll(0, “Text”);
LabelCreate(0, “Text0”, 0, 100, 100, CORNER_LEFT_UPPER, CharToStr(222), “Wingdings”, 100, clrR);
LabelCreate(0, “Text_back”, 0, 250, 100, CORNER_LEFT_UPPER, “ggg”, “Webdings”, 100, clrRed);
LabelCreate(0, “Text_text”, 0, 250, 100, CORNER_LEFT_UPPER, “MQL”, “メイリオ”, 100, clrWhite);
LabelCreate(0, “Text_box”, 0, 250, 250, CORNER_LEFT_UPPER, CharToStr(111), “Wingdings”, 100, clrAqua);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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 value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
if (id == CHARTEVENT_OBJECT_CLICK) {
if (sparam == “Text_box”) {
if (ObjectGetString(0, sparam, OBJPROP_TEXT) == CharToStr(111)) ObjectSetString(0, sparam, OBJPROP_TEXT, CharToStr(254));
else ObjectSetString(0, sparam, OBJPROP_TEXT, CharToStr(111));
}
}
}
//+------------------------------------------------------------------+
//| Create a text label |
//+------------------------------------------------------------------+
bool LabelCreate(const long chart_ID = 0, // chart’s ID
const string name = “Label”, // label name
const int sub_window = 0, // subwindow index
const int x = 0, // X coordinate
const int y = 0, // Y coordinate
const ENUM_BASE_CORNER corner = CORNER_LEFT_UPPER, // chart corner for anchoring
const string text = “Label”, // text
const string font = “Arial”, // font
const int font_size = 10, // font size
const color clr = clrRed, // color
const double angle = 0.0, // text slope
const ENUM_ANCHOR_POINT anchor = ANCHOR_CENTER, // anchor type
const bool back = false, // in the background
const bool selection = false, // highlight to move
const bool hidden = true, // hidden in the object list
const long z_order = 0) // priority for mouse click
{
//--- create a text label
if(!ObjectCreate(chart_ID, name, OBJ_LABEL, sub_window, 0, 0)) {
return(false);
}
//--- set label coordinates
ObjectSetInteger(chart_ID, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(chart_ID, name, OBJPROP_YDISTANCE, y);
//--- set the chart’s corner, relative to which point coordinates are defined
ObjectSetInteger(chart_ID, name, OBJPROP_CORNER, corner);
//--- set the text
ObjectSetString(chart_ID, name, OBJPROP_TEXT, text);
//--- set text font
ObjectSetString(chart_ID, name, OBJPROP_FONT, font);
//--- set font size
ObjectSetInteger(chart_ID, name, OBJPROP_FONTSIZE, font_size);
//--- set the slope angle of the text
ObjectSetDouble(chart_ID, name, OBJPROP_ANGLE, angle);
//--- set anchor type
ObjectSetInteger(chart_ID, name, OBJPROP_ANCHOR, anchor);
//--- set color
ObjectSetInteger(chart_ID, name, OBJPROP_COLOR, clr);
//--- display in the foreground (false) or background (true)
ObjectSetInteger(chart_ID, name, OBJPROP_BACK, back);
//--- enable (true) or disable (false) the mode of moving the label by mouse
ObjectSetInteger(chart_ID, name, OBJPROP_SELECTABLE, selection);
ObjectSetInteger(chart_ID, name, OBJPROP_SELECTED, selection);
//--- hide (true) or display (false) graphical object name in the object list
ObjectSetInteger(chart_ID, name, OBJPROP_HIDDEN, hidden);
//--- set the priority for receiving the event of a mouse click in the chart
ObjectSetInteger(chart_ID, name, OBJPROP_ZORDER, z_order);
//--- successful execution
return(true);
}


本記事の監修者・HT FX


2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。

EA(自動売買)を学びたい方へオススメコンテンツ

EA運用の注意点

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする

ホーム » FX自動売買基礎と応用 » Labelオブジェクトでマークや簡易チェックボックスを表示する自動売買の作成方法