MеtaTrader5 图表上的水平示意图(基础篇)
📘

MеtaTrader5 图表上的水平示意图(基础篇)

第 1/3 篇

MT5 图表上的水平线是怎么画出来的

在 MetaTrader 5 客户端里,水平示意图(horizontal level / 水平参考线)是最基础但最容易被忽略的视觉锚点。它不参与指标计算,只是把某个价格坐标在图表视窗里横向拉通,用来标记前高、前低、整数关口或挂单位置。 官方示例库里有一则 2019 年 3 月 4 日发布的水平示意图案例,累计被查看 3206 次、评论 45 条,说明即便这么底层的画法,实战交易者也会反复翻出来对照。 真正用的时候,别只靠鼠标拖。用 MQL5 的 OBJ_HLINE 对象类型可以让水平线随品种切换自动重绘,避免手动线在换周期后漂移到错误价位。外汇与贵金属波动剧烈,这类静态参考线仅作概率参考,不构成方向判定。

◍ 水平示意图到底解决什么

在 MT5 图表上,水平示意图不算常客,但写指标时躲不开:比如画某周期的量价分布、做各类市场深度视图,甚至一些定制指标的数值分布。它们的共性很硬——必须能建、能放、能缩放、能拖、能删。 实战里大多数有用的示意图都是柱状线横排。拿终端自带的逐笔成交量按天分布指标看,开发者要干三件事:批量建图形对象并给每个起唯一名字、按需要缩放移动、指标退出时清干净。 更复杂的情况是一个图里叠三套同位置示意图,例如「卖出逐笔报价量 / 买入逐笔报价量 / 总计逐笔报价量」各一套。你可能会想:非得管这么多图元吗?确实有更省事的数据显示法,但就本文开头那整组需求(建放缩移删 + 多图并存)而言,水平示意图仍是最直白的落点。外汇与贵金属市场波动剧烈、杠杆高风险大,任何图表方案只辅助判断、不预示方向。

「把示意图钉死在坐标上」

水平示意图本质是一组图形基元,时间轴和价格轴各自需要绑定规则。时间绑定常见三种:锚定某个周期起点(如日线开盘)、锚定可视窗口左缘(示意图起点已滑出屏幕)、锚定终端右缘(避免主图区对象过多)。无论哪种,构成示意图的一个时间坐标固定不变,另一个按“列水平长度”推算。 价格绑定比时间简单。若把价格段当 100%、步幅 10%,会得到数量恒定的水平柱线,但舍入误差偏大。本文改用更细的动态区间:以检查周期的 最低价~最高价 为边界,第 i 个价格位 = 示意图起始价 + i * 步幅间距,因此不必预存价格数组。 对象管理上,同色同风格的示意图应合并为一个数组并配一个管理器;即便只有一张图,也强制独立管理。前文示例里前两张图可并成至少三个示意图共用一个管理器,第三张图三个方向不同的图则拆成三个数组、三个管理器。 任务分两层:第一层取源数据(如逐笔报价成交量)因品种差异大不宜封装;第二层“管理器—数组”结构几乎通用,适合做成库文件复用。示意图本体只用水平线段或矩形两种基元。 外汇与贵金属波动剧烈,坐标绑定参数若脱离真实高低点区间,示意图会严重失真,请在 MT5 用历史数据验证步幅设置。

MQL5 / C++
第 i 个价格绑定 = 示意图喀什价格间隔 + i * 步幅间距。

枚举与输入参数怎么定

直方图定位、外观和方向都靠枚举写死,而不是散在代码里用魔法数字。位置分左侧(HD_LEFT)、右侧(HD_RIGHT)、绑K线(HD_CNDLE)三种;外观基元只有水平线(HD_LINE)和矩形(HD_RECTANGLE)两种;方向用 HD_LEFTRIGHT 与 HD_RIGHTLEFT 区分红蓝条的伸展朝向。 价格级数 rounding 用 HD_ZOOM 控制:HD_MIN 不四舍五入(最细但吃资源),HD_MIDDLE 四舍五入到十,HD_BIG 四舍五入到百。默认走 HD_MIDDLE,步幅就是 10,级别数量随品种价位浮动而不是写死。 以逐笔报价成交量分布指标为例,输入块里只暴露 hdStyle、hdHorSize、hdColor、hdWidth、TargetPeriod、SourcePeriod、hdStep、MaxHDcount、iTimer。定位没必要做成参数——这类指标只能绑 K 线,写死反而省事。 hdHorSize 默认 20,代表单根示意图水平条最长不超 20 根 K 线;调大更精细,但超过图表密度就会互相叠图。SourcePeriod 默认 M1,若分析周期选月线、源也选月线,计算可能卡很久。iTimer 默认 1 秒,比直接塞 PeriodSeconds(SourcePeriod) 更能精准抓新 K 线出生点。 外汇与贵金属波动剧烈、杠杆高风险,参数回测请在 MT5 策略测试器用历史数据先跑一遍再上实盘。

