您应当知道的 MQL5 向导技术(第 26 部分):移动平均和赫斯特(Hurst)指数·综合运用
直接用相关系数替代赫斯特指数
赫斯特指数常被拿来当自相关代理指标,用来判断序列是倾向持久(>0.5)还是反持久(<0.5)。但绕开指数、直接算价格序列的相关性,再拿真实相关结果去切行情状态,EA 的逻辑反而能更轻。 我们写了一个 CSignalAC 信号类,函数比赫斯特版本少一截:先在慢周期里看有没有正相关性。若有,就按慢周期均线做趋势跟随——价在均线上看涨、下看跌;若慢周期没有正相关,就到快周期找负相关,转做均值回归——价在快速均线下看涨、上看跌。 同一组 GBPCHF、2023 年 H4 数据跑下来,最佳运行和赫斯特指数信号比,性能出现明显断层式差异。外汇与贵金属杠杆高,这类回测优势只代表历史样本,实盘可能失效。 代码里 LongCondition 先拷慢周期两段 rates 算 CorrCoef,超阈值就比 Bid 与慢均线;不满足就切快周期找负相关,价低于快均线才投多头票。ShortCondition 镜像处理。
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 自定义指标验算。
{ 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 跑一遍,把入场和退场参数改务实一点,看看小样本外窗口里它是否还只是概率上倾向有效。