DoEasy 函数库中的图形(第九十三部分):准备创建复合图形对象的功能·进阶篇
🧩

DoEasy 函数库中的图形(第九十三部分):准备创建复合图形对象的功能·进阶篇

(2/3)· 想把 44 种 MT5 图形拼成新分析工具,先得搞定对象扩展属性与从属坐标类

含代码示例偏理论 第 2/3 篇
很多交易者以为 MT5 的分析工具不够用就只能等官方更新,其实用 MQL5 把现有图形绑成复合对象就能造出新工具。问题在于直接拖对象只会散落各处,缺少从属坐标机制就谈不上动态附着。本篇先把底层属性与类结构铺好,实时组合才有地基。

◍ 图形对象枚举的排序维度清单

在 MT5 的 ObjectsTotal / ObjectGetInteger 体系里,图形对象并非只能按名称乱序遍历,系统提供了一组 SORT_BY_GRAPH_OBJ_* 枚举值,用来决定 ObjectsSetString 之前集合的排列依据。 下面这 27 个枚举覆盖了从类型、所属图表、子窗口到创建时间、Z 轴点击优先级乃至只读属性的全维度排序键。实盘写 EA 时若要在百个对象里快速定位趋势线,优先用 SORT_BY_GRAPH_OBJ_CREATETIME 或 SORT_BY_GRAPH_OBJ_TIME 比裸循环更高效。 外汇与贵金属图表对象受报价跳空影响,对象时间坐标可能错位,用 SORT_BY_GRAPH_OBJ_TIME 排序后仍需做边界校验,这类品种高风险,回测与实盘对象行为可能不一致。

MQL5 / C++
SORT_BY_GRAPH_OBJ_ELEMENT_TYPE, class=class="str">"cmt">// Sort by graphical element type
SORT_BY_GRAPH_OBJ_SPECIES, class=class="str">"cmt">// Sort by a graphical object species
SORT_BY_GRAPH_OBJ_BELONG, class=class="str">"cmt">//  Sort by a graphical element affiliation
SORT_BY_GRAPH_OBJ_CHART_ID, class=class="str">"cmt">// Sort by chart ID
SORT_BY_GRAPH_OBJ_WND_NUM, class=class="str">"cmt">// Sort by chart subwindow index
SORT_BY_GRAPH_OBJ_NUM, class=class="str">"cmt">// Sort by object index in the list
SORT_BY_GRAPH_OBJ_CHANGE_HISTORY, class=class="str">"cmt">// Sort by the flag of storing the change history
SORT_BY_GRAPH_OBJ_GROUP, class=class="str">"cmt">// Sort by the group of objects the graphical object belongs to
SORT_BY_GRAPH_OBJ_CREATETIME, class=class="str">"cmt">// Sort by object creation time
SORT_BY_GRAPH_OBJ_TIMEFRAMES, class=class="str">"cmt">// Sort by object visibility on timeframes
SORT_BY_GRAPH_OBJ_BACK, class=class="str">"cmt">// Sort by the "Background object" class="kw">property
SORT_BY_GRAPH_OBJ_ZORDER, class=class="str">"cmt">// Sort by the priority of a graphical object for receiving the event of clicking on a chart
SORT_BY_GRAPH_OBJ_HIDDEN, class=class="str">"cmt">// Sort by a disabling display of the name of a graphical object in the terminal object list
SORT_BY_GRAPH_OBJ_SELECTED, class=class="str">"cmt">// Sort by the "Object selection" class="kw">property
SORT_BY_GRAPH_OBJ_SELECTABLE, class=class="str">"cmt">// Sort by the "Object availability" class="kw">property
SORT_BY_GRAPH_OBJ_TIME, class=class="str">"cmt">// Sort by time coordinate
SORT_BY_GRAPH_OBJ_COLOR, class=class="str">"cmt">// Sort by class="type">class="kw">color
SORT_BY_GRAPH_OBJ_STYLE, class=class="str">"cmt">// Sort by style
SORT_BY_GRAPH_OBJ_WIDTH, class=class="str">"cmt">// Sort by line width
SORT_BY_GRAPH_OBJ_FILL, class=class="str">"cmt">// Sort by the "Object class="type">class="kw">color filling" class="kw">property
SORT_BY_GRAPH_OBJ_READONLY class=class="str">"cmt">// Sort by the ability to edit text in the Edit object

