MQL4 オブジェクト関数リファレンス|ObjectCreate・水平線・ラベル・ボタン・SL/TPライン描画

MQL4 オブジェクト関数はObjectCreate・ObjectDelete・ObjectSet/Getなど、チャート上にラインやラベルを描画する関数群だ。各関数のシンタックスと実用パターンをコード付きで扱う。

MQL4 オブジェクト関数 リファレンスカード
目次

MQL4とMQL5のオブジェクト関数の違い

機能MQL4MQL5
作成ObjectCreate(name, type, …)ObjectCreate(chart_id, name, type, …)
プロパティ設定(旧)ObjectSet(name, prop, value)なし(廃止)
プロパティ設定(新)ObjectSetInteger/Double/String()ObjectSetInteger/Double/String()
プロパティ取得(旧)ObjectGet(name, prop)なし(廃止)
プロパティ取得(新)ObjectGetInteger/Double/String()ObjectGetInteger/Double/String()
chart_id引数ビルド600+で追加(0=現在)必須

MQL4では旧形式のObjectSet()/ObjectGet()と新形式のObjectSetInteger()等の両方が使えます。新規開発では新形式を推奨します。旧形式はMQL5では完全に廃止されているため、将来の移植性を考えると新形式を使う方が良いでしょう。

ObjectCreate – オブジェクト作成

// 旧形式
bool ObjectCreate(
   string name,       // オブジェクト名(一意)
   int    type,       // オブジェクトタイプ(OBJ_〇〇)
   int    window,     // ウィンドウ番号(0=メインチャート)
   datetime time1,    // 第1アンカーの時刻
   double price1,     // 第1アンカーの価格
   datetime time2 = 0, double price2 = 0,  // 第2アンカー(任意)
   datetime time3 = 0, double price3 = 0   // 第3アンカー(任意)
);

// 新形式(ビルド600+)
bool ObjectCreate(
   long     chart_id, // チャートID(0=現在)
   string   name,
   ENUM_OBJECT type,
   int      sub_window,
   datetime time1, double price1,
   datetime time2 = 0, double price2 = 0,
   datetime time3 = 0, double price3 = 0
);

主要なオブジェクトタイプ

定数説明アンカー数
OBJ_HLINE水平線1(価格のみ)
OBJ_VLINE垂直線1(時刻のみ)
OBJ_TRENDトレンドライン2
OBJ_RECTANGLE矩形2
OBJ_TRIANGLE三角形3
OBJ_LABELラベル(ピクセル座標)0(座標で配置)
OBJ_TEXTテキスト(チャート座標)1
OBJ_BUTTONボタン0(座標で配置)
OBJ_ARROW矢印1
OBJ_FIBOフィボナッチリトレースメント2
OBJ_CHANNEL等距離チャネル3

基本オブジェクトの作成

// 水平線
void DrawHLine(string name, double price, color clr, int width = 1)
  {
   if(ObjectFind(name) >= 0)
      ObjectDelete(name);

   ObjectCreate(name, OBJ_HLINE, 0, 0, price);
   ObjectSet(name, OBJPROP_COLOR, clr);
   ObjectSet(name, OBJPROP_WIDTH, width);
   ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
  }

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

   ObjectCreate(name, OBJ_VLINE, 0, time, 0);
   ObjectSet(name, OBJPROP_COLOR, clr);
   ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
  }

// トレンドライン
void DrawTrendLine(string name, datetime t1, double p1,
                    datetime t2, double p2, color clr)
  {
   if(ObjectFind(name) >= 0)
      ObjectDelete(name);

   ObjectCreate(name, OBJ_TREND, 0, t1, p1, t2, p2);
   ObjectSet(name, OBJPROP_COLOR, clr);
   ObjectSet(name, OBJPROP_WIDTH, 2);
   ObjectSet(name, OBJPROP_RAY, false);  // 延長しない
  }
void DrawRectangle(string name, datetime t1, double p1,
                    datetime t2, double p2, color clr)
  {
   if(ObjectFind(name) >= 0)
      ObjectDelete(name);

   ObjectCreate(name, OBJ_RECTANGLE, 0, t1, p1, t2, p2);
   ObjectSet(name, OBJPROP_COLOR, clr);
   ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);
   ObjectSet(name, OBJPROP_BACK, true);  // 背景に表示
  }

