价格行为分析工具包开发(第二十六部分):针形线、吞没形态与RSI背离(多模式)工具·综合运用
◍ 用背离叠K线形态锁定信号柱
这段逻辑把 RSI 背离和价格行为形态绑在一起,只在两者共振时才吐出信号。FindSignalBar 在 i=5 到 i=15 的回看窗口里扫描:价格新低但 RSI 更高且处在超卖区,记为 bullDiv;价格新高但 RSI 更低且处在超买区,记为 bearDiv。 若没有任何背离直接返回 0,不浪费后续计算。接着调用 IsBullishPinBar 或 IsBullishEngulfing 检查 1 号 K 线(即最近一根已完成柱)是否走出多头形态,空头同理。只有 bullDiv 配 bullPat 才返回 +1,bearDiv 配 bearPat 才返回 -1,否则 0。 _pinbar 的判定给的是硬比例:下影线必须大于实体 2.0 倍、上影线小于实体 0.5 倍、实体本身大于全程振幅的 0.1。开 MT5 把 2.0 和 0.5 调到 1.5 / 0.3,信号会明显变多但假突破概率也跟着抬。外汇与贵金属杠杆高,这类共振信号只代表倾向反转,实盘仍可能吃止损。
class="type">int FindSignalBar() { class="type">bool bullDiv = class="kw">false, bearDiv = class="kw">false; for(class="type">int i = class="num">5; i <= class="num">15; i++) { if(lowBuffer[i] > lowBuffer[class="num">1] && rsiBuffer[i] < rsiBuffer[class="num">1] && rsiBuffer[class="num">1] < RSI_Oversold) bullDiv = true; if(highBuffer[i] < highBuffer[class="num">1] && rsiBuffer[i] > rsiBuffer[class="num">1] && rsiBuffer[class="num">1] > RSI_Overbought) bearDiv = true; } if(!bullDiv && !bearDiv) class="kw">return class="num">0; class="type">bool bullPat = IsBullishPinBar(class="num">1) || IsBullishEngulfing(class="num">1); class="type">bool bearPat = IsBearishPinBar(class="num">1) || IsBearishEngulfing(class="num">1); if(bullDiv && bullPat) class="kw">return +class="num">1; if(bearDiv && bearPat) class="kw">return -class="num">1; class="kw">return class="num">0; } class="type">bool IsBullishPinBar(class="type">int i) { class="type">class="kw">double body = MathAbs(openBuffer[i] - closeBuffer[i]); class="type">class="kw">double rng = highBuffer[i] - lowBuffer[i]; class="type">class="kw">double lw = MathMin(openBuffer[i], closeBuffer[i]) - lowBuffer[i]; class="type">class="kw">double uw = highBuffer[i] - MathMax(openBuffer[i], closeBuffer[i]); class="kw">return closeBuffer[i] > openBuffer[i] && lw > class="num">2.0 * body && uw < class="num">0.5 * body && body > class="num">0.1 * rng; } class="type">bool IsBearishPinBar(class="type">int i) { class="type">class="kw">double body = MathAbs(openBuffer[i] - closeBuffer[i]); class="type">class="kw">double rng = highBuffer[i] - lowBuffer[i]; class="type">class="kw">double uw = highBuffer[i] - MathMax(openBuffer[i], closeBuffer[i]); class="type">class="kw">double lw = MathMin(openBuffer[i], closeBuffer[i]) - lowBuffer[i]; class="kw">return closeBuffer[i] < openBuffer[i] && uw > class="num">2.0 * body && lw < class="num">0.5 * body && body > class="num">0.1 * rng; }
吞没形态判定与信号绘制函数
在 MT5 自定义指标里,吞没形态不需要肉眼逐根比对,用两个布尔函数就能把判定逻辑固化。IsBullishEngulfing 检查当前阳线收高于开、且实体完全包住前一根阴线实体,三项条件任一不满足即返回 false。 看空吞没是对称写法:当前阴线收低于开,且开低于前收、收低于前开,才认定为有效。注意这里比的是实体边界(open/close),不含影线,所以假信号概率会略高,贵金属 15 分钟图上建议叠加成交量过滤。 DrawSignal 负责把信号落到图上:箭头用 233/234 编码区分多空,入场线画 aqua 水平线,止损线用橙红虚线。循环 j 从 i+5 到 i+14 共 10 根 K 线,只在多头且后续低点抬高时画趋势线,这段就是用来标出潜在的动量延续区。 外汇与贵金属属高杠杆品种,信号仅代表形态成立,不代表后市必涨必跌,实盘前请在策略测试器跑至少 3 个月 tick 数据验证。
class="type">bool IsBullishEngulfing(class="type">int i) { if(closeBuffer[i] <= openBuffer[i]) class="kw">return class="kw">false; if(openBuffer[i] > closeBuffer[i+class="num">1]) class="kw">return class="kw">false; if(closeBuffer[i] < openBuffer[i+class="num">1]) class="kw">return class="kw">false; class="kw">return true; } class="type">bool IsBearishEngulfing(class="type">int i) { if(closeBuffer[i] >= openBuffer[i]) class="kw">return class="kw">false; if(openBuffer[i] < closeBuffer[i+class="num">1]) class="kw">return class="kw">false; if(closeBuffer[i] > openBuffer[i+class="num">1]) class="kw">return class="kw">false; class="kw">return true; } class="type">void DrawSignal(class="type">int i, class="type">bool isBullish, class="type">class="kw">double entry, class="type">class="kw">double stopL) { class="type">class="kw">string tag = TimeToString(timeBuffer[i], TIME_SECONDS); class="type">class="kw">string nameA = "Arr_" + tag; class="type">class="kw">string nameE = "Ent_" + tag; class="type">class="kw">string nameS = "SL_" + tag; class="type">class="kw">string nameL = "Div_" + tag; class="type">class="kw">color clrArr = isBullish ? clrLime : clrRed; class="type">int code = isBullish ? class="num">233 : class="num">234; ObjectCreate(class="num">0, nameA, OBJ_ARROW, class="num">0, timeBuffer[i], entry); ObjectSetInteger(class="num">0, nameA, OBJPROP_COLOR, clrArr); ObjectSetInteger(class="num">0, nameA, OBJPROP_ARROWCODE, code); ObjectSetInteger(class="num">0, nameA, OBJPROP_WIDTH, class="num">2); ObjectCreate(class="num">0, nameE, OBJ_HLINE, class="num">0, class="num">0, entry); ObjectSetInteger(class="num">0, nameE, OBJPROP_COLOR, clrAqua); ObjectCreate(class="num">0, nameS, OBJ_HLINE, class="num">0, class="num">0, stopL); ObjectSetInteger(class="num">0, nameS, OBJPROP_COLOR, clrOrangeRed); ObjectSetInteger(class="num">0, nameS, OBJPROP_STYLE, STYLE_DASH); for(class="type">int j = i + class="num">5; j < i + class="num">15; j++) { if(isBullish && lowBuffer[j] > lowBuffer[i]) { ObjectCreate(class="num">0, nameL, OBJ_TREND, class="num">0, timeBuffer[j], lowBuffer[j],
「把背离信号推送到弹窗和手机」
这段逻辑接在 RSI 背离判定之后,负责把识别出的形态画成趋势线并触发提醒。多头情形用 DodgerBlue 色画在低点之间,空头用 Orange 画在高点之间,颜色区分能让你在 MT5 图表上一眼分辨方向。 信号文本用 StringFormat 拼装,包含形态名(吞没或 PinBar)、买卖方向、品种、分钟级时间、入场价与止损价,精度到小数点后 5 位,外汇和贵金属报价都够用。 提醒通道由开关控制:Alert 弹窗必然触发,EnableSound 播放 alert.wav,EnablePush 发手机通知,EnableEmail 发邮件,最后 Print 进日志。实盘前建议先在策略测试器把四个开关分开验证,外汇贵金属杠杆高,误报也可能引发冲动下单。
timeBuffer[i], lowBuffer[i]);
ObjectSetInteger(class="num">0, nameL, OBJPROP_COLOR, clrDodgerBlue);
class="kw">break;
}
if(!isBullish && highBuffer[j] < highBuffer[i])
{
ObjectCreate(class="num">0, nameL, OBJ_TREND, class="num">0,
timeBuffer[j], highBuffer[j],
timeBuffer[i], highBuffer[i]);
ObjectSetInteger(class="num">0, nameL, OBJPROP_COLOR, clrOrange);
class="kw">break;
}
}
class="type">class="kw">string pattern = isBullish
? (IsBullishEngulfing(i) ? "Engulfing" : "PinBar")
: (IsBearishEngulfing(i) ? "Engulfing" : "PinBar");
class="type">class="kw">string side = isBullish ? "Buy" : "Sell";
class="type">class="kw">string txt = StringFormat(
"%s + RSI Divergence %s Signal\nSymbol: %s\nTime: %s\nEntry: %.5f\nSL: %.5f",
pattern, side, _Symbol,
TimeToString(timeBuffer[i], TIME_MINUTES),
entry, stopL
);
Alert(txt);
if(EnableSound)
PlaySound("alert.wav");
if(EnablePush)
SendNotification(txt);
if(EnableEmail)
SendMail("Signal EA Alert", txt);
Print(txt);
class=class="str">"cmt">//+------------------------------------------------------------------+◍ 用历史数据逼出策略的真面目
回测说白了就是用历史行情跑一遍你的交易规则,看它在过去到底赚不赚、亏多少。对做价格行为的交易者,这一步能提前暴露形态识别在真实波动里的漏判率,比肉眼翻图表靠谱。 先把进出场条件钉死:哪根K线、哪个指标交叉、哪种吞没形态算确认,都得写成机器能执行的明文。规则含糊,回测结果就会漂,后面调参全是噪音。历史数据要拉全,M30 级别至少覆盖一年以上不同波动率阶段,缺数据等于拿一半真相下注。 平台选 MT5 自带策略测试器就够硬,手动回放适合验证形态逻辑,全自动能跑批量统计。配置时把点差、佣金、滑点按你经纪商真实环境填,别用默认零成本——那样的最大回撤是假的。 跑完重点看四个数:总净盈亏、胜率、最大回撤、盈亏比。EURUSD M30 上用看涨背离确认看涨吞没,回测画面里能直接看到信号标记;USDCHF 的同周期动图演示里,系统扫出多个信号,说明该逻辑在非美货币对也有重复性,但样本外验证前不敢说稳健。 优化完必须用没参与优化的那段历史再跑一次。过度拟合的策路在样本内漂亮、样本外崩盘,外汇和贵金属杠杆高,这种坑会直接吞掉本金。独立数据上还能正期望,才值得开模拟盘接着盯。
把形态与背离信号接进你的看盘流
这套 EA 把 RSI 背离和针形线、吞没形态叠在一起,本质是用多重确认压低假信号概率。回测里,当条件全部对齐时胜率明显抬升,但样本内表现不等于实盘稳健,外汇与贵金属的高杠杆特性会把任何回撤放大。 作者在 23/05/25 发布的第 25 号工具「长影线,吞没形态和 RSI 背离」就是本文 EA 的轻量版,直接挂在 MT5 图表就能看信号,不用自己拼代码。 开 MT5 把 Pin_Bar_Engulfing_and_RSI_Divergence.mq5 拖进去,先跑 EURUSD 的 M15 看背离提示位置,再切 XAUUSD 对比警报频率,哪边噪音多就调哪边的 RSI 周期。工具只是把人工盯形态的事自动化了,仓位还是得自己按风险敞口卡。