DoEasy 库中的其他类(第六十七部分):图表对象类·进阶篇
📊

DoEasy 库中的其他类(第六十七部分):图表对象类·进阶篇

(2/3)· 当信号索引频繁漂移、图表参数散落各处,手写管控逻辑只会越改越乱

含代码示例 第 2/3 篇
很多人在 MT5 里直接读图表属性做管控,却没意识到信号索引会随数据库变动而失效。把参数写死在构造函数里,下次更新就漏了提供者账户的实时变化。用对象封装属性集合,才是能长期维护的写法。

◍ 图表对象属性枚举的本地化映射

在 MT5 的图表对象封装里,一组 MSG_CHART_OBJ_* 枚举专门负责把底层图表状态映射成界面可读的字符串。下面这段声明覆盖了从图表类型、前景切换,到坐标轴偏移、自动滚动等二十余项属性。 实际写 EA 或指标时,若用 Custom Indicators 或 ChartGetString() 取这些属性,返回的就是对应枚举的本地化文案。比如 MSG_CHART_OBJ_SHOW_BID_LINE 对应「在图表上以水平线显示 Bid 价」,MSG_CHART_OBJ_SCALEFIX_11 则是「1:1 比例」——直接决定你在右上角看到的刻度形态。 外汇与贵金属波动剧烈,图表缩放与偏移参数(如 MSG_CHART_OBJ_SHIFT 的右边界偏移)设错,可能让关键 K 线被推出可视区,错过入场信号。开 MT5 按 F4 进 MetaEditor,搜 MSG_CHART_OBJ 前缀即可核对完整列表。

MQL5 / C++
  MSG_CHART_OBJ_MODE,                                                    class=class="str">"cmt">// Chart type
  MSG_CHART_OBJ_FOREGROUND,                                              class=class="str">"cmt">// Price chart in the foreground
  MSG_CHART_OBJ_SHIFT,                                                   class=class="str">"cmt">// Shift of the price chart from the right border
  MSG_CHART_OBJ_AUTOSCROLL,                                              class=class="str">"cmt">// Auto scroll to the right border of the chart
  MSG_CHART_OBJ_KEYBOARD_CONTROL,                                        class=class="str">"cmt">// Manage the chart using a keyboard
  MSG_CHART_OBJ_QUICK_NAVIGATION,                                        class=class="str">"cmt">// Allow the chart to intercept Space and Enter key strokes to activate the quick navigation bar
  MSG_CHART_OBJ_SCALE,                                                   class=class="str">"cmt">// Scale
  MSG_CHART_OBJ_SCALEFIX,                                                class=class="str">"cmt">// Fixed scale
  MSG_CHART_OBJ_SCALEFIX_11,                                             class=class="str">"cmt">// Scale class="num">1:class="num">1
  MSG_CHART_OBJ_SCALE_PT_PER_BAR,                                        class=class="str">"cmt">// Scale in points per bar
  MSG_CHART_OBJ_SHOW_TICKER,                                             class=class="str">"cmt">// Display a symbol ticker in the upper left corner
  MSG_CHART_OBJ_SHOW_OHLC,                                               class=class="str">"cmt">// Display OHLC values in the upper left corner
  MSG_CHART_OBJ_SHOW_BID_LINE,                                           class=class="str">"cmt">// Display Bid value as a horizontal line on the chart
  MSG_CHART_OBJ_SHOW_ASK_LINE,                                           class=class="str">"cmt">// Display Ask value as a horizontal line on a chart
  MSG_CHART_OBJ_SHOW_LAST_LINE,                                          class=class="str">"cmt">// Display Last value as a horizontal line on a chart
  MSG_CHART_OBJ_SHOW_PERIOD_SEP,                                         class=class="str">"cmt">// Display vertical separators between adjacent periods
  MSG_CHART_OBJ_SHOW_GRID,                                               class=class="str">"cmt">// Display a grid on the chart
  MSG_CHART_OBJ_SHOW_VOLUMES,                                            class=class="str">"cmt">// Display volumes on a chart
  MSG_CHART_OBJ_SHOW_OBJECT_DESCR,                                       class=class="str">"cmt">// Display text descriptions of objects
  MSG_CHART_OBJ_VISIBLE_BARS,                                            class=class="str">"cmt">// Number of bars on a chart that are available for display
  MSG_CHART_OBJ_WINDOWS_TOTAL,                                           class=class="str">"cmt">// Total number of chart windows including indicator subwindows
  MSG_CHART_OBJ_WINDOW_IS_VISIBLE,                                       class=class="str">"cmt">// Subwindow visibility
  MSG_CHART_OBJ_WINDOW_HANDLE                                            class=class="str">"cmt">// Chart window handle

