MQL5 通道绘制:用三个极值自动画平行通道
一、通道绘制工具的动机
通道是仅次于均线的流行分析工具,能直观表达趋势宽度与支撑阻力。本文不做“自动 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 条线(上下边界、中线、若干百分比区)。
五、坑
六、用三个极值点定通道
通道(如标准通道线、回归通道)常由三个关键点确定:两个相邻极值定方向,第三个极值定宽度。算法上先找最近的一段高低点,用前两点算斜率,再按第三点偏移出上下轨。
三极值法比「最近 N 根高低点」更稳,因为它显式建模了「拐点」,画出的通道贴合肉眼看到的震荡带,而不是被极端刺破的毛刺带偏。
七、通道突破信号
价格触及上轨且方向偏空可视为回调/反转信号,触及下轨偏多同理。但通道突破也常是趋势加速,所以要结合趋势过滤:顺势突破追、逆势触轨反。
八、历史通道与重绘
通道若用「未来数据」去拟合(如用还没走出来的极值点),会出现重绘——回测里看着完美、实盘一碰就破。正确做法是用「截至当前」的极值点画,接受它随新极值动态移动。
实盘里通道是活的:新极值出现就重画,这是正常的,但要保证你的信号逻辑基于「已确定」的轨,而不是回测时偷偷用了未来轨。 配合「通道宽度」本身做过滤也很有效:窄通道里触轨反转概率高,宽通道里往往是趋势中继,用宽度区分两种语义比单看触轨更稳。
九、通道的统计学变体:标准差通道
除极值点通道,另一种常见做法是「中轨加减 N 倍标准差」(类似布林但用于任意周期),用统计而非几何定宽度,对波动变化更自适应:波动大通道自动变宽,平静时自动收窄。
两种通道各有适用:极值点通道贴合肉眼拐点、适合主观交易;标准差通道随波动自适应、适合量化过滤。理解差异后按策略选,而非二选一。