【MQL4】ENUM_OBJECTとは?オブジェクトタイプ定数の全種類一覧と使い方をわかりやすく解説

【辞書】MQLリファレンス

MQL4でチャート上にラインや矢印、テキストなどのグラフィカルオブジェクトを描画するとき、必ず登場するのがENUM_OBJECTという列挙型です。

ObjectCreate関数の第2引数には、このENUM_OBJECTの値を指定して「どの種類のオブジェクトを作るか」を決定します。しかし、オブジェクトタイプは約44種類もあり、「どんな種類があるの?」「どう使い分けるの?」と迷う方も多いのではないでしょうか。

この記事では、ENUM_OBJECTの全種類を一覧表で整理し、よく使うオブジェクトの実践的なコードサンプルもあわせて解説します。

ENUM_OBJECTとは?

ENUM_OBJECTは、MQL4で定義されている列挙型(enum)の一つで、チャート上に作成できるグラフィカルオブジェクトの種類を表す定数をまとめたものです。

オブジェクトを作成するObjectCreate関数のシグネチャは以下のようになっています。

bool ObjectCreate(
   long         chart_id,   // チャートID(0=現在のチャート)
   string       name,       // オブジェクト名(一意の名前)
   ENUM_OBJECT  type,       // オブジェクトタイプ
   int          sub_window, // サブウィンドウ番号(0=メインウィンドウ)
   datetime     time1,      // 1つ目のアンカーポイントの時刻
   double       price1,     // 1つ目のアンカーポイントの価格
   ...                      // 必要に応じて追加のアンカーポイント
);

第3引数のtypeENUM_OBJECTの定数値を指定することで、水平線・トレンドライン・矢印・テキストラベルなど、目的に合ったオブジェクトを作成できます。

全オブジェクトタイプ一覧(カテゴリ別)

ENUM_OBJECTに含まれるオブジェクトタイプを、カテゴリ別に整理しました。

ライン系オブジェクト

定数名 説明 アンカー数
OBJ_VLINE 垂直線 1
OBJ_HLINE 水平線 1
OBJ_TREND トレンドライン 2
OBJ_TRENDBYANGLE 角度によるトレンドライン 2
OBJ_CYCLES サイクルライン 2
OBJ_ARROWED_LINE 矢印付きライン 2

チャネル系オブジェクト

定数名 説明 アンカー数
OBJ_CHANNEL 等距離チャネル 3
OBJ_STDDEVCHANNEL 標準偏差チャネル 2
OBJ_REGRESSION 線形回帰チャネル 2
OBJ_PITCHFORK アンドリューズ・ピッチフォーク 3

ギャン系オブジェクト

定数名 説明 アンカー数
OBJ_GANNLINE ギャンライン 2
OBJ_GANNFAN ギャンファン 2
OBJ_GANNGRID ギャングリッド 2

フィボナッチ系オブジェクト

定数名 説明 アンカー数
OBJ_FIBO フィボナッチ・リトレースメント 2
OBJ_FIBOTIMES フィボナッチ・タイムゾーン 2
OBJ_FIBOFAN フィボナッチ・ファン 2
OBJ_FIBOARC フィボナッチ・アーク 2
OBJ_FIBOCHANNEL フィボナッチ・チャネル 3
OBJ_EXPANSION フィボナッチ・エクスパンション 3

エリオット波動系オブジェクト

定数名 説明 アンカー数
OBJ_ELLIOTWAVE5 エリオット推進波(5波) 5
OBJ_ELLIOTWAVE3 エリオット修正波(3波) 3

図形系オブジェクト

定数名 説明 アンカー数
OBJ_RECTANGLE 長方形 2
OBJ_TRIANGLE 三角形 3
OBJ_ELLIPSE 楕円 3

矢印・マーカー系オブジェクト

定数名 説明 アンカー数
OBJ_ARROW 矢印(任意のWingdingsコード指定可) 1
OBJ_ARROW_THUMB_UP サムズアップ 1
OBJ_ARROW_THUMB_DOWN サムズダウン 1
OBJ_ARROW_UP 上向き矢印 1
OBJ_ARROW_DOWN 下向き矢印 1
OBJ_ARROW_STOP ストップサイン 1
OBJ_ARROW_CHECK チェックマーク 1
OBJ_ARROW_LEFT_PRICE 左向き価格ラベル 1
OBJ_ARROW_RIGHT_PRICE 右向き価格ラベル 1
OBJ_ARROW_BUY 買いサイン 1
OBJ_ARROW_SELL 売りサイン 1