「图表子窗口与配色属性的枚举映射」

在 MT5 的图表对象消息体系里,有一批枚举常量专门描述子窗口几何与视觉属性,写自定义指标或面板时直接引用可避免硬编码。 比如 MSG_CHART_OBJ_WINDOW_YDISTANCE 给出指标子窗口上边框到主图窗口上边框的 Y 轴像素距离,MSG_CHART_OBJ_FIRST_VISIBLE_BAR 返回当前可视区域最左侧的 bar 序号,这两个值在做多窗体联动绘图时很关键。 配色类常量覆盖背景、前景、网格、成交量、阴阳线实体与影线、Bid/Ask/Last 线以及止损止盈线,共 14 个颜色项;另有 MSG_CHART_OBJ_SHOW_TRADE_LEVELS、MSG_CHART_OBJ_DRAG_TRADE_LEVELS 等控制交易价位显示与鼠标拖拽。 开 MT5 按 F4 进 MetaEditor,搜这些 MSG_CHART_OBJ_* 宏,能直接看到终端内部对各属性的定义,验证你脚本读到的图表状态是否和枚举一致。

MQL5 / C++
MSG_CHART_OBJ_WINDOW_YDISTANCE,                                                                       class=class="str">"cmt">// Distance in Y axis pixels between the upper frame of the indicator subwindow and the upper frame of the chart main window
MSG_CHART_OBJ_FIRST_VISIBLE_BAR,                                                                          class=class="str">"cmt">// Number of the first visible bar on the chart
MSG_CHART_OBJ_WIDTH_IN_BARS,                                                                              class=class="str">"cmt">// Width of the chart in bars
MSG_CHART_OBJ_WIDTH_IN_PIXELS,                                                                            class=class="str">"cmt">// Width of the chart in pixels
MSG_CHART_OBJ_HEIGHT_IN_PIXELS,                                                                           class=class="str">"cmt">// Height of the chart in pixels
MSG_CHART_OBJ_COLOR_BACKGROUND,                                                                           class=class="str">"cmt">// Color of background of the chart
MSG_CHART_OBJ_COLOR_FOREGROUND,                                                                           class=class="str">"cmt">// Color of axes, scale and OHLC line
MSG_CHART_OBJ_COLOR_GRID,                                                                                 class=class="str">"cmt">// Grid class="type">class="kw">color
MSG_CHART_OBJ_COLOR_VOLUME,                                                                               class=class="str">"cmt">// Color of volumes and position opening levels
MSG_CHART_OBJ_COLOR_CHART_UP,                                                                             class=class="str">"cmt">// Color for the up bar, shadows and body borders of bull candlesticks
MSG_CHART_OBJ_COLOR_CHART_DOWN,                                                                           class=class="str">"cmt">// Color of down bar, its shadow and border of body of the bullish candlestick
MSG_CHART_OBJ_COLOR_CHART_LINE,                                                                           class=class="str">"cmt">// Color of the chart line and the Doji candlesticks
MSG_CHART_OBJ_COLOR_CANDLE_BULL,                                                                          class=class="str">"cmt">// Color of body of a bullish candlestick
MSG_CHART_OBJ_COLOR_CANDLE_BEAR,                                                                          class=class="str">"cmt">// Color of body of a bearish candlestick
MSG_CHART_OBJ_COLOR_BID,                                                                                  class=class="str">"cmt">// Color of the Bid price line
MSG_CHART_OBJ_COLOR_ASK,                                                                                  class=class="str">"cmt">// Color of the Ask price line
MSG_CHART_OBJ_COLOR_LAST,                                                                                 class=class="str">"cmt">// Color of the last performed deal&class="macro">#x27;s price line(Last)
MSG_CHART_OBJ_COLOR_STOP_LEVEL,                                                                           class=class="str">"cmt">// Color of stop order levels(Stop Loss and Take Profit)
MSG_CHART_OBJ_SHOW_TRADE_LEVELS,                                                                          class=class="str">"cmt">// Display trade levels on the chart(levels of open positions, Stop Loss, Take Profit and pending orders)
MSG_CHART_OBJ_DRAG_TRADE_LEVELS,                                                                          class=class="str">"cmt">// Drag trading levels on a chart using a mouse
MSG_CHART_OBJ_SHOW_DATE_SCALE,                                                                            class=class="str">"cmt">// Display the time scale on a chart
MSG_CHART_OBJ_SHOW_PRICE_SCALE,                                                                           class=class="str">"cmt">// Display a price scale on a chart
MSG_CHART_OBJ_SHOW_ONE_CLICK,                                                                             class=class="str">"cmt">// Display the quick trading panel on the chart
MSG_CHART_OBJ_IS_MAXIMIZED                                                                                class=class="str">"cmt">// Chart window maximized

