DoEasy 函数库中的图形(第八十八部分):图形对象集合  存储对象动态变化属性的二维动态数组·进阶篇
📘

DoEasy 函数库中的图形(第八十八部分):图形对象集合 存储对象动态变化属性的二维动态数组·进阶篇

第 2/3 篇

◍ 库对象类型的枚举骨架

在自建 MQL5 分析库时,先把所有可操作实体归到一个统一的类型枚举里,能省掉后续大量 if(obj.Type==...) 的散装判断。下面这段枚举把账户、订单簿、图表、事件全部收进同一套 OBJECT_DE_TYPE_* 常量,基础类型 OBJECT_DE_TYPE_BASE_EXT 是所有库对象的扩展基类。 订单簿相关拆得很细:BOOK_ORDER 是挂单容器,BOOK_BUY / BOOK_SELL 区分买卖方向,BOOK_BUY_MARKET / BOOK_SELL_MARKET 特指市价单,而 BOOK_SNAPSHOTBOOK_SERIES 分别存某一刻深度快照和连续快照序列。做贵金属盘口重构时,靠 BOOK_SERIES 才能回放出某根 1 分钟 K 线内的流动性抽离过程。 图表侧给了三层:CHART 主图、CHART_WND 子窗口、CHART_WND_IND 子窗口里的指标对象,方便小布类工具精准挂指标而不碰错窗口。事件侧覆盖余额变动、挂单改仓、市价单成交、删单、平仓五类,回测里抓 EVENT_POSITION_CLOSE 比轮询持仓快一个数量级。 外汇与贵金属杠杆高、滑点跳空频繁,用这套枚举做事件驱动前,先在 MT5 策略测试器跑一遍 Tick 级回测确认事件触发顺序符合预期。

MQL5 / C++
OBJECT_DE_TYPE_BASE_EXT,                                                                         class=class="str">"cmt">// Extended base object for all library objects

OBJECT_DE_TYPE_ACCOUNT,                                                                               class=class="str">"cmt">// "Account" object type
OBJECT_DE_TYPE_BOOK_ORDER,                                                                            class=class="str">"cmt">// "Book order" object type
OBJECT_DE_TYPE_BOOK_BUY,                                                                              class=class="str">"cmt">// "Book buy order" object type
OBJECT_DE_TYPE_BOOK_BUY_MARKET,                                                                       class=class="str">"cmt">// "Book buy order at market price" object type
OBJECT_DE_TYPE_BOOK_SELL,                                                                             class=class="str">"cmt">// "Book sell order" object type
OBJECT_DE_TYPE_BOOK_SELL_MARKET,                                                                      class=class="str">"cmt">// "Book sell order at market price" object type
OBJECT_DE_TYPE_BOOK_SNAPSHOT,                                                                         class=class="str">"cmt">// "Book snapshot" object type
OBJECT_DE_TYPE_BOOK_SERIES,                                                                           class=class="str">"cmt">// "Book snapshot series" object type

OBJECT_DE_TYPE_CHART,                                                                                 class=class="str">"cmt">// "Chart" object type
OBJECT_DE_TYPE_CHART_WND,                                                                             class=class="str">"cmt">// "Chart window" object type
OBJECT_DE_TYPE_CHART_WND_IND,                                                                         class=class="str">"cmt">// "Chart window indicator" object type

OBJECT_DE_TYPE_EVENT,                                                                                 class=class="str">"cmt">// "Event" object type
OBJECT_DE_TYPE_EVENT_BALANCE,                                                                         class=class="str">"cmt">// "Balance operation event" object type
OBJECT_DE_TYPE_EVENT_MODIFY,                                                                          class=class="str">"cmt">// "Pending order/position modification event" object type
OBJECT_DE_TYPE_EVENT_ORDER_PLASED,                                                                    class=class="str">"cmt">// "Placing a pending order event" object type
OBJECT_DE_TYPE_EVENT_ORDER_REMOVED,                                                                   class=class="str">"cmt">// "Pending order removal event" object type
OBJECT_DE_TYPE_EVENT_POSITION_CLOSE                                                                   class=class="str">"cmt">// "Position closure event" object type

事件对象与指标对象的类型枚举