图形对象排序枚举的剩余字段

在 MT5 的 ObjectsTotal / ObjectGet 系列调用里,若要对图表上的图形对象做批量排序,除了前几个基础属性,还有一批针对特殊对象类型的枚举值可用。 下面这些 SORT_BY_GRAPH_OBJ_* 常量覆盖了从斐波那契弧、甘恩线到 Elliott 波浪标记乃至内嵌图表对象的排序维度,实际写 EA 或指标时按需取用即可。 SORT_BY_GRAPH_OBJ_LEVELS 按水平线数量排,SORT_BY_GRAPH_OBJ_LEVELCOLOR 按水平线颜色排,SORT_BY_GRAPH_OBJ_LEVELSTYLE 按线型排,SORT_BY_GRAPH_OBJ_LEVELWIDTH 按线宽排。 SORT_BY_GRAPH_OBJ_ALIGN 对应输入框内文字水平对齐属性,SORT_BY_GRAPH_OBJ_FONTSIZE 按字体大小排,SORT_BY_GRAPH_OBJ_RAY_LEFT / RAY_RIGHT 分别按向左 / 向右射线属性排。 SORT_BY_GRAPH_OBJ_RAY 针对贯穿图表所有窗口的竖线,SORT_BY_GRAPH_OBJ_ELLIPSE 针对斐波那契弧显示完整椭圆属性,SORT_BY_GRAPH_OBJ_ARROWCODE 按箭头对象的箭头代码排。 SORT_BY_GRAPH_OBJ_ANCHOR 按绑定点位置排,SORT_BY_GRAPH_OBJ_XDISTANCE / YDISTANCE 按距基准角像素距离排,SORT_BY_GRAPH_OBJ_DIRECTION 按甘恩对象趋势排。 SORT_BY_GRAPH_OBJ_DEGREE 按 Elliott 波浪标记级别排,SORT_BY_GRAPH_OBJ_DRAWLINES 按是否显示波浪线排,SORT_BY_GRAPH_OBJ_STATE 按按钮按下 / 弹起状态排。 最后一组针对 Chart 对象本身:SORT_BY_GRAPH_OBJ_OBJ_CHART_ID 按图表对象 ID 排,SORT_BY_GRAPH_OBJ_CHART_OBJ_PERIOD 按期排,SORT_BY_GRAPH_OBJ_CHART_OBJ_DATE_SCALE / PRICE_SCALE 分别按时间轴、价格轴显示开关排。外汇与贵金属图表对象繁杂,用这些枚举批量整理时需注意多品种多周期下的对象冲突风险。

MQL5 / C++
  SORT_BY_GRAPH_OBJ_LEVELS,                                                                     class=class="str">"cmt">// Sort by number of levels
  SORT_BY_GRAPH_OBJ_LEVELCOLOR,                                                                   class=class="str">"cmt">// Sort by line level class="type">class="kw">color
  SORT_BY_GRAPH_OBJ_LEVELSTYLE,                                                                   class=class="str">"cmt">// Sort by line level style
  SORT_BY_GRAPH_OBJ_LEVELWIDTH,                                                                   class=class="str">"cmt">// Sort by line level width
  SORT_BY_GRAPH_OBJ_ALIGN,                                                                        class=class="str">"cmt">// Sort by the "Horizontal text alignment in the Entry field" class="kw">property
  SORT_BY_GRAPH_OBJ_FONTSIZE,                                                                     class=class="str">"cmt">// Sort by font size
  SORT_BY_GRAPH_OBJ_RAY_LEFT,                                                                     class=class="str">"cmt">// Sort by "Ray goes to the left" class="kw">property
  SORT_BY_GRAPH_OBJ_RAY_RIGHT,                                                                    class=class="str">"cmt">// Sort by "Ray goes to the right" class="kw">property
  SORT_BY_GRAPH_OBJ_RAY,                                                                          class=class="str">"cmt">// Sort by the "Vertical line goes through all windows of a chart" class="kw">property
  SORT_BY_GRAPH_OBJ_ELLIPSE,                                                                      class=class="str">"cmt">// Sort by the "Display the full ellipse of the Fibonacci Arc object" class="kw">property
  SORT_BY_GRAPH_OBJ_ARROWCODE,                                                                    class=class="str">"cmt">// Sort by an arrow code for the Arrow object
  SORT_BY_GRAPH_OBJ_ANCHOR,                                                                       class=class="str">"cmt">// Sort by the position of a binding point of a graphical object
  SORT_BY_GRAPH_OBJ_XDISTANCE,                                                                    class=class="str">"cmt">// Sort by a distance from the base corner along the X axis in pixels
  SORT_BY_GRAPH_OBJ_YDISTANCE,                                                                    class=class="str">"cmt">// Sort by a distance from the base corner along the Y axis in pixels
  SORT_BY_GRAPH_OBJ_DIRECTION,                                                                    class=class="str">"cmt">// Sort by the "Gann object trend" class="kw">property
  SORT_BY_GRAPH_OBJ_DEGREE,                                                                       class=class="str">"cmt">// Sort by the "Elliott wave marking level" class="kw">property
  SORT_BY_GRAPH_OBJ_DRAWLINES,                                                                    class=class="str">"cmt">// Sort by the "Display lines for Elliott wave marking" class="kw">property
  SORT_BY_GRAPH_OBJ_STATE,                                                                        class=class="str">"cmt">// Sort by button state(pressed/released)
  SORT_BY_GRAPH_OBJ_OBJ_CHART_ID,                                                                 class=class="str">"cmt">// Sort by Chart object ID.
  SORT_BY_GRAPH_OBJ_CHART_OBJ_PERIOD,                                                             class=class="str">"cmt">// Sort by Chart object period
  SORT_BY_GRAPH_OBJ_CHART_OBJ_DATE_SCALE,                                                         class=class="str">"cmt">// Sort by time scale display flag for the Chart object
  SORT_BY_GRAPH_OBJ_CHART_OBJ_PRICE_SCALE                                                        class=class="str">"cmt">// Sort by price scale display flag for the Chart object

