ObjectCreate

この関数は、指定された名称、型、及び指定されたチャートサブウィンドウでの初期座標を使用してオブジェクトを作成します。作成時には 30 までの座標を指定することが出来ます。

bool  ObjectCreate(
  long        chart_id,      // チャート識別子
  string      name,          // オブジェクト名
  ENUM_OBJECT type,          // オブジェクトの型
  sub_window   nwin,          // ウィンドウインデックス
  datetime    time1,        // 1 番目のアンカーポイントの時間
  double      price1,        // 1 番目のアンカーポイントの価格
  ...
  datetime    timeN=0,      // N 番目のアンカーポイントの時間
  double      priceN=0,      // N 番目のアンカーポイントの価格
  ...
  datetime    time30=0,      // 30番目のアンカーポイントの時間
  double      price30=0      // 30番目のアンカーポイントの価格
  );

パラメータ

chart_id

[in]  チャート識別子( 0 は現在のチャート)

name

[in]  オブジェクト名名称は、サブウィンドウを含めたチャート内で一意でなければなりません。

[in]  オブジェクトの型値は ENUM_OBJECT 列挙のいずれかです。

sub_window

[in]  チャートサブウィンドウの番号。( 0 はメインチャートウィンドウ)指定されたサブウィンドウは存在しなければなりません。さもないと、この関数は false を返します。

time1

[in]  1 番目のアンカーの時間座標

price1

[in]  1 番目のアンカーの価格座標

timeN=0

[in]  N 番目のアンカーの時間座標

priceN=0

[in]  N 番目のアンカーの価格座標

time30=0

[in]  30番目のアンカーの時間座標

price30=0

[in]  30番目のアンカーの価格座標

戻り値

この関数は、指定されたチャートのキューにコマンドが正常に追加された場合はtrueを返し、それ以外の場合はfalseを返します。オブジェクトが既に作成されている場合は、その座標の変更を試みます。

注意事項

ObjectCreate()では常に非同期呼び出しが使用されます。これが、この関数がチャートキューにコマンドを追加した結果だけを返す理由です。この場合、trueはコマンドが正常にエンキューされたことを意味しますのみで、その実行結果は不明です。

コマンドの実行結果を確認するにはObjectFind()関数またはオブジェクトプロパティをレクエストするObjectGetXXXなどのその他の関数を使用できます。ただし、そのような関数はそのチャートのキューの最後に追加され、(同期呼び出しのために)実行結果を待つため、時間がかかる可能性があります。チャート上で多数のオブジェクトを操作する場合は、この特徴を考慮する必要があります。

オブジェクト名は 63 字を超えられません。

チャートに指標を含むサブウィンドウが存在する場合、チャートサブウィンドウの番号付けは 1 から始まります。チャートのメインウィンドウは常に 0 インデックスを持ちます。

大多数(最大30)のアンカーポイントは、将来の使用のために実装されています。同時に、グラフィックオブジェクトのためのアンカーポイントの30での上限は、関数を呼び出す時に使用出来るパラメータ数の制限(64以下)によって決定されています。

オブジェクトの名称が変更された場合、2 つのイベントが同時に形成されます。これらのイベントはエキスパートアドバイザーまたは指標の OnChartEvent() 関数によって処理されます。

  • 古い名称のオブジェクトの削除イベント
  • 新しい名称のオブジェクトの作成イベント

それぞれのオブジェクトの型の作成時には、特定の数のアンカーポイントのを指定する必要があります。

ID

説明

アンカーポイント

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 つのアンカーポイント

OBJ_ELLIOTWAVE3

エリオット修正波。

3 つのアンカーポイント

OBJ_RECTANGLE

長方形。

2 つのアンカーポイント

OBJ_TRIANGLE

三角形。

3 つのアンカーポイント

OBJ_ELLIPSE

楕円形。

3 つのアンカーポイント

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 つのアンカーポイント

OBJ_ARROW

矢印。

1 つのアンカーポイント

OBJ_TEXT

テキスト。

1 つのアンカーポイント

OBJ_LABEL

ラベル。

位置は OBJPROP_XDISTANCE 及び OBJPROP_YDISTANCE プロパティで設定されます。

OBJ_BUTTON

ボタン。

位置は OBJPROP_XDISTANCE 及び OBJPROP_YDISTANCE プロパティで設定されます。

OBJ_CHART

チャート。

位置は OBJPROP_XDISTANCE 及び OBJPROP_YDISTANCE プロパティで設定されます。

OBJ_BITMAP

ビットマップ。

1 つのアンカーポイント

OBJ_BITMAP_LABEL

ビットマップラベル。

位置は OBJPROP_XDISTANCE 及び OBJPROP_YDISTANCE プロパティで設定されます。

OBJ_EDIT

編集。

位置は OBJPROP_XDISTANCE 及び OBJPROP_YDISTANCE プロパティで設定されます。

OBJ_EVENT

経済カレンダーのイベントに対応する「イベント」オブジェクト。

1 つのアンカーポイント実際には時間座標のみが使用されます。

OBJ_RECTANGLE_LABEL