图表对象枚举里的窗口与显示属性

在 MQL5 的图表对象封装里,有一组枚举常量专门描述图表窗口状态与可视化参数,写 EA 或脚本时若想读取/设置这些属性,得先认全它们。 比如 MSG_CHART_OBJ_IS_MINIMIZED 表示图表窗口被最小化,MSG_CHART_OBJ_IS_DOCKED 表示窗口处于停靠状态;对于脱离主框架的浮动窗口,还有 MSG_CHART_OBJ_FLOAT_LEFT / TOP / RIGHT / BOTTOM 四个常量,分别对应相对于虚拟屏幕的左、上、右、下坐标。 缩放与固定显示方面,MSG_CHART_OBJ_SHIFT_SIZE 是零号 K 线距右边界的偏移百分比,MSG_CHART_OBJ_FIXED_POSITION 是从左边界算起的固定位置百分比,MSG_CHART_OBJ_POINTS_PER_BAR 控制每根 K 线的点数比例尺。 品种报价区间由 MSG_CHART_OBJ_PRICE_MIN / PRICE_MAX 给出,而 MSG_CHART_OBJ_FIXED_MIN / FIXED_MAX 则是用户锁定的上下限;想拿图注释或挂的 EA / 脚本名,分别对应 MSG_CHART_OBJ_COMMENT、MSG_CHART_OBJ_EXPERT_NAME、MSG_CHART_OBJ_SCRIPT_NAME。 K 线样式三选一:MSG_CHART_OBJ_CHART_BARS(柱状)、CHART_CANDLES(蜡烛)、CHART_LINE(收盘价连线);成交量区则有 HIDE / TICK / REAL 三种枚举值切换是否显示及显示哪类量。 这些常量通常收在一个枚举尾部,以 MSG_CHART_OBJ_CHART_WINDOW 收口表示图表窗口自身,之后紧接 CChartObj 类的注释段,开 MT5 翻一下标准库的 ChartObj 定义就能逐条核对。