「图形对象排序枚举的隐藏维度」

在 MT5 的 ObjectsTotal / ObjectGet 系列调用之外,还有一组专门给 GraphObject 排序用的枚举值,分三大类:界面属性、真实价格属性、字符串属性。 界面类里 SORT_BY_GRAPH_OBJ_CHART_OBJ_CHART_SCALE 控制图表对象缩放层级,SORT_BY_GRAPH_OBJ_XSIZE / YSIZE 按像素宽高排,XOFFSET / YOFFSET 取可视区左上角坐标,CORNER 绑定图表角落,BORDER_TYPE / BORDER_COLOR 针对矩形边框和按钮边框。 真实属性从 FIRST_GRAPH_OBJ_DBL_PROP 起跳:PRICE 按价格坐标,LEVELVALUE 按水平线数值,SCALE 管江恩和斐波那契弧的缩放,ANGLE 按角度,DEVIATION 管标准差通道偏离。字符串属性从 FIRST_GRAPH_OBJ_STR_PROP 开始,NAME 按对象名,BASE_NAME 按底层对象名(易被忽略但多对象联动时有用),TEXT / TOOLTIP / LEVELTEXT / FONT / BMPFILE / CHART_OBJ_SYMBOL 各管描述、悬停、层级文字、字体、位图文件与图表品种。 开 MT5 敲一组 ObjectsSort(0, SORT_BY_GRAPH_OBJ_LEVELVALUE) 再循环读 ObjectGetDouble,能直接验证水平线数值排序是否如枚举所说生效。外汇与贵金属杠杆高,脚本误排对象可能导致止损线读取错位,实盘前务必在模拟环境跑通。

MQL5 / C++
  SORT_BY_GRAPH_OBJ_CHART_OBJ_CHART_SCALE,              class=class="str">"cmt">// Sort by Chart object scale
  SORT_BY_GRAPH_OBJ_XSIZE,                                class=class="str">"cmt">// Sort by Object width along the X axis in pixels
  SORT_BY_GRAPH_OBJ_YSIZE,                                class=class="str">"cmt">// Sort by object height along the Y axis in pixels
  SORT_BY_GRAPH_OBJ_XOFFSET,                              class=class="str">"cmt">// Sort by X coordinate of the upper-left corner of the visibility area
  SORT_BY_GRAPH_OBJ_YOFFSET,                              class=class="str">"cmt">// Sort by Y coordinate of the upper-left corner of the visibility area
  SORT_BY_GRAPH_OBJ_BGCOLOR,                              class=class="str">"cmt">// Sort by background class="type">class="kw">color for OBJ_EDIT, OBJ_BUTTON and OBJ_RECTANGLE_LABEL
  SORT_BY_GRAPH_OBJ_CORNER,                               class=class="str">"cmt">// Sort by chart corner for binding a graphical object
  SORT_BY_GRAPH_OBJ_BORDER_TYPE,                          class=class="str">"cmt">// Sort by border type for the "Rectangle border" object
  SORT_BY_GRAPH_OBJ_BORDER_COLOR,                         class=class="str">"cmt">// Sort by frame class="type">class="kw">color for the OBJ_EDIT and OBJ_BUTTON objects
