ObjectDelete

函数从指定图表中的指定名称里删除物件。

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

参量

chart_id

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

name

[in]  删除物件的名称。

返回值

如果命令成功添加到指定图表队列那么函数返回true,否则返回false。

注释

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

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

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

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

 

示例:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| 脚本程序起始函数                                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 图表 ID
   long chart_id=ChartID();
 
//--- 循环遍历所有图表图形对象
   int obj_total=ObjectsTotal(chart_id);
   for(int i=obj_total-1i>=0i--)
     {
      //--- 每隔一个跳过对象 
      if(i%2==0)
         continue;
      
      //--- 取得图形对象的名称
      //--- 如果是自动交易标签, 跳过该对象
      string obj_name=ObjectName(chart_idi);
      if(StringFind(obj_name"autotrade")==0)
         continue;
      
      //--- 使用 chart_id 从图表上删除图形对象
      ResetLastError();
      if(ObjectDelete(chart_idobj_name))
        {
         PrintFormat("[%d] Graphic object named \"%s\" removed from the chart with ID #%I64d"iobj_namechart_id);
        }
      else
        {
         Print("ObjectDelete() failed. Error "GetLastError());
        }
     }
   /*
   放置了图形对象和自动交易标签(已跳过)的 6图表的结果:
   [659Graphic object named "M30 Rectangle 5636" removed from the chart with ID #128968168951083984
   [657Graphic object named "M30 Trendline 40731" removed from the chart with ID #128968168951083984
   [1Graphic object named "M30 Vertical Line 13600" removed from the chart with ID #128968168951083984
   */
  }