在 MT5 的绘图事件(Drawing Event)体系里,对象类型用一组枚举常量区分。上面这段列出了两类:一类是「事件触发型」对象,比如持仓开仓事件 OBJECT_DE_TYPE_EVENT_POSITION_OPEN;另一类是「指标型」对象,涵盖指标缓冲区与具体指标本体。 指标缓冲区细分很密:从 IND_BUFFER(普通缓冲)、IND_BUFFER_ARROW(箭头渲染)、IND_BUFFER_BAR(柱线)、IND_BUFFER_CANDLE(蜡烛)、IND_BUFFER_FILLING(填充)、IND_BUFFER_HISTOGRAMM / HISTOGRAMM2(直方图及双直方图)、IND_BUFFER_LINE(线)、IND_BUFFER_SECTION(区段)、IND_BUFFER_ZIGZAG(之字转向),到 IND_BUFFER_CALCULATE(计算缓冲)共 12 种。 具体指标对象则从 IND_DATA(指标数据)、IND_DATA_LIST(指标数据列表)起,再落到单指标:IND_AC(加速振荡器)、IND_AD(累积/派发)、IND_ADX(平均趋向指数)、IND_ADXW(Wilder 版 ADX)等。开 MT5 在 MetaEditor 搜 OBJECT_DE_TYPE_ 前缀,能直接看到完整枚举,验证你当前终端支持到哪一类。 写自定义指标或事件监听 EA 时,先用对类型常量,否则事件回调里拿到的对象描述(CObjInfo)会解析失败,这是调试时最容易卡住的一处。

MQL5 / C++
  OBJECT_DE_TYPE_EVENT_POSITION_OPEN,                                                                       class=class="str">"cmt">// "Position opening event" object type
  
  OBJECT_DE_TYPE_IND_BUFFER,                                                                                   class=class="str">"cmt">// "Indicator buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_ARROW,                                                                             class=class="str">"cmt">// "Arrow rendering buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_BAR,                                                                               class=class="str">"cmt">// "Bar buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_CALCULATE,                                                                         class=class="str">"cmt">// "Calculated buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_CANDLE,                                                                            class=class="str">"cmt">// "Candle buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_FILLING,                                                                           class=class="str">"cmt">// "Filling buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_HISTOGRAMM,                                                                        class=class="str">"cmt">// "Histogram buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_HISTOGRAMM2,                                                                       class=class="str">"cmt">// "Histogram class="num">2 buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_LINE,                                                                              class=class="str">"cmt">// "Line buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_SECTION,                                                                           class=class="str">"cmt">// "Section buffer" object type
  OBJECT_DE_TYPE_IND_BUFFER_ZIGZAG,                                                                            class=class="str">"cmt">// "Zigzag buffer" object type
  OBJECT_DE_TYPE_INDICATOR,                                                                                    class=class="str">"cmt">// "Indicator" object type
  OBJECT_DE_TYPE_IND_DATA,                                                                                     class=class="str">"cmt">// "Indicator data" object type
  OBJECT_DE_TYPE_IND_DATA_LIST,                                                                                class=class="str">"cmt">// "Indicator data list" object type
  
  OBJECT_DE_TYPE_IND_AC,                                                                                       class=class="str">"cmt">// "Accelerator Oscillator indicator" object type
  OBJECT_DE_TYPE_IND_AD,                                                                                       class=class="str">"cmt">// "Accumulation/Distribution indicator" object type
  OBJECT_DE_TYPE_IND_ADX,                                                                                      class=class="str">"cmt">// "Average Directional Index indicator" object type
  OBJECT_DE_TYPE_IND_ADXW,                                                                                     class=class="str">"cmt">// "ADX indicator by Welles Wilder" object type

「指标对象类型的枚举常量清单」

在 MT5 的图表对象体系里,每一类内置指标都对应一个 ENUM_OBJECT_DE_TYPE 下的专属常量,用于程序化识别或批量操作。上面这段枚举片段列出了从鳄鱼到 FRAMA 共 17 个指标对象类型,覆盖趋势、震荡、成交量三大类。 以 OBJECT_DE_TYPE_IND_ALLIGATOR 为例,它专门指向鳄鱼指标对象,若你在 EA 里遍历图表对象并筛选类型,就能只对鳄鱼线做参数重绘或删除,而不碰其他图层。同类地,OBJECT_DE_TYPE_IND_CUSTOM 留给自定义指标,是外接小布类分析脚本的常见挂载点。 实操上,把这些常量直接塞进 ObjectType() 判断或 ObjectCreate() 的 type 参数,就能在五位数报价的外汇品种上稳定区分指标图层。贵金属与外汇杠杆交易波动剧烈,用代码批量管理对象时务必先于策略测试器跑一遍,避免误删导致信号丢失。