class=class="str">"cmt">//--- Sort by real properties
  SORT_BY_GRAPH_OBJ_PRICE = FIRST_GRAPH_OBJ_DBL_PROP,     class=class="str">"cmt">// Sort by price coordinate
  SORT_BY_GRAPH_OBJ_LEVELVALUE,                           class=class="str">"cmt">// Sort by level value
  SORT_BY_GRAPH_OBJ_SCALE,                                class=class="str">"cmt">// Sort by scale(class="kw">property of Gann objects and Fibonacci Arcs objects)
  SORT_BY_GRAPH_OBJ_ANGLE,                                class=class="str">"cmt">// Sort by angle
  SORT_BY_GRAPH_OBJ_DEVIATION,                            class=class="str">"cmt">// Sort by a deviation of the standard deviation channel
class=class="str">"cmt">//--- Sort by class="type">class="kw">string properties
  SORT_BY_GRAPH_OBJ_NAME = FIRST_GRAPH_OBJ_STR_PROP,      class=class="str">"cmt">// Sort by object name
  SORT_BY_GRAPH_OBJ_BASE_NAME,                            class=class="str">"cmt">// Sort by base object name
  SORT_BY_GRAPH_OBJ_TEXT,                                 class=class="str">"cmt">// Sort by object description
  SORT_BY_GRAPH_OBJ_TOOLTIP,                              class=class="str">"cmt">// Sort by tooltip text
  SORT_BY_GRAPH_OBJ_LEVELTEXT,                            class=class="str">"cmt">// Sort by level description
  SORT_BY_GRAPH_OBJ_FONT,                                 class=class="str">"cmt">// Sort by font
  SORT_BY_GRAPH_OBJ_BMPFILE,                              class=class="str">"cmt">// Sort by BMP file name for the "Bitmap Level" object
  SORT_BY_GRAPH_OBJ_CHART_OBJ_SYMBOL,                     class=class="str">"cmt">// Sort by Chart object period symbol
};

◍ 图形对象消息枚举里的隐藏字段

