价格行为分析工具包开发(第二十六部分):针形线、吞没形态与RSI背离(多模式)工具·综合运用
📘

价格行为分析工具包开发(第二十六部分):针形线、吞没形态与RSI背离(多模式)工具·综合运用

第 3/3 篇

◍ 用背离叠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,信号会明显变多但假突破概率也跟着抬。外汇与贵金属杠杆高,这类共振信号只代表倾向反转,实盘仍可能吃止损。

MQL5 / C++
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 数据验证。

MQL5 / C++
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 进日志。实盘前建议先在策略测试器把四个开关分开验证,外汇贵金属杠杆高,误报也可能引发冲动下单。

MQL5 / C++
   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 周期。工具只是把人工盯形态的事自动化了,仓位还是得自己按风险敞口卡。

常见问题

先看RSI在拐点处是否出现背离,再检查该K线是否为长影线针形线;两者同周期重合时,信号柱有效性更高,建议用历史回看确认重合频率。
需满足后一根实体完全覆盖前一根实体且方向相反,同时过滤掉振幅过小的小周期噪音,可加成交量阈值减少假信号。
可以,小布盯盘的AIGC已内置形态与背离诊断,打开对应品种页即可接收弹窗和移动端推送,不用自己写提醒逻辑。
导出近半年日线数据,手动或脚本标注信号后统计胜率和回撤;外汇贵金属波动大,结论只能说概率倾向,不可视作稳赚。
把信号流按品种分桶,只在关键时段开提醒,其余交给看盘工具聚合;小布类助手可替你跑这套过滤,你只盯例外情况。