ObjectCreate

在制定图表子窗口中,函数创建指定名称,类型和原坐标物件,在创建期间可以指定到30个坐标。

bool  ObjectCreate(
   long         chart_id,      // 图表标识符
   string       name,          // 物件名称
   ENUM_OBJECT  type,          // 物件类型
   int          sub_window,    // 窗口索引
   datetime     time1,         // 第一定位点的时间
   double       price1,        // 第一定位点的价格
   ...
   datetime     timeN=0,       // 第N个定位点的时间
   double       priceN=0,      // 
   ...
   datetime     time30=0,      // 第30个定位点的时间
   double       price30=0      // 第30个定位点的价格
   );

参量

chart_id

[in] 图表标识符。0代表当前图表。

name

[in]  物件名称。名称在图表中是唯一的,包括子窗口。

类型

[in]  物件类型。值可以是 ENUM_OBJECT 值中的一个。

sub_window

[in]  图表子窗口数量。0代表主图表窗口,指定子窗口一定存在,否则函数返回错误值。

time1

[in]  第一定位点的时间坐标。

price1

[in]  第一定位点的价格坐标。

timeN=0

[in]  N点时间坐标。

priceN=0

[in]  N点的价格坐标。

time30=0

[in]  第三十定位点的时间坐标。

price30=0

[in]  第三十定位点的价格坐标。

返回值

如果命令成功添加到指定图表队列那么函数返回true,否则返回false。如果对象已经创建,则会尝试改变它的坐标。

注释

非同步调用通常用于ObjectCreate(),这也是函数仅返回命令添加到图表队列的结果。在这种情况下,true仅表示命令已成功加入队列,但执行结果尚不可知。

若要检查命令执行结果,您可以使用ObjectFind()函数或任何其他请求对象属性的函数,例如ObjectGetXXX。但是,您需要牢记的是这类函数将被加入到图表的队尾,需要等待执行结果(因为同步调用),因此,可能会耗费大量时间。当处理图表上的大量对象时应该考虑这个特性。

对象名称不应超过63个字符。

图表子窗口的数量(如果图表中有附带指标的子窗口)以1开始,图表主窗口总是以0开始检索。

大量定位点(到30)提供更多使用,于此同时限制图表中的30个可能的定位点,调用的大量参量不能超过64。

当物件重命名,两个事件同时形成。这些事件可以在EA交易或者 OnChartEvent() 函数指标中处理:

  • 旧名称物件删除事件;
  • 新名称物件新建事件。

这里有在创建每个物件类型时必须指定的一定数量的定位点:

ID

描述

定位点

OBJ_VLINE

垂直线

一个定位点。实际上只使用时间坐标。

OBJ_HLINE

水平线

一个定位点。实际上只使用价格坐标。

OBJ_TREND

趋势线

两个定位点。

OBJ_TRENDBYANGLE

角度趋势线

两个定位点。

OBJ_CYCLES

循环线

两个定位点。

OBJ_ARROWED_LINE

箭头线

两个定位点。

OBJ_CHANNEL

等距通道

三个定位点。

OBJ_STDDEVCHANNEL

标准偏差通道

两个定位点。

OBJ_REGRESSION

线性回归通道

两个定位点。

OBJ_PITCHFORK

安德鲁鱼叉理论

三个定位点。

OBJ_GANNLINE

江恩线

两个定位点。

OBJ_GANNFAN

江恩扇形线

两个定位点。

OBJ_GANNGRID

江恩网格

两个定位点。

OBJ_FIBO

斐波纳契回调线

两个定位点。

OBJ_FIBOTIMES

斐波纳契时间周期线

两个定位点。

OBJ_FIBOFAN

斐波纳契扇形线

两个定位点。

OBJ_FIBOARC

斐波纳契角度线

两个定位点。

OBJ_FIBOCHANNEL

斐波纳契通道

三个定位点。

OBJ_EXPANSION

斐波纳契扩展线

三个定位点。

OBJ_ELLIOTWAVE5

埃利奥特波动

五个定位点。

OBJ_ELLIOTWAVE3

埃利奥特修正波

三个定位点。

OBJ_RECTANGLE

矩形

两个定位点。

OBJ_TRIANGLE

三角形

三个定位点。

OBJ_ELLIPSE

椭圆形

三个定位点。

OBJ_ARROW_THUMB_UP

拇指向上

一个定位点。

OBJ_ARROW_THUMB_DOWN

拇指向下

一个定位点。

OBJ_ARROW_UP

箭头向上

一个定位点。

OBJ_ARROW_DOWN

箭头向下

一个定位点。

OBJ_ARROW_STOP

停止符号

一个定位点。

OBJ_ARROW_CHECK

检查符号

一个定位点。

OBJ_ARROW_LEFT_PRICE

向左价格标签

一个定位点。

OBJ_ARROW_RIGHT_PRICE

向右价格标签

一个定位点。

OBJ_ARROW_BUY

买入符号

一个定位点。

OBJ_ARROW_SELL

卖出符号

一个定位点。

OBJ_ARROW

箭头

一个定位点。

OBJ_TEXT

文本

一个定位点。

OBJ_LABEL

标签

使用 OBJPROP_XDISTANCEOBJPROP_YDISTANCE 属性设置位置。

OBJ_BUTTON

按钮

使用 OBJPROP_XDISTANCE and OBJPROP_YDISTANCE属性设置位置。

OBJ_CHART

图表

使用 OBJPROP_XDISTANCE and OBJPROP_YDISTANCE属性设置位置。

OBJ_BITMAP

位图

一个定位点。

OBJ_BITMAP_LABEL

位图标签

使用 OBJPROP_XDISTANCE and OBJPROP_YDISTANCE 属性设置位置。

OBJ_EDIT

编辑

使用OBJPROP_XDISTANCE and OBJPROP_YDISTANCE 属性设置位置。

OBJ_EVENT

经济日历中对应事件的"事件"物件

一个定位点。实际上只使用时间坐标。

OBJ_RECTANGLE_LABEL

用于创建和设计自定义图形界面的“矩形标签”对象。

使用OBJPROP_XDISTANCE and 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(ExtChartIDOBJ_NAME);
 
//--- 设置五个锚点 (时间/价格)
   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(ExtChartIDOBJ_NAMEOBJPROP_SELECTABLEtrue);
      ObjectSetInteger(ExtChartIDOBJ_NAMEOBJPROP_SELECTEDtrue);
      
      //---用于按图表坐标定位的对象
      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);
  }