在 MT5 标准库的消息枚举段里,有一批 MSG_GRAPH_OBJ_PROP_* 常量专门描述图形对象的属性通道,其中 MSG_GRAPH_OBJ_PROP_BASE_ID 与 MSG_GRAPH_OBJ_PROP_BASE_NAME 常被忽略——它们指向对象的「基类标识」,在自定义控件继承标准图形对象时用来回溯父级。 MSG_GRAPH_ELEMENT_TYPE_STANDARD_EXTENDED 这个枚举值也值得留意,它代表扩展标准图形对象,和普通 STANDARD 类型在事件路由上有区分。如果你的 EA 监听 MSG_GRAPH_OBJ_EVN_GRAPH_OBJ_CREATE 事件,却收不到某些对象的创建通知,大概率是没有处理 EXTENDED 分支。 下面这段枚举摘出来,直接贴进 MT5 的 .mqh 里就能编译验证,重点看高亮那三行基类和扩展类型: 别把对象事件当成单一类型 监听图形对象变更时,CREATE / CHANGE / RENAME / DELETE 四类事件都带 ELEMENT_TYPE 字段;只判断 STANDARD 会漏掉 EXTENDED 对象,导致面板类工具状态不同步。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
   MSG_LIB_SYS_REQUEST_OUTSIDE_LONG_ARRAY,                class=class="str">"cmt">// Request outside class="type">long array
   MSG_LIB_SYS_REQUEST_OUTSIDE_DOUBLE_ARRAY,              class=class="str">"cmt">// Request outside class="type">class="kw">double array
   MSG_LIB_SYS_REQUEST_OUTSIDE_STRING_ARRAY,              class=class="str">"cmt">// Request outside class="type">class="kw">string array
   MSG_LIB_SYS_REQUEST_OUTSIDE_ARRAY,                     class=class="str">"cmt">// Request outside the array
   MSG_GRAPH_ELEMENT_TYPE_STANDARD,                       class=class="str">"cmt">// Standard graphical object
   MSG_GRAPH_ELEMENT_TYPE_STANDARD_EXTENDED,              class=class="str">"cmt">// Extended standard graphical object
   MSG_GRAPH_ELEMENT_TYPE_ELEMENT,                        class=class="str">"cmt">// Element
   MSG_GRAPH_ELEMENT_TYPE_SHADOW_OBJ,                     class=class="str">"cmt">// Shadow object
   MSG_GRAPH_ELEMENT_TYPE_FORM,                           class=class="str">"cmt">// Form
   MSG_GRAPH_ELEMENT_TYPE_WINDOW,                         class=class="str">"cmt">// Window
   MSG_GRAPH_OBJ_PROP_ID,                                 class=class="str">"cmt">// Object ID
   MSG_GRAPH_OBJ_PROP_BASE_ID,                            class=class="str">"cmt">// Base object ID
   MSG_GRAPH_OBJ_PROP_TYPE,                               class=class="str">"cmt">// Graphical object type(ENUM_OBJECT)
   MSG_GRAPH_OBJ_PROP_ELEMENT_TYPE,                       class=class="str">"cmt">// Graphical element type(ENUM_GRAPH_ELEMENT_TYPE)
   MSG_GRAPH_OBJ_PROP_NAME,                               class=class="str">"cmt">// Object name
   MSG_GRAPH_OBJ_PROP_BASE_NAME,                          class=class="str">"cmt">// Base object name
   MSG_GRAPH_OBJ_PROP_TEXT,                               class=class="str">"cmt">// Object description(text contained in the object)
   MSG_GRAPH_OBJ_PROP_TOOLTIP,                            class=class="str">"cmt">// Tooltip text
   MSG_GRAPH_OBJ_PROP_LEVELTEXT,                          class=class="str">"cmt">// Level description
   MSG_GRAPH_OBJ_PROP_FONT,                               class=class="str">"cmt">// Font
   MSG_GRAPH_OBJ_PROP_BMPFILE,                            class=class="str">"cmt">// BMP file name for the "Bitmap Level" object
   MSG_GRAPH_OBJ_PROP_SYMBOL,                             class=class="str">"cmt">// Chart object symbol
   MSG_GRAPH_OBJ_EVN_GRAPH_OBJ_CREATE,                    class=class="str">"cmt">// New graphical object created
   MSG_GRAPH_OBJ_EVN_GRAPH_OBJ_CHANGE,                    class=class="str">"cmt">// Changed the graphical object class="kw">property
   MSG_GRAPH_OBJ_EVN_GRAPH_OBJ_RENAME,                    class=class="str">"cmt">// Graphical object renamed
   MSG_GRAPH_OBJ_EVN_GRAPH_OBJ_DELETE,                    class=class="str">"cmt">// Graphical object removed

扩展图形对象的报错枚举与多语映射

在 MT5 标准库里,CGStdGraphObj 这套扩展图形对象体系靠一组 MSG_GRAPH_OBJ_* 枚举来承载运行状态。除了基础的『随图表删除对象』,还细分了扩展对象创建失败、基类加入列表失败、子对象挂载失败等至少 9 条独立报错码,调试时可直接用这些常量定位是哪一步 new 对象崩了。 CLinkedPivotPoint 这类依赖枢轴点的对象更苛刻:若 X 轴或 Y 轴一个 pivot 都没设,或者没挂到 base 对象上,就会抛出 MSG_GRAPH_OBJ_EXT_NOT_ANY_PIVOTS_X / _Y 与 MSG_GRAPH_OBJ_EXT_NOT_ATACHED_TO_BASE。实盘写自定义指标时,这类静默失败往往比语法错更难查。 下面这段双语数组把俄文原串映射到英文,例如 "Расширенный стандартный графический объект" 对应 "Extended standard graphic object","Идентификатор базового объекта" 对应 "Base object ID"。如果你要做多语面板,直接抄这层映射就能少写一堆 StringReplace。 开 MT5 随便建个 EA 把 MSG_GRAPH_OBJ_FAILED_CREATE_NEW_EXT_OBJ 打进 Print,就能验证扩展对象在图表重置时的真实报错顺序。外汇与贵金属图表对象受 tick 驱动,高频重绘下这类错误概率会明显上升,属高风险环境。

