一个绘制支撑和阻力线的指标实例·综合运用
📐

一个绘制支撑和阻力线的指标实例·综合运用

(3/3)·前两步铺垫完概念与单点构建,这篇把水平线、均线动态位和收尾判断一次串起来

实战向 第 3/3 篇

接上篇,我们已经能靠分形点拉出倾斜的支撑阻力线,但实盘里水平位和均线派生位同样高频出现。很多交易者手动重画这些线,浪费时间且容易漏掉关键边界。本文把三类画法放在同一个指标里跑通,顺便说清各自的适用场景。

高周期水平线指标的缓冲区与跨周期对齐

做水平支撑阻力指标,命名上加个 H 后缀区分垂直类工具,输入参数固定当前图表时段、三个斐波那契系数,开 7 个缓冲区装线。更高周期的时间、最高、最低分别落进三个独立数组,复制函数里用 ArrayResize 按需扩缓冲,避免漏掉新柱。 跨周期画图最麻烦的是时间轴不对齐。小周期每根柱都要去大周期数组里找「当前所属那根」的边界,用 ArrayBsearch 二分定位后再做边界修正,否则线会错位到前一根。 截图里价格多次在指标画出的水平线反转,其中一条支撑在很长一段时间内都未被跌破。外汇和贵金属波动受消息驱动,这类水平线仅作概率参考,实盘须配合仓位控制。 参数别照抄,K_Fibo_1~3 和 Period_TF 要按你的交易系统回测调。比如中线写死 0.5,若做黄金 1H 图表可把系数往 0.382 / 0.618 靠,观察触碰频率再定。

MQL5 / C++
class="type">void array_copy(class="type">int b_)
  {
  ArrayResize(time_tf,b_);                         class=class="str">"cmt">//为我们的数据修改缓冲区大小
  ArrayResize(high_tf,b_);
  ArrayResize(low_tf,b_);
  class="type">int total=b_-bars_tf;                            class=class="str">"cmt">//计算所需复制的数据
  CopyTime(_Symbol,Period_TF,class="num">0,total,time_tf)      class=class="str">"cmt">//把缺失的数据复制到数组中
  CopyHigh(_Symbol,Period_TF,class="num">0,total,high_tf);
  CopyLow(_Symbol,Period_TF,class="num">0,total,low_tf);
  bars_tf=b_;                                      class=class="str">"cmt">//记住数组大小和数据的数量
  }
class="type">void f1(class="type">class="kw">double k_fibo,class="type">int q,class="type">int r,class="kw">const class="type">class="kw">datetime &time_[],class="type">class="kw">double &b1[],class="type">class="kw">double &b2[])
  {
   for(class="type">int w=q;w<r;w++)
     {
      class="type">int b=f2(time_[w]);         class=class="str">"cmt">//在更高时段数组中找到当前柱的时间
      class="type">class="kw">double h=high_tf[b];        class=class="str">"cmt">//取得最高价
      class="type">class="kw">double l=low_tf[b];         class=class="str">"cmt">//取得最低价
      class="type">class="kw">double hl=h-l;              class=class="str">"cmt">//取得变化范围
      b1[w]=h-hl*k_fibo;          class=class="str">"cmt">//把计算数值加到支撑缓冲区
      b2[w]=l+hl*k_fibo;          class=class="str">"cmt">//把计算数值加到阻力缓冲区
     }
  }
class="type">int f2(class="type">class="kw">datetime t_)
  {
  class="type">int b_=ArrayBsearch(time_tf,t_);      class=class="str">"cmt">//在排好序的数组中通过标准搜索来找到柱
  if(time_tf[b_]>t_)b_--;               class=class="str">"cmt">//如果返回了最接近的柱的时间,我们将把它减1
  class="kw">return(MathMax(class="num">0,b_-class="num">1));              class=class="str">"cmt">//不要忘记返回柱时要考虑到最小限制
  }
   class="type">int limit=prev_calculated;
   if(limit>class="num">0)limit--;
   class="type">int bar=Bars(_Symbol,Period_TF);
   if(bars_tf==class="num">0 || bar>bars_tf)array_copy(bar);
   f1(class="num">0.5,limit,rates_total,time,buffer7,buffer7);           class=class="str">"cmt">//画出中线
   f1(K_Fibo_1,limit,rates_total,time,buffer1,buffer2);      class=class="str">"cmt">//根据系数1画出水平线
   f1(K_Fibo_2,limit,rates_total,time,buffer3,buffer4);      class=class="str">"cmt">//根据系数2画出水平线
   f1(K_Fibo_3,limit,rates_total,time,buffer5,buffer6);      class=class="str">"cmt">//根据系数3画出水平线

「用均线系画出动态支撑阻力」

水平线只是静态参照,价格在区间和趋势切换时常常穿透。MT5 自带的 MA、布林带、包络线本质是跟随价格的动态带,能在图表上生成会移动的支撑与阻力区域。 具体做法:给 MA 或布林带打开指标属性 → “水平”页,手动加两个负值水平(如 -0.5、-1.0)和两个正值水平(如 +0.5、+1.0)。这样指标线上下会对称展开四条偏移轨,视觉上就是一组动态通道。 实测中价格对这些偏移轨的反应,和碰固定水平线类似,会出现反弹或减速。外汇与贵金属杠杆高、滑点大,这种动态水平仅作概率参考,不代表反转必现。 其它指标也能套同样思路,核心是把“价格看到线”的逻辑从静态搬到跟随轨上,开 MT5 拖一个 MA 进去改水平页就能验证。

◍ 水平翻转时的盯盘重点

支撑和阻力线最容易被忽略的特性之一是角色互换:当价格有效突破一条支撑线后,该位置在后续回踩中往往转为阻力;反之亦然,被突破的阻力线常变成新支撑。这种翻转不是理论假设,而是 MT5 历史行情里反复出现的现象,尤其在伦敦段贵金属和欧元系货币对上更频繁。 单纯把价格到达水平线当作进场理由并不可靠,你无法保证触碰后一定反转或延续。更务实的做法是,在价格接近这些区域时调高盯盘优先级,等出现额外的价格行为信号——比如吞没形态或动量衰减——再考虑动作。外汇与贵金属杠杆高,这类区域假突破概率不低,任何决策都该带止损。 文末附的 Resistance_Support.mq5 约 10.4 KB,可直接拖进 MT5 指标目录验证水平绘制逻辑。把它当模板改两个条件就能用:只算欧洲时段的水平线,或给倾斜构造加斜率过滤。开实盘前先在策略测试器跑一遍 2023 年 XAUUSD 的 M15 数据,看翻转区被触碰后的反应再定参数。

把三类线形诊断交给小布
这些线形的识别与重绘,小布盯盘的 AIGC 已内置到对应品种页,打开就能看到动态支撑阻力带,你只管判断假突破和入场节奏。

常见问题

水平位直接对应成交密集区与整数关口,价格在通道内反复触碰的概率更高;倾斜线随趋势延展,容易在拐点处失效,实战中常作为区间边界优先参考。
均线是一条跟随价格的曲线,而基于均线的支撑阻力位通常取均线带上下轨或斜率转折区,更强调静态边界,适合挂单而非追价。
可以,小布在品种页用分形识别可见区间的峰值谷值,自动画出上下障碍线,并提示是否被突破,省去手动在 MT5 上改代码的步骤。
建议按周期切换显示:小周期只看水平位,日线以上才叠加均线派生位,并在代码里用颜色透明度区分,避免视觉重叠导致误判。