ラベルオブジェクトについて
ラベルオブジェクト (OBJ_LABEL
) は、MetaTrader のチャート上に表示できる描画オブジェクトのひとつです。
ラベルオブジェクトの表示位置は、ウィンドウ上の左上を起点 (CORNER_LEFT_UPPER
) として XY 座標が指定されるため、チャートを時間軸方向に移動させても、ラベルの表示位置は固定されて動きません(一方で、テキストオブジェクト (OBJ_TEXT
) の場合は、表示位置が時間 (time) と価格 (price) で指定されるため、チャートの時間軸を移動させると同時に移動します)。
ラベルオブジェクトの作成
ラベルオブジェクトを作成するには、組み込み関数である ObjectCreate
の type
パラメータに OBJ_LABEL
を指定します(ObjectCreate の詳しい使い方はこちら)。
bool ObjectCreate(
long chart_id, // チャート識別子(0 はカレントチャート)
string name, // オブジェクト名(ラベルの識別子)
ENUM_OBJECT type, // オブジェクトの型(OBJ_LABEL を指定)
int sub_window, // ウィンドウインデックス(0 はメインウィンドウ)
datetime time1, // 1 番目のアンカーポイントの時間(ラベルの場合は使用しない)
double price1, // 1 番目のアンカーポイントの価格(ラベルの場合は使用しない)
// ...残りは省略可...
)
例えば、カレントチャート (chart_id=0
) の、メインウィンドウ (sub_window=0
) に表示するためのラベルオブジェクトを作成するには下記のようにします。
if (!::ObjectCreate(0, "Label1", OBJ_LABEL, 0, 0, 0)) {
// ラベルオブジェクトの作成に失敗
}
ラベルオブジェクトは、チャート上に複数追加することができますが、これらのラベルは、チャート ID(chart_id
パラメータ)と、オブジェクト名 (name
) で識別することになります。
現在アクティブになっているチャートにラベルを追加するのであれば、chart_id
は 0 に設定します。
オブジェクト名はチャートの中で一意 になるような名前を付けます。
すでに同じ名前のオブジェクトが存在する場合は、ObjectCreate
は失敗します。
ラベルオブジェクトは、XY 座標指定で表示位置を指定するので、time1
パラメータと price1
パラメータは本来必要ないのですが、ObjectCreate
関数の仕様として、これらのパラメータが省略できないようになっているので、何らかの値を指定して呼び出す必要があります(イケてない・・・)。
ラベルオブジェクトのプロパティ設定
ラベルオブジェクトに表示するテキストや、表示位置などを設定するには、ObjectSetXxx
系のメソッドを使用します。
どのラベルオブジェクトに対する設定なのかを示すために、第 1 引数と第 2 引数で、チャート ID とラベル名を指定する必要があります。
ラベルオブジェクトの削除
ObjectDelete
関数にチャート ID とラベル名を渡すことで、ラベルを削除することができます。
::ObjectDelete(0, "Label1");
プログラムによってラベルオブジェクトを追加したのであれば、プログラムからラベルを削除するにようしておくのが行儀のよいプログラムです。
例えば、インジケータの OnInit
イベントハンドラでラベルを追加したのであれば、OnDeinit
イベントハンドラでラベルを削除するのがよいでしょう。
// bool AddLabel() { /* ... */ }
// void DeleteLabel() { /* ... */ }
int OnInit() {
return AddLabel() ? INIT_SUCCEEDED : INIT_FAILED;
}
void OnDeinit(const int reason) {
DeleteLabel();
}
サンプルコード
下記のサンプルコードは、画面左上にラベルを表示するだけの簡単なインジケータの例です。
インジケータをチャートにアタッチするとラベルが表示され、インジケータをデタッチするとラベルが削除されます。
オブジェクト指向バージョン (CChartObjectLabel) を使用する方法
MQL5 で定義された CChartObjectLabel クラスは、オブジェクト指向なラベルオブジェクトを提供します。
CChartObjectLabel
クラスは CChartObject クラスを継承して作成されており、CChartObject
クラスのデストラクタでは、チャートから描画オブジェクトを削除するコードが記述されています。
つまり、このデストラクタをうまく利用することで、プログラムの終了時(例えばインジケータのデタッチ時)に自動的にラベルオブジェクトを削除することができます。
下記のインジケータのサンプルコードで、ラベルオブジェクトを明示的に削除していないことに注目してください。
関連記事