ラベル・テキスト・ボタン

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

   ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
   ObjectSet(name, OBJPROP_XDISTANCE, x);
   ObjectSet(name, OBJPROP_YDISTANCE, y);
   ObjectSetText(name, text, fontSize,"Arial", clr);

   // アンカー位置(CORNER_LEFT_UPPER がデフォルト)
   ObjectSet(name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
  }

// 情報パネルの例
void CreateInfoPanel()
  {
   string prefix ="Info_";
   int y = 20;
   int lineHeight = 18;

   CreateLabel(prefix +"Title", 10, y,"=== EA Status ===", clrWhite, 11);
   y += lineHeight + 5;

   CreateLabel(prefix +"Balance", 10, y,"残高:" + DoubleToStr(AccountBalance(), 0), clrLime);
   y += lineHeight;

   CreateLabel(prefix +"Equity", 10, y,"有効証拠金:" + DoubleToStr(AccountEquity(), 0), clrLime);
   y += lineHeight;

   CreateLabel(prefix +"Spread", 10, y,"スプレッド:" + IntegerToString((int)MarketInfo(Symbol(), MODE_SPREAD)), clrYellow);
  }
void CreateButton(string name, int x, int y, int width, int height,
                   string text, color textClr, color bgClr)
  {
   if(ObjectFind(0, name) >= 0)
      ObjectDelete(0, name);

   ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_XSIZE, width);
   ObjectSetInteger(0, name, OBJPROP_YSIZE, height);
   ObjectSetString(0, name, OBJPROP_TEXT, text);
   ObjectSetInteger(0, name, OBJPROP_COLOR, textClr);
   ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bgClr);
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10);
  }

ObjectSet / ObjectGet(旧形式)

プロパティ定数説明
OBJPROP_COLOR
OBJPROP_STYLE線スタイル(STYLE_SOLID/DASH/DOT等)
OBJPROP_WIDTH線の太さ(1-5)
OBJPROP_BACK背景表示(true/false)
OBJPROP_RAYトレンドラインの延長
OBJPROP_TIME1/2/3アンカー時刻
OBJPROP_PRICE1/2/3アンカー価格
OBJPROP_XDISTANCEX座標(ラベル/ボタン用)
OBJPROP_YDISTANCEY座標(ラベル/ボタン用)
OBJPROP_CORNERアンカーコーナー
OBJPROP_SELECTABLE選択可能か
OBJPROP_SELECTED選択状態
OBJPROP_HIDDENオブジェクト一覧に非表示

OBJ_LABELとOBJ_TEXTの違いに注意してください。OBJ_LABELはピクセル座標(画面の固定位置)に配置され、チャートをスクロールしても動きません。OBJ_TEXTはチャート座標(価格と時刻)に配置され、チャートと一緒にスクロールします。情報パネルにはOBJ_LABEL、価格注釈にはOBJ_TEXTを使います。

OBJ_LABELとOBJ_TEXTの違いに注意してください。OBJ_LABELはピクセル座標(画面の固定位置)に配置され、チャートをスクロールしても動きません。OBJ_TEXTはチャート座標(価格と時刻)に配置され、チャートと一緒にスクロールします。情報パネルにはOBJ_LABEL、価格注釈にはOBJ_TEXTを使います。

ObjectDelete / ObjectsDeleteAll

// 個別削除
void DeleteObject(string name)
  {
   if(ObjectFind(name) >= 0)
     {
      ObjectDelete(name);
      Print("オブジェクト削除:", name);
     }
  }

// プレフィックスで一括削除
void DeleteAllByPrefix(string prefix)
  {
   int total = ObjectsTotal();
   for(int i = total - 1; i >= 0; i--)
     {
      string name = ObjectName(i);
      if(StringFind(name, prefix) == 0)
         ObjectDelete(name);
     }
  }

// ObjectsDeleteAll(ビルド600+の新形式)
void CleanupAll()
  {
   // 全オブジェクト削除
   ObjectsDeleteAll(0);  // chart_id=0(現在のチャート)

   // 特定のプレフィックスだけ削除
   ObjectsDeleteAll(0,"MyEA_");

   // 特定ウィンドウの特定タイプだけ削除
   ObjectsDeleteAll(0,"MyEA_", 0, OBJ_HLINE);
  }