MQL5 / C++
  MSG_CHART_OBJ_IS_MINIMIZED,                                                    class=class="str">"cmt">// Chart window minimized
  MSG_CHART_OBJ_IS_DOCKED,                                                        class=class="str">"cmt">// Chart window docked
  MSG_CHART_OBJ_FLOAT_LEFT,                                                       class=class="str">"cmt">// Left coordinate of the undocked chart window relative to the class="kw">virtual screen
  MSG_CHART_OBJ_FLOAT_TOP,                                                        class=class="str">"cmt">// Upper coordinate of the undocked chart window relative to the class="kw">virtual screen
  MSG_CHART_OBJ_FLOAT_RIGHT,                                                      class=class="str">"cmt">// Right coordinate of the undocked chart window relative to the class="kw">virtual screen
  MSG_CHART_OBJ_FLOAT_BOTTOM,                                                     class=class="str">"cmt">// Bottom coordinate of the undocked chart window relative to the class="kw">virtual screen
  MSG_CHART_OBJ_SHIFT_SIZE,                                                       class=class="str">"cmt">// Shift size of the zero bar from the right border in %
  MSG_CHART_OBJ_FIXED_POSITION,                                                   class=class="str">"cmt">// Chart fixed position from the left border in %  
  MSG_CHART_OBJ_FIXED_MAX,                                                        class=class="str">"cmt">// Chart fixed maximum
  MSG_CHART_OBJ_FIXED_MIN,                                                        class=class="str">"cmt">// Chart fixed minimum
  MSG_CHART_OBJ_POINTS_PER_BAR,                                                   class=class="str">"cmt">// Scale in points per bar
  MSG_CHART_OBJ_PRICE_MIN,                                                        class=class="str">"cmt">// Chart minimum
  MSG_CHART_OBJ_PRICE_MAX,                                                        class=class="str">"cmt">// Chart maximum
  MSG_CHART_OBJ_COMMENT,                                                          class=class="str">"cmt">// Chart comment text
  MSG_CHART_OBJ_EXPERT_NAME,                                                      class=class="str">"cmt">// Name of an EA launched on the chart
  MSG_CHART_OBJ_SCRIPT_NAME,                                                      class=class="str">"cmt">// Name of a script launched on the chart
  MSG_CHART_OBJ_CHART_BARS,                                                       class=class="str">"cmt">// Display as bars
  MSG_CHART_OBJ_CHART_CANDLES,                                                    class=class="str">"cmt">// Display as Japaneses candlesticks
  MSG_CHART_OBJ_CHART_LINE,                                                       class=class="str">"cmt">// Display as a line drawn at Close prices
  MSG_CHART_OBJ_CHART_VOLUME_HIDE,                                                class=class="str">"cmt">// Volumes not displayed
  MSG_CHART_OBJ_CHART_VOLUME_TICK,                                                class=class="str">"cmt">// Tick volumes
  MSG_CHART_OBJ_CHART_VOLUME_REAL,                                                class=class="str">"cmt">// Trading volumes

  MSG_CHART_OBJ_CHART_WINDOW,                                                     class=class="str">"cmt">// Chart window

  };

◍ 图表属性枚举里的俄英对照清单

在 MQL5 里调图表属性时,有一批 ENUM_CHART_PROPERTY_STRING / INTEGER 类常量,官方文档用俄英双语列了出来,实际写 EA 或脚本时对照看能少踩坑。 下面这 38 组是原文直接给出的属性标识与英文描述映射,覆盖图表 ID、鼠标交互、缩放模式、OHLC 显示、Bid/Ask/Last 横线、网格与成交量等维度。 比如「Масштаб 1:1」对应 Scale 1:1 mode,意味着每根 bar 占用的像素高度与点数成固定 1:1 关系;「Отступ ценового графика от правого края」则是价格图右边缘留白像素,实盘里调这个能控制最新 K 线不贴边。 外汇与贵金属波动剧烈,图表属性改错可能让信号延迟显示,开 MT5 用 ChartGetInteger/ChartSetInteger 逐个验证这些常量更稳妥。

