DoEasy 库中的其他类(第六十七部分):图表对象类·进阶篇
(2/3)· 当信号索引频繁漂移、图表参数散落各处,手写管控逻辑只会越改越乱
◍ 图表对象属性枚举的本地化映射
在 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 前缀即可核对完整列表。
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_* 宏,能直接看到终端内部对各属性的定义,验证你脚本读到的图表状态是否和枚举一致。
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 定义就能逐条核对。
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 逐个验证这些常量更稳妥。
{"Идентификатор графика","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 盯盘脚本时,直接读这些枚举比解析图表标题稳定得多,外汇与贵金属波动剧烈、高风险,用枚举判定状态能少踩坑。
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 }