MQL5 / C++
MSG_GRAPH_OBJ_EVN_GRAPH_OBJ_DEL_CHART,              class=class="str">"cmt">// Graphical object removed together with the chart

class=class="str">"cmt">//--- CGStdGraphObj(Extended)
  MSG_GRAPH_OBJ_FAILED_CREATE_NEW_EXT_OBJ,              class=class="str">"cmt">//  Failed to create the class object of an extended graphical object
  MSG_GRAPH_OBJ_FAILED_CREATE_NEW_BASE_EXT_OBJ,         class=class="str">"cmt">// Failed to create the base object for an extended graphical object
  MSG_GRAPH_OBJ_FAILED_ADD_EXT_OBJ_TO_LIST,             class=class="str">"cmt">// Failed to add the extended standard graphical object to the list
  MSG_GRAPH_OBJ_FAILED_ADD_BASE_EXT_OBJ_TO_LIST,        class=class="str">"cmt">// Failed to add the base object to the list
  MSG_GRAPH_OBJ_FAILED_CREATE_NEW_DEP_EXT_OBJ,          class=class="str">"cmt">// Failed to create the subordinate object of an extended graphical object
  MSG_GRAPH_OBJ_FAILED_ADD_DEP_EXT_OBJ_TO_LIST,         class=class="str">"cmt">// Failed to add the subordinate object to the list
  MSG_GRAPH_OBJ_FAILED_GET_EXT_OBJ_FROM_LIST,           class=class="str">"cmt">// Failed to receive the extended graphical object from the list
  MSG_GRAPH_OBJ_PROP_NUM_EXT_BASE_OBJ,                  class=class="str">"cmt">// Base object of the extended graphical object
  MSG_GRAPH_OBJ_NOT_EXT_OBJ,                            class=class="str">"cmt">// The object is not an extended standard graphical object

class=class="str">"cmt">//--- CLinkedPivotPoint
  MSG_GRAPH_OBJ_EXT_NOT_ANY_PIVOTS_X,                   class=class="str">"cmt">// Not a single pivot point is set for the object along the X axis
  MSG_GRAPH_OBJ_EXT_NOT_ANY_PIVOTS_Y,                   class=class="str">"cmt">// Not a single pivot point is set for the object along the Y axis
  MSG_GRAPH_OBJ_EXT_NOT_ATACHED_TO_BASE,                class=class="str">"cmt">// The object is not attached to the basic graphical object
  MSG_GRAPH_OBJ_EXT_FAILED_CREATE_PP_DATA_OBJ,          class=class="str">"cmt">// Failed to create a data object for the X and Y pivot points
};
class=class="str">"cmt">//+------------------------------------------------------------------+
  {"Запрос за пределами class="type">long-массива","Data requested outside the class="type">long-array"},
  {"Запрос за пределами class="type">class="kw">double-массива","Data requested outside the class="type">class="kw">double-array"},
  {"Запрос за пределами class="type">class="kw">string-массива","Data requested outside the class="type">class="kw">string-array"},
  {"Запрос за пределами массива","Data requested outside the array"},
  {"Стандартный графический объект","Standard graphic object"},
  {"Расширенный стандартный графический объект","Extended standard graphic object"},
  {"Элемент","Element"},
  {"Объект тени","Shadow object"},
  {"Форма","Form"},
  {"Окно","Window"},
  {"Идентификатор объекта","Object ID"},
  {"Идентификатор базового объекта","Base object ID"},
  {"Тип объекта","Object type"},
  {"Тип графического элемента","Graphic element type"},
  {"Имя","Name"},
  {"Имя базового объекта","Base object name"},
  {"Описание","Description"},
  {"Текст всплывающей подсказки","The text of a tooltip"},
  {"Описание уровня","Level description"},
  {"Шрифт","Font"},
  {"Имя BMP-файла","BMP-file name"},
  {"Символ графика","Chart Symbol"},

「扩展图形对象的报错与箭头构造落点」

