首页 / 交易学院 / MQL5 通道绘制:用三个极值自动画平行通道
MQL5 通道绘制:用三个极值自动画平行通道
🧩

MQL5 通道绘制:用三个极值自动画平行通道

MQL5 编程 难度 · 进阶 2013 12 分钟阅读
通道图形对象指标

通道绘制工具的动机

通道是仅次于均线的流行分析工具,能直观表达趋势宽度与支撑阻力。本文不做“自动 ZigZag 连续摆动检测”,而是实现一套手动设定三个极值、由标准库类自动绘制平行通道的工具——你用左价格标签(OBJ_ARROW_LEFT_PRICE)在图上点三个极值,指标算出基准线和平行线,画出通道。

三个极值如何设定

极值用 MT5 的图形对象“左价格标签”放置(颜色须匹配参数 ExtremumPointColor,默认 Yellow)。指标每秒扫描图表,用 ObjectsTotal(..., OBJ_ARROW_LEFT_PRICE) 获取总数并校验颜色,加入列表;必须恰好 3 个点才保存并允许绘通道。移动或删除标签时由 CheakExtremumMoving 检测并更新,不足 3 个则清空不绘。

用相对柱编号确定斜率与宽度

设 A、B 为前两个极值定基准线,C 为第三个极值定平行线。为避免休市日(周五→周一)时间断点导致坐标错乱,改用相对柱编号(Bars() 取两极值间的柱数)而非绝对时间:

double B2 = Bars(symbol, tf, point_left, point_right);  // A->B 柱数
double B3 = Bars(symbol, tf, point_left, point_middle); // A->C 柱数
double koeff_A = (price_right - price_left) / B2;       // 基准线斜率
// 第三个极值 C 校准平行线价格
double P3_AB = price_left + B3*koeff_A;                 // 基准线在 C 处的价
if(P3_AB > price_middle) // 2MAX_1MIN 情形
  {
   left_prices[UP]  = price_left;
   right_prices[UP] = price_right;
   left_prices[DN]  = price_middle - B3*koeff_A;
   right_prices[DN] = left_prices[DN] + (price_right - price_left);
  }

图形对象绘制

通道边界用 TChannelBorderObject 继承 CChartObjectTrend(即 OBJ_TREND 趋势线)绘制上下两条平行线,中线与百分比区同理。取边界价格用 ObjectGetValueByTime,而非手工设坐标。整个通道类 TSlideChannelObject 继承 CList,可管理最多 9 条线(上下边界、中线、若干百分比区)。

⚠ 手动通道的脆弱点
1) 时间断点:绝对时间跨休市会致通道错位,本文用相对柱编号 Bars() 解决。2) 极值移动/消失:标签被拖动或删掉要用 CheakExtremumMoving 检测并更新列表,不足 3 个立即清绘。3) 不同周期:ExtremumHandSet 与 SlideChannel 通过 PrefixString+Symbol()+周期存全局变量,可设不同周期同步(H1 设极值、M5 看通道)。4) CList 当前节点指针随 GetFirstNode/GetNextNode 移动,使用前要注意。

常见问题

因为金融图表有休市(如周五收盘到周一开盘之间没柱子),用绝对时间差算斜率会混入“空白时间”,通道错位。Bars() 返回两极值之间的实际柱数,只数真实 K 线,避开了时间断点,坐标连续无误。
ZigZag 自动找连续摆动极值并连线,但极值会随新 K 线出现而“重绘”(过去的拐点可能消失或移位),回测看起来完美、实盘却变。本文是手动点三个极值,通道固定不变、不重绘,适合做半自动分析或人工标注,代价是要你手动放点。
指标用 Prefix + Symbol() + 周期 作键把极值存到全局变量(如 MainChannel_EURUSD_5_DTime_Extr1)。你可以在 H1 图上放极值标签,在 M5 图上让 SlideChannel 读同一套全局变量画出同一条通道,实现“大周期定通道、小周期看价格”的用法。