MQL5 / C++
{"Идентификатор графика","Chart ID"},
{"Отрисовка атрибутов ценового графика","Drawing attributes of a price chart"},
{"Объект \"График\"","Object \"Chart\""},
{"График поверх всех других","Chart on top of other charts"},
{"Доступ к контекстному меню по нажатию правой клавиши мыши","Accessing the context menu by pressing the right mouse button"},
{"Доступ к инструменту \"Перекрестие\" по нажатию средней клавиши мыши","Accessing the \"Crosshair tool\" by pressing the middle mouse button"},
{"Прокрутка графика левой кнопкой мышки по горизонтали","Scrolling the chart horizontally using the left mouse button"},
{"Отправка всем mql5-программам на графике сообщений о событиях колёсика мыши","Sending messages about mouse wheel events to all mql5 programs on a chart"},
{"Отправка всем mql5-программам на графике сообщений о событиях перемещения и нажатия кнопок мыши","Send notifications of mouse move and mouse click events to all mql5 programs on a chart"},
{"Отправка всем mql5-программам на графике сообщений о событии создания графического объекта","Send a notification of an event of new object creation to all mql5-programs on a chart"},
{"Отправка всем mql5-программам на графике сообщений о событии уничтожения графического объекта","Send a notification of an event of object deletion to all mql5-programs on a chart"},
{"Тип графика","Chart type"},
{"Ценовой график на переднем плане","Price chart in the foreground"},
{"Отступ ценового графика от правого края","Price chart indent from the right border"},
{"Автоматический переход к правому краю графика","Automatic moving to the right border of the chart"},
{"Управление графиком с помощью клавиатуры","Managing the chart using a keyboard"},
{"Перехват графиком нажатий клавиш Space и Enter для активации строки быстрой навигации","Allowed to intercept Space and Enter key presses on the chart to activate the quick navigation bar"},
{"Масштаб","Scale"},
{"Фиксированный масштаб","Fixed scale mode"},
{"Масштаб class="num">1:class="num">1","Scale class="num">1:class="num">1 mode"},
{"Масштаб в пунктах на бар","Scale to be specified in points per bar"},
{"Отображение в левом верхнем углу тикера символа","Display a symbol ticker in the upper left corner"},
{"Отображение в левом верхнем углу значений OHLC","Display OHLC values in the upper left corner"},
{"Отображение значения Bid горизонтальной линией на графике","Display Bid values as a horizontal line in a chart"},
{"Отображение значения Ask горизонтальной линией на графике","Display Ask values as a horizontal line in a chart"},
{"Отображение значения Last горизонтальной линией на графике","Display Last values as a horizontal line in a chart"},
{"Отображение вертикальных разделителей между соседними периодами","Display vertical separators between adjacent periods"},
{"Отображение сетки на графике","Display grid in the chart"},
{"Отображение объемов на графике","Display volume in the chart"},
{"Отображение текстовых описаний объектов","Display textual descriptions of objects"},
{"Количество баров на графике, доступных для отображения","The number of bars on the chart that can be displayed"},
{"Общее количество окон графика с подокнами индикаторов","The total number of chart windows, including indicator subwindows"},
{"Видимость подокон","Visibility of subwindows"},
{"Хэндл окна графика","Chart window handle"},
{"Дистанция в пикселях по оси Y между верхней рамкой подокна индикатора и верхней рамкой главного окна графика","The distance between the upper frame of the indicator subwindow and the upper frame of the main chart window"}

「扒开图表属性枚举的俄语外壳」

上面这一长串俄英对照,本质是一组图表属性描述符的枚举清单,常见于 MT5 里批量读取或设置图表状态的接口。俄文在前、英文在后,实际调用时引擎只认对应的属性 ID,文本只是给人看的标签。 清单里覆盖了从可视范围到配色再到窗口布局的维度:首根可见 K 线序号、图表像素宽高、背景与坐标轴色、涨跌蜡烛本体及影线色、Bid/Ask/Last 线色、止损止盈位色,以及是否显示时间轴、价格轴、一键交易面板等开关项。 还有几个容易被忽略的坐标类字段——脱离停靠后的图表窗口相对虚拟屏幕的左/上/右/下坐标,以及零号 K 线距右边界的百分比缩进。做多屏监控或自动截图时,这些数值直接决定你抓到的图是不是歪的。 固定最大值、固定最小值、每 K 线点数刻度这几项,则是手动锁定量程的关键。回测可视化里若想让不同品种刻度一致,就得先读这几个属性再统一写回,否则黄金和欧美叠图会比例失调。