上面这段结构里塞的是标准及扩展图形对象的本地化报错表,俄英双串成对。基础事件覆盖对象创建、属性变更、重命名、删除,以及随图表一起被移除的情况;扩展段则专门兜底 CGStdGraphObj 派生时的各类失败:基类建不出、进不了链表、附属对象挂不上等,总共约 18 条可对照的出错文案。 CLinkedPivotPoint 那几行值得单独看——它要求 X、Y 轴都必须先设锚点,否则直接报“未设置枢轴点”;对象若没绑到基图形也跑不起来。做自定义指标时,这类报错往往比返回值更早暴露结构问题。 CGStdArrowBuyObj 的构造函数演示了 extended 开关怎么走:传入 false 走 GRAPH_ELEMENT_TYPE_STANDARD 且归属 NO_PROGRAM,true 则切到 STANDARD_EXTENDED 并归 PROGRAM 管。锚点写死 ANCHOR_TOP,意味着买箭头默认贴顶点。外汇与贵金属图表加载此类对象波动剧烈,高风险,参数误用可能让对象不显示。 开 MT5 把这段报错表贴进自己的多语言枚举,再改 CGStdArrowBuyObj 的 anchor 试不同贴点,能直观验证对象归属逻辑。

MQL5 / C++
  {"Создан новый графический объект","New graphic object created"},
  {"Изменено свойство графического объекта","Changed graphic object class="kw">property"},
  {"Графический объект переименован","Graphic object renamed"},
  {"Удалён графический объект","Graphic object deleted"},
  {"Графический объект удалён вместе с графиком","The graphic object has been removed along with the chart"},

class=class="str">"cmt">//--- CGStdGraphObj(Extended)
  {"Не удалось создать объект класса расширенного графического объекта","Failed to create the class object of extended standart graphics object"},
  {"Не удалось создать базовый объект расширенного графического объекта","Failed to create the base object of a extended graphics object"},
  {"Не удалось добавить расширенный стандартный графический объект в список","Failed to add extended standard graphic object to the list"},
  {"Не удалось добавить базовый объект в список","Failed to add base object to list"},
  {"Не удалось создать подчинённый объект расширенного графического объекта","Failed to create the dependent object of a extended graphics object"},
  {"Не удалось добавить подчинённый объект в список","Failed to add dependent object to list"},
  {"Не удалось получить расширенный графический объект из списка","Failed to get extended graphic object from list"},
  {"Базовый объект расширенного графического объекта","The base object of the extended graphical object"},
  {"Объект не является расширенным стандартным графическим объектом","The object is not an extended standard graphical object"},

class=class="str">"cmt">//--- CLinkedPivotPoint
  {"Для объекта не установлено ни одной опорной точки по оси X","The object does not have any pivot points set along the x-axis"},
  {"Для объекта не установлено ни одной опорной точки по оси Y","The object does not have any pivot points set along the y-axis"},
  {"Объект не привязан к базовому графическому объекту","The object is not attached to the base graphical object"},
  {"Не удалось создать объект данных опорной точки X и Y.","Failed to create X and Y reference point data object"},

  };

class="kw">public:
  class=class="str">"cmt">//--- Constructor
                     CGStdArrowBuyObj(class="kw">const class="type">long chart_id,class="kw">const class="type">class="kw">string name,class="kw">const class="type">bool extended) :
                     CGStdGraphObj(OBJECT_DE_TYPE_GSTD_ARROW_BUY,(!extended ? GRAPH_ELEMENT_TYPE_STANDARD : GRAPH_ELEMENT_TYPE_STANDARD_EXTENDED),(!extended ? GRAPH_OBJ_BELONG_NO_PROGRAM : GRAPH_OBJ_BELONG_PROGRAM),GRAPH_OBJ_SPECIES_ARROWS,chart_id,class="num">1,name)
                       {
                       class=class="str">"cmt">//--- Specify the object class="kw">property
                       CGStdGraphObj::SetProperty(GRAPH_OBJ_PROP_ANCHOR,class="num">0,ANCHOR_TOP);
                       }
把对象绑定逻辑交给小布
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到复合对象的从属关系与坐标偏移,你专注策略而非底层枚举改动。

常见问题

原生对象没有基准 ID 与名称字段,无法表达谁附着于谁;加入整数与字符串属性后,库才能按从属关系筛选、排序和重组。
可以,小布在品种页把基准与从属对象的 X/Y 计算逻辑可视化,省去手动翻枚举和调试属性。
能,例如取趋势线点 0 与点 1 的 X 均值作为从属 X,库类支持用基准任意坐标组合推导位置,概率上更贴合视觉定位。
它让对象列表可按新属性提取,后续实时拖拽附着时,程序能快速判定目标基准与重定义锚点。