MQL5 / C++
enum HD_POSITION
{
  HD_LEFT     = -class="num">1,
  HD_RIGHT    =  class="num">1,
  HD_CNDLE    =  class="num">2 
};
enum HD_STYLE 
{
  HD_LINE         = OBJ_HLINE,        
  HD_RECTANGLE    = OBJ_RECTANGLE,    
};
enum HD_DIRECT 
{
  HD_LEFTRIGHT = -class="num">1,
  HD_RIGHTLEFT =  class="num">1 
};
enum HD_ZOOM {
  HD_MIN     = class="num">0,  class=class="str">"cmt">//class="num">1
  HD_MIDDLE  = class="num">1,  class=class="str">"cmt">//class="num">10
  HD_BIG     = class="num">2   class=class="str">"cmt">//class="num">100
}; 
input HD_STYLE        hdStyle      = HD_LINE;
input class="type">int             hdHorSize    = class="num">20;
input class="type">class="kw">color           hdColor      = clrDeepSkyBlue;
input class="type">int             hdWidth      = class="num">2;
input ENUM_TIMEFRAMES TargetPeriod = PERIOD_D1;
input ENUM_TIMEFRAMES SourcePeriod = PERIOD_M1;
input HD_ZOOM         hdStep       = HD_MIDDLE;  
input class="type">int             MaxHDcount   = class="num">5;
input class="type">int             iTimer       = class="num">1;  

◍ OnInit 里把管理器与价格级数备好

在 OnInit() 处理程序里,先建一个示意图管理器对象就够了——所有示意图同类型,没必要多开。两个示意图也在此生成但不立即绘制:一个按当前周期逐笔报价交易量做分布、后续会定时重绘;另一个用历史记录画分布,画完即交还控制权、不再维护。 指标不碰示意图的图形基元,所以外观不会被指标逻辑改掉,这是这套写法在 MT5 里省开销的关键。 价格级数靠两个变量按步幅算,它们从 Digits() 和 Point() 派生。hdDigit 先吃掉 hdStep 的偏移:hdDigit = Digits() - (int)hdStep。随后用 switch 给 hdPoint 赋值,步幅分三档——HD_MIN 取 1 倍 Point,HD_MIDDLE 取 10 倍,HD_BIG 取 100 倍,都不匹配就 return(INIT_FAILED) 让初始化失败。 处理程序里再顺手做点小动作并开启计时器,后面重绘当前周期分布就靠它驱动。外汇与贵金属品种点值跨度大,HD_MIDDLE/HD_BIG 的乘数直接在回测里改了看柱宽变化最直观。

MQL5 / C++
  hdDigit = Digits() - (class="type">int)hdStep; 
  class="kw">switch (hdStep)
    {
      case HD_MIN:
        hdPoint =       Point();
        class="kw">break;
      case HD_MIDDLE:
        hdPoint = class="num">10 *  Point();
        class="kw">break;  
      case HD_BIG:
        hdPoint = class="num">100 * Point();
        class="kw">break;        
      class="kw">default:
        class="kw">return (INIT_FAILED);
    }

常见问题

水平线默认绑定的是价格坐标,拖动时若未开启「钉死在坐标」选项,它只会跟随像素位置;开启后线会锁定到具体价格级数,缩放或滚动都不会漂。
用输入参数定义起始价、间距和数量,在初始化时循环生成;把价格级数提前算好存入数组,后续直接批量绘制即可。
可以,小布能基于近期波动自动识别潜在支撑阻力区并生成水平示意图,你只需打开对应品种页确认或微调。
枚举让你在下拉框里选实线、虚线、点线等固定样式,避免手填数字出错;配合输入参数可快速切换整组线的外观。
初始化阶段算好级数数组,绘制和刷新时直接读取,能减少卡顿和小数点跳动,尤其在多线、低周期图上更明显。