カスタムグラフィカルインタフェースを作成及び設計するための「四角形ラベル」オブジェクト。

位置は OBJPROP_XDISTANCE 及び OBJPROP_YDISTANCE プロパティで設定されます。

例:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link     "https://www.mql5.com"
#property version   "1.00"
 
#property script_show_inputs
 
#define   OBJ_NAME   "TestObjectCreate"           // オブジェクト名
#define   OBJ_X     40                           // オブジェクトのX座標
#define   OBJ_Y     40                           // オブジェクトのY座標
#define   OBJ_WIDTH 300                           // オブジェクトの幅
#define   OBJ_HEIGHT 200                           // オブジェクトの高さ
#define   WND       0                             // チャートサブウィンドウ
 
input ENUM_OBJECT InpObjectToCreate = OBJ_VLINE;  /* Object type to create   */ // チャートに描画するオブジェクトの型
 
struct SPoint                                     // アンカーポイントの構造体
 {
  double   price;
  datetime time;
 };
 
SPoint   ExtAnchorPoints[5];                       // グラフィックオブジェクトのアンカーポイントの配列
long     ExtChartID;                               // ID
 
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- 利用可能なバーの数を確認する
  int bars=Bars(_Symbol,_Period);
  if(bars<7)
    {
    PrintFormat("The number of available bars (%d) is not enough to create some graphical objects",bars);
    return;
    }
//--- 現在のチャートID
  ExtChartID=ChartID();
 
//--- 以前に作成されたオブジェクトを削除する
  ObjectDelete(ExtChartID, OBJ_NAME);
 
//--- 5つのアンカーポイントを設定する(時刻/価格)
  SetAnchorPointsData();
 
//--- アンカーポイントの価格/時刻
  datetime tm0=ExtAnchorPoints[0].time;
  double   pr0=ExtAnchorPoints[0].price;
  datetime tm1=ExtAnchorPoints[1].time;
  double   pr1=ExtAnchorPoints[1].price;
  datetime tm2=ExtAnchorPoints[2].time;
  double   pr2=ExtAnchorPoints[2].price;
  datetime tm3=ExtAnchorPoints[3].time;
  double   pr3=ExtAnchorPoints[3].price;
  datetime tm4=ExtAnchorPoints[4].time;
  double   pr4=ExtAnchorPoints[4].price;
 
//--- オブジェクトが正常に作成された場合、残りのパラメータを設定する
  if(ObjectCreate(ExtChartID,OBJ_NAME,InpObjectToCreate,WND,tm0,pr0,tm1,pr1,tm2,pr2,tm3,pr3,tm4,pr4))
    {
    //--- オブジェクトを選択可能にして選択する
    ObjectSetInteger(ExtChartID, OBJ_NAME, OBJPROP_SELECTABLE, true);
    ObjectSetInteger(ExtChartID, OBJ_NAME, OBJPROP_SELECTED, true);
     
    //--- チャート座標で配置されたオブジェクト用
    ENUM_OBJECT obj=InpObjectToCreate;
    if(obj==OBJ_LABEL || obj==OBJ_BUTTON || obj==OBJ_CHART || obj==OBJ_BITMAP_LABEL || obj==OBJ_EDIT || obj==OBJ_RECTANGLE_LABEL)
       {
        //--- オブジェクト座標を設定する
        ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_XDISTANCE,OBJ_X);
        ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_YDISTANCE,OBJ_Y);
        //--- オブジェクトサイズを設定する
        ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_XSIZE,OBJ_WIDTH);
        ObjectSetInteger(ExtChartID,OBJ_NAME,OBJPROP_YSIZE,OBJ_HEIGHT);
       }
    //--- チャートを更新して変更を表示する
    ChartRedraw(ExtChartID);
    }
 }
//+------------------------------------------------------------------+
//| オブジェクトアンカーポイントの配列を埋める                                     |
//+------------------------------------------------------------------+
void SetAnchorPointsData(void)
 {
//--- 左側のアンカーポイントバー(インデックス0)
  int bar_first=(int)ChartGetInteger(ExtChartID,CHART_FIRST_VISIBLE_BAR)-1;
 
//--- 最初のアンカーポイント(インデックス0)の価格/時刻を設定する
  ExtAnchorPoints[0].price=iOpen(_Symbol,_Period,bar_first);
  ExtAnchorPoints[0].time =iTime(_Symbol,_Period,bar_first);
 
//--- インデックス1~3のアンカーポイントの価格/時刻を設定する
  int distance=(int)round(bar_first/4); // アンカーポイント間の距離(バー単位)
  for(int i=1;i<4;i++)
    {
    ExtAnchorPoints[i].price=iOpen(_Symbol,_Period,bar_first-i*distance);
    ExtAnchorPoints[i].time =iTime(_Symbol,_Period,bar_first-i*distance);
    }
 
//--- 最後のアンカーポイント(インデックス4)の価格/時刻を設定する
  ExtAnchorPoints[4].price=iOpen(_Symbol,_Period,1);
  ExtAnchorPoints[4].time =iTime(_Symbol,_Period,1);
 }