学习如何基于牛市力量设计交易系统·进阶篇
📘

学习如何基于牛市力量设计交易系统·进阶篇

第 2/3 篇

◍ 牛市力量三种判定逻辑拆解

把牛市力量(Bulls Power)做成可执行的系统,核心是先框定每次 tick 要比较哪几个量。第一种只比两期力量值:当期大于前期,图表注释输出“牛市力量正在上升”并打印两值;反之输出“牛市力量正在下降”并打印两值。 第二种引入价格高点,凑齐当期高点、前期高点、两期力量值四个数。当高点抬高且力量也抬高,注释给“强劲走势”并打印四项;若高点抬高但力量走低,则是“看跌背离”并打印四项——这种背离在外汇与贵金属里常出现在趋势末端,但仅作概率提示,不预示反转必然发生。 第三种直接挂到交易触发上:每次跳价看当期力量、零轴、收盘价、EMA 四条。力量低于零且收盘价低于 EMA,注释“卖出信号”带三项数值;力量高于零且收盘价高于 EMA,注释“买入信号”带三项数值。贵金属与外汇杠杆高,这类信号只是过滤条件,实盘须自行加止损与仓位限制。

「把牛市力量做成图表自动注释」

想在 MT5 图表上实时盯牛市力量(Bull's Power),最轻量的做法是用 EA 在右上角写注释,而不是手动翻数据窗口。下面这段核心代码就是把当期值抓出来并规范化显示,复制进 MQ5 文件编译即可用。 double bullpowerArray[]; ArraySetAsSeries(bullpowerArray,true); int bullpowerDef = iBullsPower(_Symbol,_Period,13); CopyBuffer(bullpowerDef,0,0,3,bullpowerArray); double bullpowerVal = NormalizeDouble(bullpowerArray[0],6); Comment("Bull's Power Value is ",bullpowerVal); 逐行拆解:第1行声明 double 数组存指标值;第2行 ArraySetAsSeries 设时间序列排序,使 [0] 为最新一根 K;第3行 iBullsPower 用当前品种、当前周期、MA 周期 13 建句柄;第4行 CopyBuffer 从句柄 0 号缓冲复制 3 根到数组;第5行 NormalizeDouble 取最新值并保留 6 位小数;第6行 Comment 把值刷到图表。 实测中 MA 周期 13 是默认参数,若切到 M1 与 H4 同品种,注释数值会随 _Period 自动变,不需要改代码。外汇与贵金属波动大,指标值仅反映买方压力倾向,不代表价格必然反转。 基于这套读取,可延伸三种信号逻辑:单纯比当期与前期值判上升/下降;结合高点数组判强劲或看跌背离;再叠 EMA 数组出买卖注释。先跑通上面 6 行,再去 navigator 拖 EA 到图,就能看到实时数值注释。

MQL5 / C++
class="type">class="kw">double bullpowerArray[];
ArraySetAsSeries(bullpowerArray,true);
class="type">int bullpowerDef = iBullsPower(_Symbol,_Period,class="num">13);
CopyBuffer(bullpowerDef,class="num">0,class="num">0,class="num">3,bullpowerArray);
class="type">class="kw">double bullpowerVal = NormalizeDouble(bullpowerArray[class="num">0],class="num">6);
Comment("Bull&class="macro">#x27;s Power Value is ",bullpowerVal);

多头力道的实时涨跌判定

在 MT5 里用 Bulls Power 做盘中跟踪,核心就是拿当前柱和前一根柱的缓冲值比大小。下面这段 OnTick 逻辑把周期固定为 13,每次报价进来就刷新一次多空力道的方向判断。 代码先用 iBullsPower 拿到指标句柄,再通过 CopyBuffer 取最近 3 根柱的数据到数组(实际只用了 [0] 和 [1])。NormalizeDouble 保留两位小数后的第六位,纯粹是为了 Comment 输出时不出现浮点噪声。 当 bullpowerVal 大于 bullpowerPrevVal,终端左下角会提示“Bull's Power is rising”,反之提示“declining”。外汇与贵金属杠杆高,这类力道转向只代表买盘短期可能占优,绝不预示单边行情必然展开。 直接把代码挂 EURUSD 的 M15 上跑,能看到力道值在 0 轴上下来回穿:若连续 3 根 tick 都报 rising 且数值从 -0.000120 爬到 0.000340,价格随后反弹的概率会偏高,但仍需结合结构确认。

MQL5 / C++
class="type">void OnTick()
  {
   class="type">class="kw">double bullpowerArray[];
   ArraySetAsSeries(bullpowerArray,true);
   class="type">int bullpowerDef = iBullsPower(_Symbol,_Period,class="num">13);
   CopyBuffer(bullpowerDef,class="num">0,class="num">0,class="num">3,bullpowerArray);
   class="type">class="kw">double bullpowerVal = NormalizeDouble(bullpowerArray[class="num">0],class="num">6);
   class="type">class="kw">double bullpowerPrevVal = NormalizeDouble(bullpowerArray[class="num">1],class="num">6);
   if(bullpowerVal>bullpowerPrevVal)
     {
      Comment("Bull&class="macro">#x27;s Power is rising","\n",
              "Bull&class="macro">#x27;s Power Value is ",bullpowerVal,"\n",
              "Bull&class="macro">#x27;s Power Previous Value is ",bullpowerPrevVal);
     }
   if(bullpowerVal<bullpowerPrevVal)
     {
      Comment("Bull&class="macro">#x27;s Power is declining","\n",
              "Bull&class="macro">#x27;s Power Value is ",bullpowerVal,"\n",
              "Bull&class="macro">#x27;s Power Previous Value is ",bullpowerPrevVal);
     }
  }

◍ 牛力指标与高点共振的实时判定

这段脚本把 Bull's Power 和价格高点做成同帧比对,逻辑只认两种状态:价格高点抬升且牛力同步放大,标为 Strong Move;价格高点抬升但牛力萎缩,判为 Bearish divergence。周期取最近 3 根 K 线(CopyRates 的 0,3),牛力周期固定 13(iBullsPower 的第三个参数),所有数值 NormalizeDouble 到 6 位小数避免浮点噪声。 代码里 currentHighVal 取 priceArray[2].high、prevHighVal 取 priceArray[1].high,而 bullpowerVal 取 bullpowerArray[0]、bullpowerPrevVal 取 bullpowerArray[1];因为 ArraySetAsSeries 设为 true,索引 0 永远是最新一根。也就是说,判定用的是「最新已完成 K 线」与「前一根」的关系,当前未收线棒不参与。 外汇与贵金属杠杆高、滑点随机,这类共振只是概率倾向,不能当进场保证。开 MT5 把这段直接贴进 EA 的 OnTick,跑 EURUSD 的 M15,能看到 Strong Move 与 Bearish divergence 在图表左上角实时切换,验证牛力与高点背离的发生频率。

MQL5 / C++
class="type">void OnTick()
  {
   class="type">class="kw">double bullpowerArray[];
   class="type">MqlRates priceArray[];
   ArraySetAsSeries(bullpowerArray,true);
   class="type">int Data=CopyRates(_Symbol,_Period,class="num">0,class="num">3,priceArray);
   class="type">int bullpowerDef = iBullsPower(_Symbol,_Period,class="num">13);
   CopyBuffer(bullpowerDef,class="num">0,class="num">0,class="num">3,bullpowerArray);
   class="type">class="kw">double bullpowerVal = NormalizeDouble(bullpowerArray[class="num">0],class="num">6);
   class="type">class="kw">double bullpowerPrevVal = NormalizeDouble(bullpowerArray[class="num">1],class="num">6);
   class="type">class="kw">double currentHighVal=NormalizeDouble(priceArray[class="num">2].high,class="num">6);
   class="type">class="kw">double prevHighVal=NormalizeDouble(priceArray[class="num">1].high,class="num">6);
   if(currentHighVal>prevHighVal && bullpowerVal>bullpowerPrevVal)
     {
      Comment("Strong Move","\n",
              "Current High Value is ",currentHighVal,"\n",
              "Previous High Value is ",prevHighVal,"\n",
              "Bull&class="macro">#x27;s Power Value is ",bullpowerVal,"\n",
              "Bull&class="macro">#x27;s Power Previous Value is ",bullpowerPrevVal);
     }
   if(currentHighVal>prevHighVal && bullpowerVal<bullpowerPrevVal)
     {
      Comment("Bearish divergence","\n",
              "Current High Value is ",currentHighVal,"\n",
              "Previous High Value is ",prevHighVal,"\n",
              "Bull&class="macro">#x27;s Power Value is ",bullpowerVal,"\n",
              "Bull&class="macro">#x27;s Power Previous Value is ",bullpowerPrevVal);
     }
  }

常见问题

看牛力柱是否连续萎缩且价格未破前高,假突破时牛力通常跟不上价格,可等柱体转弱再离场。
用脚本在牛力柱上穿阈值时画箭头或文字注释,开盘加载一次即可,不用手动盯每根K线。
小布可在对应品种页实时输出牛力强弱与多空力道变化,并标注共振点,省去自己算指标。
价格创新高且牛力柱同步放大才认共振,若高点出而牛力降,倾向视为背离,不追多。
转负当日若收盘未回正,概率上建议先减仓,结合支撑位破位再清,外汇贵金属高风险勿硬扛。