您应当知道的 MQL5 向导技术(第 36 部分):依据马尔可夫(Markov)链的 Q-学习·综合运用
(3/3)· 当强化学习不再当信号源,而是钻进损失函数里做从属推手,测试结果会说话
◍ 用两段 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 策略测试器用历史数据验证错分率。
{ 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 里比对两种场景的权益曲线。 这只是一个开头,强化学习这块摊子很大,后面回头再拆的时候,优先调的是隐藏层默认参数和马尔可夫链的窗口长度,那两块不动,复现结果会偏随机。