オブジェクト描画のパフォーマンス
  • 大量のオブジェクト(100個以上)を描画するとチャートの描画が重くなる
  • OnTick()内でオブジェクトを毎回作り直すのではなく、既存オブジェクトのプロパティを更新する方が効率的
  • ObjectFind()で存在確認→ObjectSet()で更新、なければObjectCreate()が基本パターン
  • 不要になったオブジェクトは速やかにObjectDelete()で削除する
オブジェクト描画のパフォーマンス
  • 大量のオブジェクト(100個以上)を描画するとチャートの描画が重くなる
  • OnTick()内でオブジェクトを毎回作り直すのではなく、既存オブジェクトのプロパティを更新する方が効率的
  • ObjectFind()で存在確認→ObjectSet()で更新、なければObjectCreate()が基本パターン
  • 不要になったオブジェクトは速やかにObjectDelete()で削除する

ObjectGetTimeByValue / ObjectGetValueByTime

// トレンドラインの特定時刻での価格を取得
void GetTrendLinePrice()
  {
   string lineName ="TrendLine1";

   // トレンドライン上の現在時刻の価格を計算
   double price = ObjectGetValueByTime(0, lineName, TimeCurrent());
   Print("トレンドライン価格(現在):", price);

   // 特定価格に到達する時刻を取得
   datetime time = ObjectGetTimeByValue(0, lineName, Ask);
   if(time > 0)
      Print("Ask到達予想時刻:", TimeToStr(time));
  }

実践: SL/TPライン描画

void DrawSLTPLines(int ticket)
  {
   if(!OrderSelect(ticket, SELECT_BY_TICKET))
      return;

   string prefix ="SLTP_" + IntegerToString(ticket) +"_";
   double sl = OrderStopLoss();
   double tp = OrderTakeProfit();
   double entry = OrderOpenPrice();

   // エントリーライン
   DrawHLine(prefix +"Entry", entry, clrWhite, 1);
   ObjectSetText(prefix +"Entry","Entry:" + DoubleToStr(entry, Digits), 8);

   // SLライン
   if(sl > 0)
     {
      DrawHLine(prefix +"SL", sl, clrRed, 2);

      double slPips = MathAbs(entry - sl) / Point;
      ObjectSetText(prefix +"SL","SL:" + DoubleToStr(sl, Digits)
                     +" (" + DoubleToStr(slPips, 0) +"pts)", 8);
     }

   // TPライン
   if(tp > 0)
     {
      DrawHLine(prefix +"TP", tp, clrLime, 2);

      double tpPips = MathAbs(tp - entry) / Point;
      ObjectSetText(prefix +"TP","TP:" + DoubleToStr(tp, Digits)
                     +" (" + DoubleToStr(tpPips, 0) +"pts)", 8);
     }
  }

// SL/TPラインの削除
void RemoveSLTPLines(int ticket)
  {
   string prefix ="SLTP_" + IntegerToString(ticket) +"_";
   DeleteAllByPrefix(prefix);
  }

オブジェクト関数一覧(MQL5対応表)

MQL4関数MQL5対応説明
ObjectCreate()ObjectCreate(chart_id, …)オブジェクト作成
ObjectDelete()ObjectDelete(chart_id, name)オブジェクト削除
ObjectsDeleteAll()ObjectsDeleteAll(chart_id)一括削除
ObjectFind()ObjectFind(chart_id, name)オブジェクト検索
ObjectSet()廃止(SetInteger/Double/Stringを使用)プロパティ設定(旧)
ObjectGet()廃止(GetInteger/Double/Stringを使用)プロパティ取得(旧)
ObjectSetText()ObjectSetString(OBJPROP_TEXT)テキスト設定
ObjectGetText()ObjectGetString(OBJPROP_TEXT)テキスト取得
ObjectName(index)ObjectName(chart_id, index)インデックスから名前取得
ObjectsTotal()ObjectsTotal(chart_id)オブジェクト総数
ObjectType(name)ObjectGetInteger(OBJPROP_TYPE)オブジェクトタイプ
ObjectGetValueByTime()ObjectGetValueByTime()時刻→価格
ObjectGetTimeByValue()ObjectGetTimeByValue()価格→時刻

MQL4 オブジェクト関数のまとめ

