您应当知道的 MQL5 向导技术(第 36 部分):依据马尔可夫(Markov)链的 Q-学习·综合运用
🧠

您应当知道的 MQL5 向导技术(第 36 部分):依据马尔可夫(Markov)链的 Q-学习·综合运用

(3/3)· 当强化学习不再当信号源,而是钻进损失函数里做从属推手,测试结果会说话

新手友好 第 3/3 篇
把强化学习直接当原生信号发生器,是很多自行组装智能系统的人会踩的坑。本篇换一条路:让 Q-学习配合马尔可夫链,只做多层感知器学习的补充角色,看测试报告里的差异到底意味着什么。

◍ 用两段 K 线差分给 MLP 打标签

这段逻辑出现在训练循环里,核心是把最近两段行情转成三分类监督信号,喂给多层感知机。它先取当前品种、当前周期、从偏移 ii 往前数 8 根里的 2 根 Rate,初始化容器大小固定为 2,若拷贝后 Size 不等于 2 就直接跳过,避免脏数据进网络。 _target 是一个长度为 __MLP_OUTPUTS 的向量,先填 0,再用 _target_data[0] - _in_row[1] 算差分。差小于 0 标 0 类(跌),大于 0 标 2 类(涨),等于 0 标 1 类(平),对应位置置 1.0,其余保持 0,构成 one-hot 目标。 强化学习那几个奖励字段直接复用输入行的极值:ql_reward_float 取最后归一化值,ql_reward_max/min 取整行最大最小。只有当 epoch 跑到末轮 i == m_epochs 且样本到末条 ii == m_train_set 才调一次 MLP.QL.Action(),平时只跑 Backward 更新权重。 最终推理输出按 MLP.output 最大值所在下标映射成 0/1/2。外汇与贵金属波动剧烈,这套标签法只是概率性分类,实盘使用前请在 MT5 策略测试器用历史数据验证错分率。

MQL5 / C++
   {  vector _target, _target_data;
     if
     (
       _target_data.Init(class="num">2) &&
       _target_data.CopyRates(m_symbol.Name(), m_period, class="num">8, ii, class="num">2) &&
       _target_data.Size() == class="num">2
     )
     {  _target.Init(__MLP_OUTPUTS);
        _target.Fill(class="num">0.0);
        class="type">class="kw">double _type = _target_data[class="num">0] - _in_row[class="num">1];
        class="type">int _index = (_type < class="num">0.0 ? class="num">0 : (_type > class="num">0.0 ? class="num">2 : class="num">1));
        _target[_index] = class="num">1.0;
        MLP.Get(_target);
        m_learning.ql_e = _in_e;
        m_learning.ql_reward_float = _in_row[m_scale - class="num">1];
        m_learning.ql_reward_max = _in_row.Max();
        m_learning.ql_reward_min = _in_row.Min();
        if(i == m_epochs && ii == m_train_set)
        {  MLP.QL.Action();
        }
        MLP.Backward(m_learning, i);
     }
   }
   Output = (MLP.output.Max()==MLP.output[class="num">0]?class="num">0:(MLP.output.Max()==MLP.output[class="num">1]?class="num">1:class="num">2));
   }
   }
   }
}

「GBPJPY 日线回测里的马尔可夫权重对照」

我们在 GBPJPY 的 2023 年日线周期上跑了真实即刻报价回测,纯粹验证由向导组装、内嵌该信号类的 EA 能否跑通基本逻辑。测试分两组:一组不给 Q-学习映射值加马尔可夫链权重,另一组加上。 两组都没有做最优参数优化,也没做前向检验,所以曲线本身不代表策略实盘潜力。外汇与贵金属杠杆高、滑点和重定价风险大,这类结果只能当作机制可行性参考,不能直接推导出盈利概率。 引入马尔可夫链只是给 Q-学习映射值换了一种加权路径,回测对比显示加权组在部分段落权益波动更平滑,但样本只有一年日线,结论倾向“值得扩样本再测”,而非确认有效。

从 Q-学习起步的后续空间

把强化学习塞进 MQL5 向导,本质是用 Q-学习算法驱动分类器 MLP 的训练导向,而不是让它直接当信号发生器。我们在两个场景里跑了智能系统测试:一组不用马尔可夫链,一组把转移概率矩阵作为训练权重,后者的训练过程在权重约束上明显更可控。 这套玩法比前几篇复杂,根源在于自定义信号引入了 2 个类,且大量敏感输入参数都挂着默认值没动过。附带的 wz_36.mq5(7.34 KB)和 SignalWZ_36.mqh(13.05 KB)可以直接丢进 MT5 Backtest 里比对两种场景的权益曲线。 这只是一个开头,强化学习这块摊子很大,后面回头再拆的时候,优先调的是隐藏层默认参数和马尔可夫链的窗口长度,那两块不动,复现结果会偏随机。

把环境状态映射交给小布
9 维市场状态空间(短长期涨跌盘组合)的实时归类与 Q-映射更新,这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到,你只管判断 MLP 输出是否可信。

常见问题

局次是强化学习的一轮训练评估单元,在 MQL5 向导信号类里可绑定为一次完整建仓到平仓的闭环,用奖励量化该轮环境表现,概率上改进而非保证下一轮选择。
小布盯盘目前内置的是状态空间诊断与可视化,自定义信号类需你在 MT5 向导里编译挂载;把重复劳动交给小布,你专注决策。
MLP 仍承担大部分预测,强化学习借评论者奖励与环境状态在监督与无监督间做行进选择,马尔可夫链补充解释测试差异,外汇贵金属高风险,从属设计更稳。
可能倾向市场陷入低波动收敛,Q-映射在该状态动作概率集中,但样本不足时结论仅作概率参考,不构成方向判定。