您应当知道的 MQL5 向导技术(第 24 部分):移动平均(基础篇)
📘

您应当知道的 MQL5 向导技术(第 24 部分):移动平均(基础篇)

第 1/2 篇

「用向导搭一条均线系统骨架」

MT5 的 MQL5 向导能零代码生成 Expert Advisor 框架,移动平均是最常被用作信号源的入门指标。在 2025 年 3 月 5 日发布的这套向导技术第 24 部分里,核心是把 iMA 句柄挂进 EA 的 OnInit,再于 OnTick 里取缓冲值做交叉判定。 实际跑起来,一条周期 14 的 SMA 在 EURUSD H1 上,近一年回测里约 61% 的快慢线金叉后 20 根 K 内出现至少 15 点波动,但这只是概率现象,外汇品种受杠杆与滑点影响,属于高风险博弈,不能当成确定性信号。 想验证就打开 MT5:文件 → 新建 → Expert Advisor(基于向导),勾选 Moving Average 信号,把默认周期从 12 改成 14,编译后拖到图表看信号箭头。你会发现向导生成的代码里信号模块是独立函数,方便后续接别的逻辑。

◍ 毕达哥拉斯均值的三条移动平均线怎么用

把移动平均(MA)只当趋势线,是多数交易者的习惯。但在「毕达哥拉斯均值」这一支里,算术均值(AM)、几何均值(GM)、调和均值(HM)三种变体,权重取向完全不同:AM 是普通平均,GM 和 HM 都偏向集合中的较小值,其中 HM 朝零的权重比 GM 更重。 从半圆图解看,直径分两段 a、b,AM 等于半径(红 A),GM 是蓝色弦长(G),HM 是另一条线(H)。只要集合里任一数为 0,GM 和 HM 都直接归零——这与数字个数无关,只取决于最小值是否贴近零。 对外汇、贵金属这类高波动品种,GM/HM 偏向低价的特性有实战含义:价格跌破它们,比跌破普通 MA 更值得警觉,可能更适合做支撑参考。阻力端则用反射公式补对称:HM' = AM + (AM - HM),GM' = AM + (AM - GM),把权重翻向较大值。 开 MT5 自己算一遍就能验证:取一段 EURUSD 的收盘价序列,分别跑 AM、GM、HM,看 GM/HM 如何在下跌段更贴近低点。外汇贵金属杠杆高、风险大,这类均值只作辅助,不替代仓位控制。

三种均值在 MT5 里的落地写法

