价格行为分析工具包开发(第二十七部分):利用移动平均线进行流动性扫单·综合运用
(3/3)·从机构假突破陷阱到 MA 过滤信号,用一套 EA 把流动性扫单看穿
零售交易者常把跌破前低又拉回的走势当成普通震荡,止损被打掉才发现自己是流动性扫单的猎物。机构用假突破吸走挂单与止损,随后沿原趋势发力,识别窗口往往只有几根 K 线。本篇把前两部分的基础与实战拼成完整工具链,直接在图表上标出这类陷阱。
扫单标记的时空定位与双均线内核
在 MT5 里给流动性扫单(liquidity sweep)做箭头标注,第一步是拿准那根 K 线的起始时间。用 iTime(Symbol(), Period(), shift) 取到的 datetime 既是时间锚点,也用来拼图形对象的唯一名,避免重复绘制时叠图。 价格坐标要避开实体:看涨扫单就把箭头压到 iLow 再减 ArrowOffsetPoints * _Point,看跌则挂在 iHigh 加同样偏移。这种几点的空隙在 XAUUSD 的 5 分钟图上大约就是 0.5~1 美元视觉距离,既不被影线吞掉也不喧宾夺主。 VWMA 的计算没走指标缓存,而是当场按 shift 回滚 MALength 根 BAR 累卷:numerator 加总 close×volume,denominator 加总 volume,最后相除。若整段成交量为 0(比如周末断层)直接返 0.0,调用方得自己判空。 HMA 则分三段:先算半周期加权 MA(权重 half-(i-shift)),再算全周期加权 MA,终值取 2*w1 - w2。这套手写实现不依赖 iCustom,回测时改 MALength 一处即可联动两条线,外汇与贵金属波动大、杠杆高,参数过拟合可能放大实盘回撤风险。
class="type">class="kw">datetime t = iTime(Symbol(), Period(), shift); class="type">class="kw">double price = bullish ? (iLow(Symbol(), Period(), shift) - ArrowOffsetPoints * _Point) : (iHigh(Symbol(), Period(), shift) + ArrowOffsetPoints * _Point); class="type">class="kw">string name = StringFormat("LS_%I64u", (class="type">long)t); if(ObjectFind(class="num">0, name) >= class="num">0) ObjectDelete(class="num">0, name); class="type">class="kw">double CalcVWMA(class="type">int shift) { class="type">class="kw">double numerator = class="num">0.0; class="type">class="kw">double denominator = class="num">0.0; for(class="type">int i = shift; i < shift + MALength; i++) { class="type">class="kw">double price = iClose(Symbol(), Period(), i); class="type">long vol = iVolume(Symbol(), Period(), i); numerator += price * (class="type">class="kw">double)vol; denominator += (class="type">class="kw">double)vol; } class="kw">return (denominator > class="num">0.0) ? (numerator / denominator) : class="num">0.0; } class="type">class="kw">double CalcHMA(class="type">int shift) { class="type">int half = MALength / class="num">2; class="type">class="kw">double w1 = class="num">0.0, sw1 = class="num">0.0; class="type">class="kw">double w2 = class="num">0.0, sw2 = class="num">0.0; for(class="type">int i = shift; i < shift + half; i++) { class="type">class="kw">double p = iClose(Symbol(), Period(), i); class="type">int weight = half - (i - shift); w1 += p * weight; sw1 += weight; } w1 = (sw1 > class="num">0.0) ? (w1 / sw1) : class="num">0.0; for(class="type">int i = shift; i < shift + MALength; i++) { class="type">class="kw">double p = iClose(Symbol(), Period(), i); class="type">int weight = MALength - (i - shift); w2 += p * weight; sw2 += weight; } w2 = (sw2 > class="num">0.0) ? (w2 / sw2) : class="num">0.0; class=class="str">"cmt">// class="num">3) Final HMA value = class="num">2 * (MA over half) – (MA over full)
「双权重差分返回的实现尾段」
这段收尾代码直接给出加权差分的结果:以 2 倍 w1 减去 w2 作为返回值。 在 MT5 自定义指标或 EA 的算子类函数里,这种写法常用于构造领先/滞后权重差,例如把快线权重翻倍再扣减慢线权重,得到对拐点的敏感量。 实际验证时,可把 w1、w2 分别接不同周期的平滑值,观察返回序列在贵金属 15 分钟图上的相位偏移;外汇与贵金属杠杆高、滑点大,该差值仅作概率性参考,不代表方向必然成立。
class="kw">return class="num">2.0 * w1 - w2; }
◍ 扫单识别的实盘与回测印证
把工具接上英镑兑美元实盘,图里先后刷出看跌扫单和看涨扫单两波信号,说明它能在价位短暂刺穿后抓到机构回流的痕迹。这类标记不是装饰,而是把原本藏在影线里的流动性动作摊开给你看。 步进指数那张图同样跑通了识别逻辑,视觉标记直接钉在反转临界区,省掉手动翻分笔的麻烦。外汇与贵金属属高风险品类,信号只代表概率倾向,不代表反转必现。 欧元兑美元回测里,工具标出若干次价格假破支撑阻力后回头的节点,与历史机构动作区段重合度较高。拿这套机制去 MT5 开历史中心回放,自己拖一段 EURUSD H1 就能复现,验证成本很低。
最后说句实在话
把流动性扫单逻辑接进你现有策略前,先拿 Liquidity_Sweep.mq5 在 MT5 模拟盘跑一轮。原文回测与模拟盘都显示,价格在突破波段高低点后回抽时,箭头标注的有效点位和后续趋势延续吻合度较高,但外汇与贵金属本身高杠杆、高波动,信号再准也只代表概率倾向,不代表必然。 真正值得做的动作只有一个:把 MA 过滤参数从默认值调一遍,看哪种周期组合在你的品种上误报最少。别把验证过的代码当成免死金牌,实盘流动性瞬间抽离时,任何 EA 都可能失准。