学习如何基于 DeMarker 设计交易系统·综合运用
📉

学习如何基于 DeMarker 设计交易系统·综合运用

(3/3)· 把 DeMarker 的振荡逻辑落进 MetaTrader 5 策略面板,系列收尾一篇讲透

案例拆解新手友好 第 3/3 篇
很多交易者把 DeMarker 当超买超卖开关直接抄信号,却没弄清楚它比较的是当期高低与前期的差值。先把需求衡量逻辑理顺,再去写系统,回测才不会变成碰运气。

用 DeMarker 抓超买超卖与背离

DeMarker 以 14 周期默认参数在 0~1 区间摆动,低于 0.30 倾向视为超卖,高于 0.70 倾向视为超买,中间段不提示特殊状态。这套阈值在 MT5 里直接可调,外汇与贵金属波动剧烈,阈值误判概率不低,实盘需结合其他信号过滤。 下面这段 OnTick 逻辑先把 DeMarker 数组和价格数组都设成时间序列,取最近 14 根 K 线。currentHigh>prevHigh 而 deMarkerVal<deMarkerPrevVal 时,价格新高但指标走低,属于看跌背离,可能暗示上行动能衰减。 别把 0.30/0.70 当死规矩 不同品种波幅差异大,黄金常比欧美对更快触碰极值。建议开 MT5 用策略测试器跑一段历史,看自己盯的品类在哪些阈值区间反转频率更高,再改常数。

