DoEasy 函数库中的图形(第八十二部分):函数库对象重构和图形对象集合·进阶篇
(2/3)· 手工画的线也能被程序识别?本篇让函数库接管所有图表图形对象
◍ 图形对象的枚举偏移写法
在 MT5 自定义控件库里,标准图表对象被统一映射成一套内部枚举值,方便和自有面板元素区分。核心规律是:在基础控件标识 OBJECT_DE_TYPE_GELEMENT_CONTROL 之上再加 1,然后叠加上 MT5 原生对象常量(如 OBJ_GANNGRID、OBJ_FIBO),就得到该图形对应的扩展类型码。 下面这段定义覆盖了我们常用的江恩网格、斐波那契系列、艾略特波浪以及箭头标注等对象。比如 OBJECT_DE_TYPE_GSTD_FIBO 对应原生斐波那契水平位,OBJECT_DE_TYPE_GSTD_ELLIOTWAVE5 对应五浪结构,OBJECT_DE_TYPE_GSTD_ARROW_UP 对应向上箭头。 你直接在 MT5 的 MQH 头文件里搜 OBJECT_DE_TYPE_GELEMENT_CONTROL,把这套偏移定义抄进自己的 EA 面板工程,就能用统一 switch 分支处理用户从图表拖进来的各类对象。外汇与贵金属波动剧烈,这类对象映射只解决识别问题,不预示任何方向。
OBJECT_DE_TYPE_GSTD_GANNGRID = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_GANNGRID, class=class="str">"cmt">// "Gann grid" object type OBJECT_DE_TYPE_GSTD_FIBO = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_FIBO, class=class="str">"cmt">// "Fibo levels" object type OBJECT_DE_TYPE_GSTD_FIBOTIMES = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_FIBOTIMES, class=class="str">"cmt">// "Fibo time zones" object type OBJECT_DE_TYPE_GSTD_FIBOFAN = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_FIBOFAN, class=class="str">"cmt">// "Fibo fan" object type OBJECT_DE_TYPE_GSTD_FIBOARC = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_FIBOARC, class=class="str">"cmt">// "Fibo arcs" object type OBJECT_DE_TYPE_GSTD_FIBOCHANNEL = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_FIBOCHANNEL, class=class="str">"cmt">// "Fibo channel" object type OBJECT_DE_TYPE_GSTD_EXPANSION = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_EXPANSION, class=class="str">"cmt">// "Fibo expansion" object type OBJECT_DE_TYPE_GSTD_ELLIOTWAVE5 = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ELLIOTWAVE5, class=class="str">"cmt">// "Elliott class="num">5 waves" object type OBJECT_DE_TYPE_GSTD_ELLIOTWAVE3 = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ELLIOTWAVE3, class=class="str">"cmt">// "Elliott class="num">3 waves" object type OBJECT_DE_TYPE_GSTD_RECTANGLE = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_RECTANGLE, class=class="str">"cmt">// "Rectangle" object type OBJECT_DE_TYPE_GSTD_TRIANGLE = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_TRIANGLE, class=class="str">"cmt">// "Triangle" object type OBJECT_DE_TYPE_GSTD_ELLIPSE = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ELLIPSE, class=class="str">"cmt">// "Ellipse" object type OBJECT_DE_TYPE_GSTD_ARROW_THUMB_UP = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_THUMB_UP, class=class="str">"cmt">// "Thumb up" object type OBJECT_DE_TYPE_GSTD_ARROW_THUMB_DOWN = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_THUMB_DOWN, class=class="str">"cmt">// "Thumb down" object type OBJECT_DE_TYPE_GSTD_ARROW_UP = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_UP, class=class="str">"cmt">// "Arrow up" object type OBJECT_DE_TYPE_GSTD_ARROW_DOWN = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_DOWN, class=class="str">"cmt">// "Arrow down" object type OBJECT_DE_TYPE_GSTD_ARROW_STOP = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_STOP, class=class="str">"cmt">// "Stop sign" object type OBJECT_DE_TYPE_GSTD_ARROW_CHECK = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_CHECK, class=class="str">"cmt">// "Check mark" object type OBJECT_DE_TYPE_GSTD_ARROW_LEFT_PRICE = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_LEFT_PRICE, class=class="str">"cmt">// "Left price label" object type
图形控件与库对象的类型枚举衔接
在自定义图形库里,所有标准控件类型都挂在 OBJECT_DE_TYPE_GELEMENT_CONTROL 之上,用 +1 再叠加具体 OBJ_* 宏来定义。例如右侧价格标签是 CONTROL+1+OBJ_ARROW_RIGHT_PRICE,买入信号箭头是 CONTROL+1+OBJ_ARROW_BUY,卖出信号则是 CONTROL+1+OBJ_ARROW_SELL,依次类推覆盖文本、标签、按钮、图表、位图、编辑框、财经日历事件等 14 种基础图形元素。 这些 GSTD 前缀类型只是“控件层”映射,真正库对象的基类从 OBJECT_DE_TYPE_GSTD_RECTANGLE_LABEL+1 开始:OBJECT_DE_TYPE_BASE 作为所有库对象的基类型,其后再派生 OBJECT_DE_TYPE_BASE_EXT 扩展基类型,以及 OBJECT_DE_TYPE_ACCOUNT(账户对象)、OBJECT_DE_TYPE_BOOK_ORDER(订单簿对象)等。 开 MT5 在 Include 里搜 OBJECT_DE_TYPE_GELEMENT_CONTROL,把这段枚举贴进自有面板工程,就能直接复用标准控件 ID,不必从头定义箭头和标签类型。外汇与贵金属图表上叠加这类自定义对象时波动剧烈,实盘前请在策略测试器跑通事件响应逻辑。
OBJECT_DE_TYPE_GSTD_ARROW_RIGHT_PRICE = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_RIGHT_PRICE, class=class="str">"cmt">// "Right price label" object type OBJECT_DE_TYPE_GSTD_ARROW_BUY = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_BUY, class=class="str">"cmt">// "Buy sign" object type OBJECT_DE_TYPE_GSTD_ARROW_SELL = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW_SELL, class=class="str">"cmt">// "Sell sign" object type OBJECT_DE_TYPE_GSTD_ARROW = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_ARROW, class=class="str">"cmt">// "Arrow" object type OBJECT_DE_TYPE_GSTD_TEXT = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_TEXT, class=class="str">"cmt">// "Text" object type OBJECT_DE_TYPE_GSTD_LABEL = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_LABEL, class=class="str">"cmt">// "Text label" object type OBJECT_DE_TYPE_GSTD_BUTTON = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_BUTTON, class=class="str">"cmt">// "Button" object type OBJECT_DE_TYPE_GSTD_CHART = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_CHART, class=class="str">"cmt">// "Chart" object type OBJECT_DE_TYPE_GSTD_BITMAP = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_BITMAP, class=class="str">"cmt">// "Bitmap" object type OBJECT_DE_TYPE_GSTD_BITMAP_LABEL = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_BITMAP_LABEL, class=class="str">"cmt">// "Bitmap label" object type OBJECT_DE_TYPE_GSTD_EDIT = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_EDIT, class=class="str">"cmt">// "Input field" object type OBJECT_DE_TYPE_GSTD_EVENT = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_EVENT, class=class="str">"cmt">// "Event object which corresponds to an event in Economic Calendar" object type OBJECT_DE_TYPE_GSTD_RECTANGLE_LABEL = OBJECT_DE_TYPE_GELEMENT_CONTROL+class="num">1+OBJ_RECTANGLE_LABEL, class=class="str">"cmt">// "Rectangle Label object used to create and design the custom graphical interface" object type class=class="str">"cmt">//--- Objects OBJECT_DE_TYPE_BASE = OBJECT_DE_TYPE_GSTD_RECTANGLE_LABEL+class="num">1, class=class="str">"cmt">// Base object for all library objects 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
「深度事件对象类型的枚举划分」
在 MT5 的深层事件(Depth of Events)体系里,对象类型用一组枚举常量做精确区分,方便脚本按类别过滤和响应。上面这段声明把挂单簿、图表、账户事件、指标缓冲区四类对象拆成了独立标识符。 OBJECT_DE_TYPE_BOOK_BUY 到 OBJECT_DE_TYPE_BOOK_SERIES 覆盖限价买卖单、市价买卖单、簿快照及快照序列;OBJECT_DE_TYPE_CHART 系列指向主图、子窗口及其上的指标实例。 事件类里,OBJECT_DE_TYPE_EVENT_BALANCE 对应入金出金等余额变动,OBJECT_DE_TYPE_EVENT_ORDER_PLASED(原文拼写如此,实为 placed)与 REMOVED 分别捕捉挂单的放置与撤销,POSITION_OPEN / CLOSE 则标记持仓的开平。 指标侧有三类缓冲:IND_BUFFER 通用数值、IND_BUFFER_ARROW 箭头绘制、IND_BUFFER_BAR 柱形绘制。开 MT5 在 MetaEditor 搜 OBJECT_DE_TYPE 可核对全部 20 余个常量,改 EA 时按类型过滤事件能少写大量判断分支。外汇与贵金属杠杆品种波动剧烈,这类对象监听仅作技术辅助,实盘仍属高风险。
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 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
◍ 指标对象枚举里的缓冲与具体指标类型
在 MT5 的图形对象枚举体系里,有一批以 OBJECT_DE_TYPE_IND_BUFFER_ 开头的常量,专门描述指标内部缓冲区的绘制形态。比如 _CALCULATE 对应「计算缓冲」、_CANDLE 对应「K线缓冲」、_FILLING 对应「填充缓冲」、_HISTOGRAMM 与 _HISTOGRAMM2 分别对应单/双直方图缓冲、_LINE 是线形缓冲、_SECTION 是分段缓冲、_ZIGZAG 是之字缓冲。 另一批 OBJECT_DE_TYPE_IND_ 开头的常量则直接指向具体指标对象:_AC 是加速震荡器、_AD 是聚散指标、_ADX 与 _ADXW 分别是标准 ADX 与 Wilder 平滑版 ADX、_ALLIGATOR 是鳄鱼线、_AMA 是自适应均线、_AO 是动量震荡器、_ATR 是平均真实波幅。 写 EA 或脚本做图表对象遍历时,用这些枚举做类型判断比硬编码字符串稳妥,MT5 终端里按 F4 打开 MetaEditor 搜 OBJECT_DE_TYPE_IND 就能看到完整列表,目前缓冲类至少有 9 种、具体指标类仅上面已列就有 11 种。
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 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
指标对象枚举的底层命名映射
在 MT5 的图表对象体系里,每一类内置指标都对应一个 OBJECT_DE_TYPE_IND_* 的枚举常量,用于图形资源销毁或遍历时精准识别对象类型。
上面这段声明覆盖了从布林带、熊力/牛力,到 CCI、Chaikin、自定义指标、DEMA、DeMarker、包络线、力指数、分形、FRAMA、Gator、一目均衡以及最基础的 MA 与 MACD,共 19 种指标对象类型。
如果你在 EA 里用 ChartGetInteger 配合 OBJPROP_TYPE 扫图,拿到的值落在这段枚举区间时,就可以直接 switch 分流处理,而不用靠对象名称字符串去猜。
外汇与贵金属品种波动剧烈,用这类枚举做对象清理前务必确认周期与品种上下文,误删指标可能导致策略信号断层。
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 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 常量把 MQL5 图形对象里剩余的指标类别和账户类对象都列全了,从 MFI 到 WPR 一共 14 个指标类型,外加信号、订单/成交/持仓、历史余额三种非指标对象。 在写拖拽式分析面板时,若要根据用户丢进图表的对象自动识别类型,直接拿这些枚举做 switch 判断即可,比用字符串比对省事且不易拼错。 外汇与贵金属杠杆高、滑点随机,这类对象识别逻辑只解决'是什么',不预示任何方向;真要拿去触发下单,先在 MT5 策略测试器里用历史数据跑一遍类型映射是否漏判。
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 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