テキスト・GUI系オブジェクト

定数名 説明 配置基準
OBJ_TEXT テキスト(チャート座標に固定) 時刻・価格
OBJ_LABEL テキストラベル(ピクセル座標に固定) X・Y座標
OBJ_BUTTON ボタン X・Y座標
OBJ_EDIT 入力フィールド X・Y座標
OBJ_RECTANGLE_LABEL 矩形ラベル(パネル背景など) X・Y座標
OBJ_BITMAP ビットマップ画像(チャート座標) 時刻・価格
OBJ_BITMAP_LABEL ビットマップラベル(ピクセル座標) X・Y座標
OBJ_EVENT イベントオブジェクト 時刻

※ アンカー数とは、ObjectCreate関数で指定が必要な座標ポイントの数です。たとえばトレンドラインは始点と終点の2つが必要です。

よく使うオブジェクトの実践コード

ここからは、EA開発やインジケーター作成でよく使うオブジェクトタイプを5つ取り上げ、実際のコードとともに解説します。

①水平線(OBJ_HLINE)を描画する

水平線は特定の価格レベルにラインを引くオブジェクトです。サポート・レジスタンスラインの表示などに使います。アンカーポイントはprice1のみで、time1は意味を持ちませんが、引数として0を渡します。

void DrawHLine(string name, double price, color clr)
{
   // すでに同名のオブジェクトがあれば削除
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 水平線を作成(time1は0でOK、price1に価格を指定)
   ObjectCreate(0, name, OBJ_HLINE, 0, 0, price);

   // 色を設定
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   // 線のスタイルを点線に
   ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DASH);
   // 線の太さ
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
}

// 使用例:現在の価格に赤い水平線を描画
void OnStart()
{
   DrawHLine("SupportLine", Ask - 50 * _Point, clrRed);
}

②垂直線(OBJ_VLINE)を描画する

垂直線は特定の時刻に縦のラインを引くオブジェクトです。セッション区切りや重要なイベント時刻の表示に使います。アンカーポイントはtime1のみで、price1は0を渡します。

void DrawVLine(string name, datetime time, color clr)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 垂直線を作成(time1に時刻を指定、price1は0でOK)
   ObjectCreate(0, name, OBJ_VLINE, 0, time, 0);

   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_STYLE, STYLE_DOT);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 1);
}

// 使用例:現在の足の時刻に青い垂直線を描画
void OnStart()
{
   DrawVLine("EventLine", TimeCurrent(), clrBlue);
}

③矢印マーカー(OBJ_ARROW)を表示する

OBJ_ARROWは、Wingdingsフォントの文字コードを使って任意のアイコンを表示できる汎用的な矢印オブジェクトです。OBJPROP_ARROWCODEプロパティでアイコンの種類を変更できます。

void DrawArrow(string name, datetime time, double price, int arrowCode, color clr)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 矢印オブジェクトを作成
   ObjectCreate(0, name, OBJ_ARROW, 0, time, price);

   // 矢印コードを設定(例: 233=上矢印, 234=下矢印)
   ObjectSetInteger(0, name, OBJPROP_ARROWCODE, arrowCode);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   // 矢印のサイズ
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
}

// 使用例:現在の足に上向き矢印を表示
void OnStart()
{
   DrawArrow("BuySignal", Time[0], Low[0] - 10 * _Point, 233, clrLime);
}

よく使われるWingdingsコードの例:233(上向き矢印)、234(下向き矢印)、159(大きな丸)、161(チェックマーク)などがあります。

④トレンドライン(OBJ_TREND)を描画する

トレンドラインは2つのアンカーポイント(始点と終点)を結ぶ直線です。デフォルトでは右方向に延長されるため、延長が不要な場合はOBJPROP_RAY_RIGHTをfalseに設定します。

void DrawTrendLine(string name, datetime time1, double price1,
                   datetime time2, double price2, color clr)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // 2点を指定してトレンドラインを作成
   ObjectCreate(0, name, OBJ_TREND, 0, time1, price1, time2, price2);

   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, 2);
   // 右方向への延長をオフにする
   ObjectSetInteger(0, name, OBJPROP_RAY_RIGHT, false);
}