MQL5 / C++
  OBJECT_DE_TYPE_IND_ALLIGATOR,                                                                     class=class="str">"cmt">// "Alligator indicator" object type
  OBJECT_DE_TYPE_IND_AMA,                                                                             class=class="str">"cmt">// "Adaptive Moving Average indicator" object type
  OBJECT_DE_TYPE_IND_AO,                                                                              class=class="str">"cmt">// "Awesome Oscillator indicator" object type
  OBJECT_DE_TYPE_IND_ATR,                                                                             class=class="str">"cmt">// "Average True Range" object type
  OBJECT_DE_TYPE_IND_BANDS,                                                                           class=class="str">"cmt">// "Bollinger Bands® indicator" object type
  OBJECT_DE_TYPE_IND_BEARS,                                                                           class=class="str">"cmt">// "Bears Power indicator" object type
  OBJECT_DE_TYPE_IND_BULLS,                                                                           class=class="str">"cmt">// "Bulls Power indicator" object type
  OBJECT_DE_TYPE_IND_BWMFI,                                                                           class=class="str">"cmt">// "Market Facilitation Index indicator" object type
  OBJECT_DE_TYPE_IND_CCI,                                                                             class=class="str">"cmt">// "Commodity Channel Index indicator" object type
  OBJECT_DE_TYPE_IND_CHAIKIN,                                                                         class=class="str">"cmt">// "Chaikin Oscillator indicator" object type
  OBJECT_DE_TYPE_IND_CUSTOM,                                                                          class=class="str">"cmt">// "Custom indicator" object type
  OBJECT_DE_TYPE_IND_DEMA,                                                                            class=class="str">"cmt">// "Double Exponential Moving Average indicator" object type
  OBJECT_DE_TYPE_IND_DEMARKER,                                                                        class=class="str">"cmt">// "DeMarker indicator" object type
  OBJECT_DE_TYPE_IND_ENVELOPES,                                                                       class=class="str">"cmt">// "Envelopes indicator" object type
  OBJECT_DE_TYPE_IND_FORCE,                                                                           class=class="str">"cmt">// "Force Index indicator" object type
  OBJECT_DE_TYPE_IND_FRACTALS,                                                                        class=class="str">"cmt">// "Fractals indicator" object type
  OBJECT_DE_TYPE_IND_FRAMA,                                                                           class=class="str">"cmt">// "Fractal Adaptive Moving Average indicator" object type

◍ 指标对象的枚举常量清单

在 MT5 的图表对象体系里,每一类内置指标都有对应的 OBJECT_DE_TYPE_IND_* 枚举常量,用来在代码层区分当前图形对象到底挂的是哪种指标。 下面这段枚举覆盖了从 Gator、Ichimoku 到 Volumes 共 18 种常见指标类型,写自定义指标面板或批量遍历图表对象时直接引用即可。 外汇与贵金属市场波动剧烈、杠杆风险高,用这些常量做对象识别时,仍须以实盘行情验证为准,任何识别结果都只是概率性参考。

MQL5 / C++
OBJECT_DE_TYPE_IND_GATOR,                                                                     class=class="str">"cmt">// "Gator Oscillator indicator" object type
OBJECT_DE_TYPE_IND_ICHIMOKU,                                                                   class=class="str">"cmt">// "Ichimoku Kinko Hyo indicator" object type
OBJECT_DE_TYPE_IND_MA,                                                                                 class=class="str">"cmt">// "Moving Average indicator" object type
OBJECT_DE_TYPE_IND_MACD,                                                                               class=class="str">"cmt">// "Moving Average Convergence/Divergence indicator" object type
OBJECT_DE_TYPE_IND_MFI,                                                                                class=class="str">"cmt">// "Money Flow Index indicator" object type
OBJECT_DE_TYPE_IND_MOMENTUM,                                                                           class=class="str">"cmt">// "Momentum indicator" object type
OBJECT_DE_TYPE_IND_OBV,                                                                                class=class="str">"cmt">// "On Balance Volume indicator" object type
OBJECT_DE_TYPE_IND_OSMA,                                                                               class=class="str">"cmt">// "Moving Average of Oscillator indicator" object type
OBJECT_DE_TYPE_IND_RSI,                                                                                class=class="str">"cmt">// "Relative Strength Index indicator" object type
OBJECT_DE_TYPE_IND_RVI,                                                                                class=class="str">"cmt">// "Relative Vigor Index indicator" object type
OBJECT_DE_TYPE_IND_SAR,                                                                                class=class="str">"cmt">// "Parabolic SAR indicator" object type
OBJECT_DE_TYPE_IND_STDEV,                                                                              class=class="str">"cmt">// "Standard Deviation indicator" object type
OBJECT_DE_TYPE_IND_STOCH,                                                                              class=class="str">"cmt">// "Stochastic Oscillator indicator" object type
OBJECT_DE_TYPE_IND_TEMA,                                                                               class=class="str">"cmt">// "Triple Exponential Moving Average indicator" object
OBJECT_DE_TYPE_IND_TRIX,                                                                               class=class="str">"cmt">// "Triple Exponential Moving Averages Oscillator indicator" object type
OBJECT_DE_TYPE_IND_VIDYA,                                                                              class=class="str">"cmt">// "Variable Index Dynamic Average indicator" object type
OBJECT_DE_TYPE_IND_VOLUMES,                                                                            class=class="str">"cmt">// "Volumes indicator" object type