MQL5 / C++
class="type">void OnTick()
  {
   class="type">class="kw">double deMarkerArray[];
   class="type">MqlRates pArray[];
   ArraySetAsSeries(deMarkerArray,true);
   ArraySetAsSeries(pArray,true);
   class="type">int deMarkerDef = iDeMarker(_Symbol,_Period,class="num">14);
   class="type">int pData = CopyRates(_Symbol,_Period,class="num">0,class="num">14,pArray);
   CopyBuffer(deMarkerDef,class="num">0,class="num">0,class="num">14,deMarkerArray);
   class="type">class="kw">double deMarkerVal = NormalizeDouble(deMarkerArray[class="num">0],class="num">4);
   class="type">class="kw">double deMarkerPrevVal = NormalizeDouble(deMarkerArray[class="num">1],class="num">4);
   class="type">class="kw">double currentHigh = NormalizeDouble(pArray[class="num">0].high,class="num">6);
   class="type">class="kw">double currentLow = NormalizeDouble(pArray[class="num">0].low,class="num">6);
   class="type">class="kw">double prevHigh = NormalizeDouble(pArray[class="num">1].high,class="num">6);
   class="type">class="kw">double prevLow = NormalizeDouble(pArray[class="num">1].low,class="num">6);
   if(currentHigh>prevHigh && deMarkerVal<deMarkerPrevVal)
     {
      Comment("Bearish divergence","\n",
              "Current High is ",currentHigh,"\n",
              "Prev. High Value is ",prevHigh,"\n",
              "Current DeMarker Value is ",deMarkerVal,"\n",
              "Prev. DeMarker Value is ",deMarkerPrevVal);
     }

◍ 用 DeMarker 抓价格背离的裸写逻辑

在 MT5 里做背离预警,不一定要上图形对象,直接读指标缓冲区和 K 线速率数组就能在图表上打印信号。下面这段把 DeMarker 周期设为 14、取最近 14 根 K 线,是这类脚本最常见的参数组合。 先声明两个序列数组:deMarkerArray 装指标值,pArray 装 OHLC 速率数据,都用 ArraySetAsSeries 倒序排列,保证 [0] 是最新一根。iDeMarker 拿句柄,CopyRates 取 0~13 共 14 根,CopyBuffer 把指标主缓冲填进数组。 价格与指标的背离判定很直白:若 currentHigh 大于 prevHigh 而 deMarkerVal 小于 deMarkerPrevVal,倾向空头背离;若 currentLow 小于 prevLow 而 deMarkerVal 大于 deMarkerPrevVal,倾向多头背离。两者都用 Comment 把关键数值刷在左上角,方便肉眼核对。 外汇与贵金属波动受杠杆和消息面影响大,背离只是概率信号,实盘前请在策略测试器里用历史数据跑一遍,确认误报率你能接受再上真仓。

MQL5 / C++
  class="type">class="kw">double deMarkerArray[];
  class="type">MqlRates pArray[];
  ArraySetAsSeries(deMarkerArray,true);
  ArraySetAsSeries(pArray,true);
  class="type">int deMarkerDef = iDeMarker(_Symbol,_Period,class="num">14);
  class="type">int pData = CopyRates(_Symbol,_Period,class="num">0,class="num">14,pArray);
CopyBuffer(deMarkerDef,class="num">0,class="num">0,class="num">14,deMarkerArray);
  class="type">class="kw">double deMarkerVal = NormalizeDouble(deMarkerArray[class="num">0],class="num">4);
  class="type">class="kw">double deMarkerPrevVal = NormalizeDouble(deMarkerArray[class="num">1],class="num">4);
  class="type">class="kw">double currentHigh = NormalizeDouble(pArray[class="num">0].high,class="num">6);
  class="type">class="kw">double currentLow = NormalizeDouble(pArray[class="num">0].low,class="num">6);
  class="type">class="kw">double prevHigh = NormalizeDouble(pArray[class="num">1].high,class="num">6);
  class="type">class="kw">double prevLow = NormalizeDouble(pArray[class="num">1].low,class="num">6);
  if(currentHigh>prevHigh && deMarkerVal<deMarkerPrevVal)
    {
      Comment("Bearish divergence","\n",
              "Current High is ",currentHigh,"\n",
              "Prev. High Value is ",prevHigh,"\n",
              "Current DeMarker Value is ",deMarkerVal,"\n",
              "Prev. DeMarker Value is ",deMarkerPrevVal);
    }
  if(currentLow<prevLow && deMarkerVal>deMarkerPrevVal)
    {
      Comment("Bullish divergence","\n",
              "Current Low is ",currentLow,"\n",
              "Prev. Low Value is ",prevLow,"\n",
              "Current DeMarker Value is ",deMarkerVal,"\n",
              "Prev. DeMarker Value is ",deMarkerPrevVal);
    }

「把 DeMarker 三套打法接进 MT5 验证」

前面拆过的三套 DeMarker 用法,落到实盘前都得先在 MT5 里跑一遍:强度看当前值与近 5 周期均值的差,超买超卖看 0–1 区间位置,背离比的是当期/前一期指标值和高点位移。附带的四个 mq5 文件(DeMarker_Strength 1.7KB、DeMarker_OB_-_OS 1.25KB、DeMarker_Divergence 1.95KB、Simple_DeMarker_System 0.94KB)直接拖进指标目录就能加载。 外汇和贵金属杠杆高、滑点跳空频繁,任何信号都只是概率倾向,没有哪套逻辑能适配所有人。开 MT5 把历史数据回放一遍,确认信号延迟和你的执行速度匹配,再考虑上模拟盘。 作者给的蓝图只是骨架,参数周期和阈值留给你按品种波动率调。调完别急着真金白银,先记录一百根 K 线内的信号命中比,再决定要不要减仓试。

交给小布盯盘看 DeM 区间
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到 DeMarker 在 0–1 间的实时位置,你专注判断趋势概率而非手动刷新指标。

常见问题

DeMarker 只用最高最低价与前一期比较,不纳入收盘价序列;RSI 基于平均涨跌收盘价。前者对波段极值更敏感,后者平滑度更高,外汇贵金属高风险下建议先回测再定参数。
不必,iDeMarker 已内置调用接口,直接取句柄读缓冲即可;自己实现公式多用于教学理解,实盘优先用终端原生函数减少出错。
目前小布盯盘提供指标位预警与品种页诊断,完整 EA 回测仍需在 MetaEditor 跑历史数据;可把小布看到的偏离区间作为人工过滤条件接入你的系统。
当当期最高不大于前期最高时 DeMax 记 0,对应 DeMin 同理;分母用两段 SMA 之和,避免除零,代码里加个极值判断更稳。