主要对象特性

所有对象都有一些通用特性。主要特性如下表所示。我们将在后续内容中介绍其他通用的特殊用途特性(请参阅 对象状态管理Z 轴顺序时间范围上下文中的对象可见性 章节)。

标识符

说明

类型

OBJPROP_NAME

对象名称

string

OBJPROP_TYPE

对象类型(只读)

ENUM_OBJECT

OBJPROP_CREATETIME

对象创建时间(只读)

datetime

OBJPROP_TEXT

对象说明(对象中包含的文本)

string

OBJPROP_TOOLTIP

鼠标悬停提示文本

string

OBJPROP_NAME 特性是对象标识符。编辑该特性相当于删除旧对象并创建新对象。

对于某些能够显示文本的对象类型(例如标签或按钮),OBJPROP_TEXT 特性会直接显示在图表中的对象内部。对于其他对象(例如线条),该特性包含的描述信息仅在图表设置中启用“显示对象描述选项”时,才会显示在图表上对象的旁边。无论何种情况,OBJPROP_TEXT 都会显示在工具提示中。

OBJPROP_CREATETIME 特性仅在当前会话期间有效,不会写入 chr 文件。

可以通过编程或手动方式(在对象特性对话框中)更改对象名称,而其创建时间将保持不变。预先说明,编程重命名不会在图表上触发任何与对象相关的事件。正如我们将在 下一章中学到的,手动重命名会触发三个事件:

  • 删除旧名称的对象 (CHARTEVENT_OBJECT_DELETE)
  • 创建新名称的对象 (CHARTEVENT_OBJECT_CREATE)
  • 修改新对象 (CHARTEVENT_OBJECT_CHANGE)

如果未设置 OBJPROP_TOOLTIP 特性,终端会自动为对象生成工具提示。要禁用工具提示,将其值设置为 "\n"(换行符)。

我们将对 查找对象 章节中的ObjectFinder.mq5脚本进行调整,用于记录当前图表中所有对象的上述特性。我们将新脚本命名为 ObjectListing.mq5

OnStart的起始阶段,我们将创建或修改一条位于最后一根柱线(即脚本启动时)的垂直直线。如果图表设置中启用了显示对象描述的选项,则我们将在右侧垂直线旁看到“当前最新柱线”文本。

void OnStart()
{
   const string vline = ObjNamePrefix + "current";
   ObjectCreate(0vlineOBJ_VLINE0iTime(NULL00), 0);
   ObjectSetString(0vlineOBJPROP_TEXT"Latest Bar At The Moment");
   ...

接下来,通过遍历子窗口的循环,我们将查询最多 ObjectsTotal个对象及其主要特性。

   int count = 0;
   const long id = ChartID();
   const int win = (int)ChartGetInteger(idCHART_WINDOWS_TOTAL);
   // loop through subwindows
   for(int k = 0k < win; ++k)
   {
      PrintFormat("  Window %d"k);
      const int n = ObjectsTotal(idk);
      //loop through objects
      for(int i = 0i < n; ++i)
      {
         const string name = ObjectName(idik);
         const ENUM_OBJECT type =
            (ENUM_OBJECT)ObjectGetInteger(idnameOBJPROP_TYPE);
         const datetime created =
            (datetime)ObjectGetInteger(idnameOBJPROP_CREATETIME);
         const string description = ObjectGetString(idnameOBJPROP_TEXT);
         const string hint = ObjectGetString(idnameOBJPROP_TOOLTIP);
         PrintFormat("    %s %s %s %s %s"EnumToString(type), name,
            TimeToString(created), descriptionhint);
         ++count;
      }
   }
   
   PrintFormat("%d objects found"count);
}

日志中会生成以下条目。

  Window 0
    OBJ_VLINE ObjShow-current 2021.12.21 20:20 Latest Bar At The Moment 
    OBJ_VLINE abc 2021.12.21 19:25  
    OBJ_VLINE xyz 1970.01.01 00:00  
3 objects found

OBJPROP_CREATETIME 值为零(1970.01.01 00:00)表示该对象并非在当前会话期间创建,而是在更早时间创建的。