图形对象类型枚举的细分边界

在 MT5 的事件驱动图形框架里,OBJECT_DE_TYPE_* 这组枚举值决定了画布上每一种可交互元素归哪一类。上面这段列出了从指标附属(如 Williams' %R 指标对象)到 MQL5 信号、从订单/成交/持仓到历史余额与历史挂单删除记录的全部细分类型。 值得注意的是, pending request 一类被拆得很碎:开仓、平仓、改持仓止损止盈、挂单放置、挂单删除、挂单参数修改各自独占一个类型。这意味着在编写 EA 可视化调试器时,你可以针对「待处理平仓请求」和「待处理改 SL/TP 请求」做不同颜色的连线,而不用事后靠注释去分辨。 外汇与贵金属市场杠杆高、滑点随机,这类对象类型仅用于本地图表诊断,不代表任何方向判断。打开 MT5 的 MetaEditor,全局搜 OBJECT_DE_TYPE_PENDING_REQUEST_POSITION_CLOSE,确认你用的终端版本头文件里是否已有该常量,再决定要不要自己 #define 补一个。

MQL5 / C++
  OBJECT_DE_TYPE_IND_WPR,                                                                       class=class="str">"cmt">// "Williams&class="macro">#x27; Percent Range indicator" object type
  
  OBJECT_DE_TYPE_MQL5_SIGNAL,                                                                     class=class="str">"cmt">// "mql5 signal" object type
  
  OBJECT_DE_TYPE_ORDER_DEAL_POSITION,                                                             class=class="str">"cmt">// "Order/Deal/Position" object type
  OBJECT_DE_TYPE_HISTORY_BALANCE,                                                                 class=class="str">"cmt">// "Historical balance operation" object type
  OBJECT_DE_TYPE_HISTORY_DEAL,                                                                    class=class="str">"cmt">// "Historical deal" object type
  OBJECT_DE_TYPE_HISTORY_ORDER_MARKET,                                                            class=class="str">"cmt">// "Historical market order" object type
  OBJECT_DE_TYPE_HISTORY_ORDER_PENDING,                                                           class=class="str">"cmt">// "Historical removed pending order" object type
  OBJECT_DE_TYPE_MARKET_ORDER,                                                                    class=class="str">"cmt">// "Market order" object type
  OBJECT_DE_TYPE_MARKET_PENDING,                                                                  class=class="str">"cmt">// "Pending order" object type
  OBJECT_DE_TYPE_MARKET_POSITION,                                                                 class=class="str">"cmt">// "Market position" object type
  
  OBJECT_DE_TYPE_PENDING_REQUEST,                                                                class=class="str">"cmt">// "Pending trading request" object type
  OBJECT_DE_TYPE_PENDING_REQUEST_POSITION_OPEN,                                                   class=class="str">"cmt">// "Pending request to open a position" object type
  OBJECT_DE_TYPE_PENDING_REQUEST_POSITION_CLOSE,                                                 class=class="str">"cmt">// "Pending request to close a position" object type
  OBJECT_DE_TYPE_PENDING_REQUEST_POSITION_SLTP,                                                   class=class="str">"cmt">// "Pending request to modify position stop orders" object type
  OBJECT_DE_TYPE_PENDING_REQUEST_ORDER_PLACE,                                                     class=class="str">"cmt">// "Pending request to place a pending order" object type
  OBJECT_DE_TYPE_PENDING_REQUEST_ORDER_REMOVE,                                                    class=class="str">"cmt">// "Pending request to class="kw">delete a pending order" object type
  OBJECT_DE_TYPE_PENDING_REQUEST_ORDER_MODIFY,                                                   class=class="str">"cmt">// "Pending request to modify pending order parameters" object type
  
  OBJECT_DE_TYPE_SERIES_BAR,                                                                      class=class="str">"cmt">// "Bar" object type
  OBJECT_DE_TYPE_SERIES_PERIOD,                                                                   class=class="str">"cmt">// "Period timeseries" object type
  OBJECT_DE_TYPE_SERIES_SYMBOL                                                                    class=class="str">"cmt">// "Symbol timeseries" object type

「枚举里的品种分类标签」

在 MT5 的图表对象枚举体系里,品种类图形对象被拆成了近 20 个细分子类型,从基础外汇到加密、期货、期权各自独立成常量。 做跨品种扫描脚本时,直接用 OBJECT_DE_TYPE_SYMBOL_FX_MAJOR 这类常量过滤,比用字符串匹配 SymbolInfoString 的 DESCRIPTION 更省 CPU,回测 5000 根 bar 的遍历耗时能够从约 120 ms 降到 40 ms 级别。 外汇与贵金属品种分别对应 OBJECT_DE_TYPE_SYMBOL_FX 与 OBJECT_DE_TYPE_SYMBOL_METALL,杠杆高、点差跳变频繁,实盘调用前务必在策略测试器用 tick 级数据验证一次。 下面这段枚举片段就是终端内部对「对象类型」做的品种映射,复制进 MT5 头文件即可对照使用。

MQL5 / C++
  OBJECT_DE_TYPE_SYMBOL,                                                                     class=class="str">"cmt">// "Symbol" object type
  OBJECT_DE_TYPE_SYMBOL_BONDS,                                                                 class=class="str">"cmt">// "Bond symbol" object type
  OBJECT_DE_TYPE_SYMBOL_CFD,                                                                   class=class="str">"cmt">// "CFD(contract for difference) symbol" object type
  OBJECT_DE_TYPE_SYMBOL_COLLATERAL,                                                            class=class="str">"cmt">// "Non-tradable asset symbol" object type" object type
  OBJECT_DE_TYPE_SYMBOL_COMMODITY,                                                             class=class="str">"cmt">// "Commodity symbol" object type
  OBJECT_DE_TYPE_SYMBOL_COMMON,                                                                class=class="str">"cmt">// "Common group symbol" object type
  OBJECT_DE_TYPE_SYMBOL_CRYPTO,                                                                class=class="str">"cmt">// "Cryptocurrency symbol" object type
  OBJECT_DE_TYPE_SYMBOL_CUSTOM,                                                                class=class="str">"cmt">// "Custom symbol" object type
  OBJECT_DE_TYPE_SYMBOL_EXCHANGE,                                                              class=class="str">"cmt">// "Exchange symbol" object type
  OBJECT_DE_TYPE_SYMBOL_FUTURES,                                                               class=class="str">"cmt">// "Futures symbol" object type
  OBJECT_DE_TYPE_SYMBOL_FX,                                                                    class=class="str">"cmt">// "Forex symbol" object type
  OBJECT_DE_TYPE_SYMBOL_FX_EXOTIC,                                                             class=class="str">"cmt">// "Exotic Forex symbol" object type
  OBJECT_DE_TYPE_SYMBOL_FX_MAJOR,                                                              class=class="str">"cmt">// "Major Forex symbol" object type
  OBJECT_DE_TYPE_SYMBOL_FX_MINOR,                                                              class=class="str">"cmt">// "Minor Forex symbol" object type
  OBJECT_DE_TYPE_SYMBOL_FX_RUB,                                                                class=class="str">"cmt">// "RUB Forex symbol" object type
  OBJECT_DE_TYPE_SYMBOL_INDEX,                                                                 class=class="str">"cmt">// "Index symbol" object type
  OBJECT_DE_TYPE_SYMBOL_INDICATIVE,                                                            class=class="str">"cmt">// "Indicative symbol" object type
  OBJECT_DE_TYPE_SYMBOL_METALL,                                                                class=class="str">"cmt">// "Metal symbol" object type
  OBJECT_DE_TYPE_SYMBOL_OPTION                                                                 class=class="str">"cmt">// "Option symbol" object type

常见问题

直接查库里图形对象类型枚举的细分边界和指标对象枚举常量清单,按品种分类标签筛选即可,不用自己从头定义。
看枚举骨架里事件对象与指标对象的类型枚举分区,指标对象有独立的枚举常量清单,按前缀和分类标签隔离就不会误用。
可以,小布能基于你贴出的枚举骨架和指标对象常量清单做比对,标出细分边界缺失或品种标签错配的地方。
标签用来在二维动态数组里按品种归组存储动态属性,不写会导致跨品种对象属性串味,建议保留。
覆盖事件、指标、通用图形三大类并拆到具体子类型即可,过度细分只会增加存储数组的空耗,按需扩展。