图表模式与成交量的枚举映射

MT5 里图表外观不是靠字符串硬写的,而是用 ENUM_CHART_MODE 和 ENUM_CHART_VOLUME_MODE 两套枚举去驱动。上面这段代码把 CHART_BARS、CHART_CANDLES、CHART_VOLUME_TICK 等常量映射到多语言描述文本,方便面板直接显示「日本蜡烛 / 分时线 / tick 成交量」这类标签。 ChartModeDescription() 用三元表达式按 mode 返回值:命中 CHART_BARS 给柱状描述,命中 CHART_CANDLES 给蜡烛描述,其余兜底成收盘价连线。ChartModeVolumeDescription() 同理,把 CHART_VOLUME_TICK、CHART_VOLUME_REAL 分别映射到 tick 量与真实交易量,默认隐藏成交量。 ENUM_CHART_PROP_INTEGER 里从 CHART_PROP_ID=0 开始排,紧接 TIMEFRAME、SHOW、IS_OBJECT,说明图表整数属性在底层是连续索引。你在写自定义指标或 AIGC 盯盘脚本时,直接读这些枚举比解析图表标题稳定得多,外汇与贵金属波动剧烈、高风险,用枚举判定状态能少踩坑。

MQL5 / C++
class="type">class="kw">string ChartModeDescription(ENUM_CHART_MODE mode)
  {
   class="kw">return
     (
       mode==CHART_BARS     ? CMessage::Text(MSG_CHART_OBJ_CHART_BARS)     :
       mode==CHART_CANDLES  ? CMessage::Text(MSG_CHART_OBJ_CHART_CANDLES) :
       CMessage::Text(MSG_CHART_OBJ_CHART_LINE)
     );
  }
class="type">class="kw">string ChartModeVolumeDescription(ENUM_CHART_VOLUME_MODE mode)
  {
   class="kw">return
     (
       mode==CHART_VOLUME_TICK ? CMessage::Text(MSG_CHART_OBJ_CHART_VOLUME_TICK) :
       mode==CHART_VOLUME_REAL ? CMessage::Text(MSG_CHART_OBJ_CHART_VOLUME_REAL) :
       CMessage::Text(MSG_CHART_OBJ_CHART_VOLUME_HIDE)
     );
  }
enum ENUM_CHART_PROP_INTEGER
  {
   CHART_PROP_ID = class="num">0,                 class=class="str">"cmt">// Chart ID
   CHART_PROP_TIMEFRAME,              class=class="str">"cmt">// Chart timeframe
   CHART_PROP_SHOW,                   class=class="str">"cmt">// Price chart drawing
   CHART_PROP_IS_OBJECT,              class=class="str">"cmt">// Chart object identification attribute
  }
把图表诊断交给小布盯盘
这些图表与信号属性的变动诊断,小布盯盘的 AIGC 已内置,打开对应品种页即可看到实时状态和异常提示,你只需在策略层做决策。

常见问题

信号数据库中的索引会随上下线变动,存索引不可靠,应按信号 ID 反查当前索引再操作。
后续细化时参数集合会增减,若一开始写死结构,扩展时要改多处,倾向用可演进的属性容器。
小布盯盘内置的 AIGC 诊断覆盖常见图表与信号属性变动,不必自己接库也能看盘口异常,专注决策即可。
它允许对已有信号对象按 ID 重选并刷新属性,避免重建对象,适配提供者账户交易导致的属性变化。
创建全量列表后,更新时只加新信号并刷新旧信号属性,不覆盖原对象,概率上更稳。