一个绘制支撑和阻力线的指标实例·综合运用
(3/3)·前两步铺垫完概念与单点构建,这篇把水平线、均线动态位和收尾判断一次串起来
接上篇,我们已经能靠分形点拉出倾斜的支撑阻力线,但实盘里水平位和均线派生位同样高频出现。很多交易者手动重画这些线,浪费时间且容易漏掉关键边界。本文把三类画法放在同一个指标里跑通,顺便说清各自的适用场景。
高周期水平线指标的缓冲区与跨周期对齐
做水平支撑阻力指标,命名上加个 H 后缀区分垂直类工具,输入参数固定当前图表时段、三个斐波那契系数,开 7 个缓冲区装线。更高周期的时间、最高、最低分别落进三个独立数组,复制函数里用 ArrayResize 按需扩缓冲,避免漏掉新柱。 跨周期画图最麻烦的是时间轴不对齐。小周期每根柱都要去大周期数组里找「当前所属那根」的边界,用 ArrayBsearch 二分定位后再做边界修正,否则线会错位到前一根。 截图里价格多次在指标画出的水平线反转,其中一条支撑在很长一段时间内都未被跌破。外汇和贵金属波动受消息驱动,这类水平线仅作概率参考,实盘须配合仓位控制。 参数别照抄,K_Fibo_1~3 和 Period_TF 要按你的交易系统回测调。比如中线写死 0.5,若做黄金 1H 图表可把系数往 0.382 / 0.618 靠,观察触碰频率再定。
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 数据,看翻转区被触碰后的反应再定参数。