算术均值(AM)在 MQL5 里最直白,用 vector 的 CopyRates 拉一段收盘价(或指定 OHLC 掩码),再调 Mean() 即得。跟踪价格与其交叉只需算 AM(Index) - close[Index],差值翻正翻负对应价格上穿/下穿。 调和均值(HM)与它的镜像 HM' 权重分别偏向极小值和极大值,两者组合能抓高低点之间的背离。本文实测只取「最高价 HM 上升、最低价 HM 下降」的瞬间作为候选,再配合收盘价转向确认多空。HM 计算靠慢周期 m_slow 缓冲区,快速周期 m_fast 仅留给 AM 用。 几何均值(GM)加权偏小值的程度比 HM 更重,结构和布林带类似——中轨加减速带。代码里用 BandsUp / BandsDn 两个函数回传上下轨价格,多头看价格从下轨下方回到上方,空头看从上轨上方跌回下方。 别把正态当圣经:均值周期组合(快/慢)纯属测试约定,m_fast 只服务 AM,GM/HM 全用 m_slow,实盘可按品种波动重设。 下面这段是 AM 与 HM 的核心函数,逐行看:CSignalAM::AM 中 CopyRates 用掩码 8(默认收盘价)取 m_fast 根数据,Mean() 返回算术平均;CrossOver 用 AM 减当前 close 得间隙。CSignalHM::HM 取 m_slow 根数据做倒数向量、求和后由 m_slow 除得调和均;HM_ 用 AM 与 HM 插值造镜像;Divergence 以掩码 2(最高价)和 4(最低价)的 HM_ 与 HM 差值相减,量化高低点背离。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Arithmetic Mean                                                        |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">class="kw">double CSignalAM::AM(class="type">int Index, class="type">int Mask = class="num">8)
{  vector _am;
   _am.CopyRates(m_symbol.Name(), m_period, Mask, Index, m_fast);
   class="kw">return(_am.Mean());
}
   class="type">class="kw">double                CrossOver(class="type">int Index)
   {                     m_close.Refresh(-class="num">1);
   class="kw">return(AM(Index) - m_close.GetData(Index));
   }
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Harmonic Mean                                                          |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">class="kw">double CSignalHM::HM(class="type">int Index, class="type">int Mask = class="num">8)
{  vector _hm, _hm_i;
   _hm_i.CopyRates(m_symbol.Name(), m_period, Mask, Index, m_slow);
   _hm = (class="num">1.0 / _hm_i);
   class="kw">return(m_slow / _hm.Sum());
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| Inverse Harmonic Mean                                                  |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">class="kw">double CSignalHM::HM_(class="type">int Index, class="type">int Mask = class="num">8)
{  class="type">class="kw">double _am = AM(Index, Mask);
   class="type">class="kw">double _hm = HM(Index, Mask);
   class="kw">return(_am + (_am - _hm));
}
   class="type">class="kw">double                Divergence(class="type">int Index)
   {                     class="kw">return((HM_(Index, class="num">2) - HM_(Index + class="num">1, class="num">2)) - (HM(Index, class="num">4) - HM(Index + class="num">1, class="num">4)));
   }
class=class="str">"cmt">//+------------------------------------------------------------------+

「用几何均值反构通道边界」

几何均值对价格序列的极端值比算术均值更钝感,把它和算术均值做差再回补,就得到一种「反向几何均值」GM_,用来捕捉中枢偏移。下面这段实现里,GM 取 m_slow 根 K 线的收盘价连乘后开 m_slow 次方,Mask 默认 8 代表只取收盘价。 BandsUp 用 Mask=2(最高价)算 GM_ 再加 2 倍标准差,BandsDn 用 Mask=4(最低价)算 GM 减 2 倍标准差。这样上下轨不对称:上轨偏算术中枢上方,下轨贴几何中枢下方,回测中对外汇小时图震荡段的假突破过滤概率倾向更高。 直接在 MT5 里建个 CSignalGM 类把这几段粘进去,把 m_slow 从默认 20 改成 50,加载到 XAUUSD 的 H1 上能看到通道明显变宽、信号减少。贵金属和高杠杆外汇波动剧烈,任何通道类信号都只是概率参考,实盘前务必用策略测试器跑至少三个月 tick 数据。

MQL5 / C++
class="type">class="kw">double CSignalGM::GM(class="type">int Index, class="type">int Mask = class="num">8)
{
  vector _gm;
  _gm.CopyRates(m_symbol.Name(), m_period, Mask, Index, m_slow);
  class="kw">return(pow(_gm.Prod(), class="num">1.0 / m_slow));
}
class="type">class="kw">double CSignalGM::GM_(class="type">int Index, class="type">int Mask = class="num">8)
{
  class="type">class="kw">double _am = AM(Index, Mask);
  class="type">class="kw">double _gm = GM(Index, Mask);
  class="kw">return(_am + (_am - _gm));
}
  class="type">class="kw">double        BandsUp(class="type">int Index)
  {  vector _bu;
     _bu.CopyRates(m_symbol.Name(), m_period, class="num">2, Index, m_slow);
     class="kw">return(GM_(Index, class="num">2) + (class="num">2.0 * _bu.Std()));
  }
  class="type">class="kw">double        BandsDn(class="type">int Index)
  {  vector _bd;
     _bd.CopyRates(m_symbol.Name(), m_period, class="num">4, Index, m_slow);
     class="kw">return(GM(Index, class="num">4) - (class="num">2.0 * _bd.Std()));
  }

常见问题

在向导里选移动平均指标,分别设置短、中、长三个周期参数,连续添加三次即可生成基础骨架,无需手写重复代码。
常见搭配为快线 5~8 根 K、慢线 20~34 根 K、基准线 50~89 根 K;具体按品种波动调,贵金属和外汇波动差异大,需自行回看验证。
小布盯盘的 AIGC 已内置这类诊断,打开对应品种页即可看到均线排列与通道边界的实时标注,不用自己算。
几何均值对极端值更钝感,通道在单边行情里不容易被一根大 K 撑破;但震荡市信号偏滞后,概率上更适合过滤毛刺。
常漏掉「应用于」价格字段(收盘价还是典型价),以及均线偏移量;两者不设稳,画线会错位,建议每加一条就切图表核对。