ObjectFind

在图表指定ID中函数搜索指定名称的物件。

int  ObjectFind(
   long    chart_id,     // 图表标识符
   string  name          // 物件名称
   );

参量

chart_id

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

name

[in]  搜索物件名称。

返回值

如果成功函数返回子窗口的号码(0表示图表的主窗口),发现物件。如果没有找到物件,函数返回负值,阅读更多关于错误,调用 GetLastError()

注释

该函数使用同步调用,这意味着这个函数等待执行在调用之前已入列图表的所有命令,这就是该函数耗费时间的原因。当处理图表上的大量对象时应该考虑这个特性。

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

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

 

示例:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   OBJ_NAME   "TestObjectFind"
#define   WND        0
 
//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 图表 ID
   long chart_id=ChartID();
 
//--- 如果在 WND 窗口中的图表上发现了 OBJ_NAME 图形对象,
//--- 报告并完成工作
   ResetLastError();
   if(ObjectFind(chart_idOBJ_NAME)==WND)
     {
      PrintFormat("A graphic object named \"%s\" exists on chart with ID %I64d"OBJ_NAMEchart_id);
      return;
     }
     
//--- 如果未发现对象
   else
     {
      //--- 如果最近的错误不是 4202 ("图形对象未找到")
      //--- 报告错误并退出
      if(GetLastError()!=ERR_OBJECT_NOT_FOUND
        {
         Print("ObjectFind() failed. Error "GetLastError());
         return;
        }
      
      //--- 在日志中报告 chart_id 对应的图表中没有 OBJ_NAME 对象
      PrintFormat("There is no graphic object named \"%s\" on the chart with ID #%I64d. Let's create it."OBJ_NAMEchart_id);
      
      //--- 在 WND 窗口中创建名为 OBJ_NAME 的垂直线对象
      ResetLastError();
      if(!ObjectCreate(chart_idOBJ_NAMEOBJ_VLINEWNDTimeCurrent(), 0))
        {
         Print("ObjectCreate() failed. Error "GetLastError());
         return;
        }
      
      //--- 立即重绘图表以反映变化
      ChartRedraw(chart_id);
      
      //--- 检查是否存在已创建的对象
      if(ObjectFind(chart_idOBJ_NAME)!=WND)
        {
         Print("ObjectFind() failed. Error "GetLastError());
         return;
        }
      
      //--- 如果对象已创建,在日志中报告,
      //--- 等待一秒并删除所创建的对象
      PrintFormat("Now a graphic object named \"%s\" exists on the chart with ID #%I64d. Let's delete it."OBJ_NAMEchart_id);
      Sleep(1000);
      ObjectDelete(chart_idOBJ_NAME);
      
      //--- 立即重绘图表以反映变化
      ChartRedraw(chart_id);
     }
   /*
   结果:
   There is no graphic object named "TestObjectFind" on the chart with ID #133246248352168439Let's create it.
   Now a graphic object named "TestObjectFind" exists on the chart with ID #133246248352168439Let's delete it
   */
  }