MQL4のオブジェクト関数は、チャート上の視覚的な情報表示とユーザーインタラクションに不可欠です。主要なポイントは以下の通りです。

  • ObjectFind()で存在確認してからObjectCreate()する – 同名オブジェクトの重複を防ぐ
  • OnDeinitで作成したオブジェクトを削除する – プレフィックスを使った一括削除が便利
  • 新形式(ObjectSetInteger等)を使う – MQL5への移植性が高まる
  • OBJ_LABELはピクセル座標、OBJ_TEXTはチャート座標 – 用途に応じて使い分ける

次のステップとして、MQLリファレンス総合ガイドでチャート操作関数やイベントハンドラと組み合わせたインタラクティブなEAの開発を学びましょう。

MQL4オブジェクト関数 よくある質問

MQL4のオブジェクト関数とは?

チャート上にトレンドライン、矩形、テキスト、矢印などの描画オブジェクトを作成・管理する関数群です。ObjectCreate()で作成、ObjectSet()/ObjectGet()でプロパティ設定・取得、ObjectDelete()で削除します。インジケーターやEAのシグナル表示に活用されます。

MQL4でトレンドラインを描画する方法は?

ObjectCreate(name, OBJ_TREND, 0, time1, price1, time2, price2)で2点間のトレンドラインを作成します。ObjectSet(name, OBJPROP_COLOR, clrRed)で色を設定します。MQL4では第1引数はチャートIDがなく名前だけです(MQL5では0=現在チャートが必要)。

MQL4でチャートにテキストを表示する方法は?

OBJ_LABELでピクセル座標指定のテキスト、OBJ_TEXTでチャート座標(時刻・価格)指定のテキストを作成します。ObjectSetString(name, OBJPROP_TEXT, “表示テキスト”)でテキスト内容を設定、OBJPROP_FONTSIZEでフォントサイズを指定します。

MQL4でオブジェクトを一括削除する方法は?

ObjectsDeleteAll()でチャート上の全オブジェクトを一括削除、ObjectsDeleteAll(0, prefix, -1)でプレフィックス指定の一括削除が可能です。OnDeinit()での確実な削除を推奨します。プレフィックスを付けてオブジェクトを命名すると管理が容易です。

MQL4とMQL5のオブジェクト関数の違いは?

MQL5では全オブジェクト関数の第1引数にチャートID(0=現在)が追加されました。ObjectSet()/ObjectGet()がObjectSetInteger()/ObjectSetDouble()/ObjectGetInteger()等の型別関数に整理されています。基本的な使い方は同じです。

MQL4でオブジェクトの存在確認と更新をする方法は?

ObjectFind(name)で戻り値が0(存在する)か確認します。既存オブジェクトを更新する場合はObjectMove()で座標変更、ObjectSet()でプロパティ変更が可能です。存在確認せずにObjectCreate()を呼ぶと既存オブジェクトが上書きされます。

MQL4リファレンス 関連記事

シストレ.COM編集部|200種類以上のEAをフォワード計測する運営3年の検証メディア。MetaTrader (MT4/MT5) を実運用してきた編集部が監修・執筆しています。

⚠ リスクに関する注意事項

本記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。FX取引はレバレッジ取引の特性上、預託した証拠金以上の損失が生じる可能性があります。取引の際は、ご自身の判断と責任において行ってください。詳しくは特定商取引法に基づく表記をご確認ください。

シストレ.COMで実績のあるEAが使い放題!/
無料会員登録はこちら
FX自動売買でEAを探すなら
シストレ.COM 記事下バナー
実績あるEAが無料
厳格な審査を乗り越えた実績のあるEAが無料で使えます!
自由な口座選び
有料版を購入し柔軟な口座選びが可能!
フォワードテスト公開
全EAのフォワードテスト結果を公開中!
FX初心者も安心
初心者の方も安心して取引を始められます。
多様なEA選択肢
様々な種別のEAをご用意!自分の手法にあった取引が可能です。
信頼のFX会社と提携
人気のFX会社と提携中!様々なFX会社から選べます。
1分で登録完了!EA探すならシストレ.COM!/
無料会員登録はこちら

この記事が気に入ったら
フォローしてね!

お役立ち情報をシェアする
  • URLをコピーしました!

この記事を書いた人

シストレ.COM編集部は、FX自動売買(EA)とテクニカル分析を専門とするインターネットメディア「シストレ.COM」の編集チームです。200本以上のEAのフォワードテスト結果を公開し、実際の運用データに基づいた客観的な情報を発信しています。記事の執筆・監修はMetaTrader(MT4/MT5)での実運用経験を持つスタッフが担当。

目次