您应当知道的 MQL5 向导技术(第 26 部分):移动平均和赫斯特(Hurst)指数·综合运用
📘

您应当知道的 MQL5 向导技术(第 26 部分):移动平均和赫斯特(Hurst)指数·综合运用

第 3/3 篇

直接用相关系数替代赫斯特指数

赫斯特指数常被拿来当自相关代理指标,用来判断序列是倾向持久(>0.5)还是反持久(<0.5)。但绕开指数、直接算价格序列的相关性,再拿真实相关结果去切行情状态,EA 的逻辑反而能更轻。 我们写了一个 CSignalAC 信号类,函数比赫斯特版本少一截:先在慢周期里看有没有正相关性。若有,就按慢周期均线做趋势跟随——价在均线上看涨、下看跌;若慢周期没有正相关,就到快周期找负相关,转做均值回归——价在快速均线下看涨、上看跌。 同一组 GBPCHF、2023 年 H4 数据跑下来,最佳运行和赫斯特指数信号比,性能出现明显断层式差异。外汇与贵金属杠杆高,这类回测优势只代表历史样本,实盘可能失效。 代码里 LongCondition 先拷慢周期两段 rates 算 CorrCoef,超阈值就比 Bid 与慢均线;不满足就切快周期找负相关,价低于快均线才投多头票。ShortCondition 镜像处理。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| "Voting" that price will grow.                                               |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">int CSignalAC::LongCondition(class="type">void)
{  class="type">int result = class="num">0;
   vector _new,_old;
   if(_new.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_slow_period) && _old.CopyRates(m_symbol.Name(), m_period, class="num">8, m_slow_period, m_slow_period))
   {  vector _ma;
      if(_new.CorrCoef(_old) >= m_threshold)
      {  if(_ma.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_slow_period))
         {  if(m_symbol.Bid() > _ma.Mean())
            {  result = class="type">int(round(class="num">100.0 * ((m_symbol.Bid() - _ma.Mean())/(fabs(m_symbol.Bid() - _ma.Mean()) + fabs(_ma.Max()-_ma.Min())))));
            }
         }
      }
      else if(_new.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_fast_period) && _old.CopyRates(m_symbol.Name(), m_period, class="num">8, m_fast_period, m_fast_period))
      {  if(_new.CorrCoef(_old) <= -m_threshold)
         {  if(_ma.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_fast_period))
            {  if(m_symbol.Bid() < _ma.Mean())
               {  result = class="type">int(round(class="num">100.0 * ((_ma.Mean() - m_symbol.Bid())/(fabs(m_symbol.Bid() - _ma.Mean()) + fabs(_ma.Max()-_ma.Min())))));
               }
            }
         }
      }
   }
   class="kw">return(result);
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| "Voting" that price will fall.                                               |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">int CSignalAC::ShortCondition(class="type">void)
{  class="type">int result = class="num">0;
   vector _new,_old;
   if(_new.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_slow_period) && _old.CopyRates(m_symbol.Name(), m_period, class="num">8, m_slow_period, m_slow_period))
   {  vector _ma;
      if(_new.CorrCoef(_old) >= m_threshold)
      {  if(_ma.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_slow_period))
         {  if(m_symbol.Bid() < _ma.Mean())

「背离阈值触发后的方向打分」

当快慢两段收益率序列的相关系数跌破负阈值(代码中为 -m_threshold),说明近期价格节奏出现反向切换,此时才进入打分逻辑,而不是每根 K 线都算。 若新段与旧段相关系数 ≤ -m_threshold 且均线可正常复制,系统比较当前 Bid 与均线均值:Bid 在均线上方则给正分,下方则给负分,分数绝对值由偏离度占「偏离+区间跨度」的比例决定。

具体缩放用 round(100.0 * 偏离 / (偏离+区间最大-最小)),把结果限制在约 -100~100 的整数。外汇与贵金属波动剧烈,该分值仅反映统计偏离,不预示单边行情,实盘须自担高风险。

下面这段是原文里两个分支的合并写法,左支对应 Bid 低于均线、右支对应高于均线,可直接贴进 MT5 自定义指标验算。

MQL5 / C++
    {  result = class="type">int(round(class="num">100.0 * ((_ma.Mean() - m_symbol.Bid())/(fabs(m_symbol.Bid() - _ma.Mean()) + fabs(_ma.Max()-_ma.Min())))));
     }
    }
   }
   else if(_new.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_fast_period) && _old.CopyRates(m_symbol.Name(), m_period, class="num">8, m_fast_period, m_fast_period))
   {  if(_new.CorrCoef(_old) <= -m_threshold)
     {  if(_ma.CopyRates(m_symbol.Name(), m_period, class="num">8, class="num">0, m_fast_period))
       {  if(m_symbol.Bid() > _ma.Mean())
         {  result = class="type">int(round(class="num">100.0 * ((m_symbol.Bid() - _ma.Mean())/(fabs(m_symbol.Bid() - _ma.Mean()) + fabs(_ma.Max()-_ma.Min())))));
         }
       }
     }
   }
  }
  class="kw">return(result);
}

◍ 赫斯特指数实战落地的几个坑

把赫斯特指数和移动平均线绑在一起,本意是区分趋势与均值回归并生成自定义信号。第一次测试里它确实显出潜力,但相对原生自相关信号,计算开销大、交易被过度抑制,最佳运行的回撤也偏重,而测试窗口本身还很小,这点不能忽视。 有读者用 Forex.com 实盘报价跑附带的 hurst_ctrl.mq5,结果亏了 3108 美元,而原文作者报告收益 89 145 美元。差异主要来自策略测试器输入:作者用限价单入场、不设止损只挂获利目标,这种配置在真实外汇环境里下行风险很高,贵金属和外汇本身杠杆波动大,照搬容易吃大亏。 代码包里 SignalWZ_26.mqh 与 hurst.mq5 可直接在 MT5 编译,但默认参数未必复现文章曲线。建议拉经纪商真实 Tick 数据、跨数年回测,并自己加止损或最长持仓限制再判断。 想验证就开 MT5 把 hurst.mq5 跑一遍,把入场和退场参数改务实一点,看看小样本外窗口里它是否还只是概率上倾向有效。

常见问题

相关系数只测线性同步,赫斯特测长记忆性;替代会漏掉分形特征,建议仅作初筛,实盘仍用赫斯特指数确认。
按价格与均线偏离度、回归速度、波动率三因子各赋权重加总,得分大于阈值倾向反向修正,小于则观望。
小布可在对应品种页直接输出赫斯特指数与背离提示,省去手动跑代码,你只需复核方向打分结果。
周期选太短噪声大、样本不足致指数失真、把大于0.5直接当趋势单做;建议用日线以上且样本超200根。
赫斯特过滤了均值回归假突破,只在指数显趋势态时跟均线,震荡市空仓,回测中无效信号减少约三成。