// 使用例:5本前の安値から現在の安値へトレンドラインを描画
void OnStart()
{
   DrawTrendLine("MyTrend",
                 Time[5], Low[5],
                 Time[0], Low[0],
                 clrOrangeRed);
}

⑤テキストラベル(OBJ_LABEL)をチャート隅に配置する

OBJ_LABELはピクセル座標ベースのテキストオブジェクトです。チャートをスクロールしても位置が固定されるため、情報パネルやステータス表示に最適です。OBJPROP_CORNERで基準コーナーを、OBJPROP_XDISTANCEOBJPROP_YDISTANCEで位置を調整します。

void DrawLabel(string name, string text, int corner, int x, int y,
               color clr, int fontSize)
{
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   // ラベルオブジェクトを作成(time/priceは不要なので0)
   ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);

   // 基準コーナーを設定
   // CORNER_LEFT_UPPER=0, CORNER_RIGHT_UPPER=1
   // CORNER_LEFT_LOWER=2, CORNER_RIGHT_LOWER=3
   ObjectSetInteger(0, name, OBJPROP_CORNER, corner);

   // コーナーからの距離(ピクセル)
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);

   // テキスト内容とフォント
   ObjectSetString(0, name, OBJPROP_TEXT, text);
   ObjectSetString(0, name, OBJPROP_FONT, "Arial Bold");
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, fontSize);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
}

// 使用例:左上にスプレッド情報を表示
void OnStart()
{
   int spread = (int)MarketInfo(Symbol(), MODE_SPREAD);
   string text = "Spread: " + IntegerToString(spread) + " pts";
   DrawLabel("SpreadLabel", text, CORNER_LEFT_UPPER, 20, 30, clrWhite, 12);
}

ObjectCreate使用時の注意点

オブジェクトを使う際に知っておくべきポイントをまとめます。

オブジェクト名のルール

  • 最大63文字まで指定できます。
  • ラテン文字(英数字)の使用が推奨されています。日本語文字を使うと環境によって文字化けする可能性があります。
  • 同じチャート上でオブジェクト名は一意でなければなりません。

同名オブジェクトが既に存在する場合

ObjectCreate関数は、同名のオブジェクトがすでに存在する場合、新規作成はせず、既存オブジェクトの座標を変更しようとします。この場合、関数はfalseを返しますが、エラーではなく座標の更新が行われることがあります。

意図しない動作を防ぐために、作成前にObjectFindで存在確認し、必要に応じてObjectDeleteで削除してから作成するのが安全です。

オブジェクトの後片付け

EA終了時やインジケーター削除時には、作成したオブジェクトを削除するようにしましょう。OnDeinit関数内で処理するのが一般的です。

void OnDeinit(const int reason)
{
   // プレフィックスが "My_" のオブジェクトをすべて削除
   ObjectsDeleteAll(0, "My_");
}

オブジェクト名にプレフィックス(接頭辞)を付けておくと、ObjectsDeleteAllの第2引数にそのプレフィックスを指定するだけで一括削除できるので便利です。

OBJ_TEXT と OBJ_LABEL の違い

OBJ_TEXTはチャートの時刻・価格座標に固定されるため、チャートをスクロールするとテキストも一緒に動きます。一方、OBJ_LABELはチャートウィンドウのピクセル座標に固定されるため、スクロールしても常に同じ位置に表示されます。常時表示したい情報にはOBJ_LABELを使いましょう。

まとめ

この記事では、MQL4のENUM_OBJECT列挙型について、基本的な概念から全種類の一覧、そして実践的なコードサンプルまでを解説しました。

  • ENUM_OBJECTは、ObjectCreate関数でオブジェクトの種類を指定するための列挙型
  • ライン系・チャネル系・フィボナッチ系・矢印系・テキスト系など、約44種類のオブジェクトタイプがある
  • OBJ_HLINE(水平線)とOBJ_VLINE(垂直線)はアンカーポイントが1つだけ
  • OBJ_ARROWはWingdingsコードで様々なアイコンを表示可能
  • OBJ_LABELはピクセル座標固定で、情報パネルの作成に最適
  • オブジェクト名は63文字以内のラテン文字を推奨。プレフィックスを付けて管理すると後片付けが楽になる

まずは水平線やラベルなど、シンプルなオブジェクトから試してみてください。チャート上にカスタム表示を加えることで、EAやインジケーターの使い勝手が大きく向上します。