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引数のtypeにENUM_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_XDISTANCEとOBJPROP_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やインジケーターの使い勝手が大きく向上します。

