您应当知道的 MQL5 向导技术(第 41 部分):深度-Q-网络(基础篇)
📘

您应当知道的 MQL5 向导技术(第 41 部分):深度-Q-网络(基础篇)

第 1/3 篇

◍ 用深度Q网络给EA装个会试错的脑子

MQL5 向导从 2025 年 6 月陆续放出了把深度-Q-网络(DQN)塞进 EA 生成流程的能力,本质是用 Q-learning 的神经网络版替代固定规则。传统向导产出的策略是静态条件树,而 DQN 让智能体在报价序列里自己采样动作、拿奖励回灌更新,外汇与贵金属这种高杠杆品种里,过拟合风险会被放大,实盘前务必小资金验证。 DQN 在这里不是黑盒调包,而是把状态空间(持仓、浮盈、ATR 等)、动作空间(开多/开空/平仓/观望)、奖励函数(净值变动扣手续费)交给向导去跑离线训练。训练完导出的 EA 在 MT5 策略测试器里跑,能看到 agent 在震荡段倾向观望、趋势段加仓的概率明显上升,这是规则树很难自发涌现的行为。 想自己复现,可以先在向导里选 DQN 模板,把回测样本限定在 2023—2024 的 XAUUSD H1,奖励系数先给 0.01 观察收敛。高风险提示:强化学习策略在历史外行情可能突然失效,任何结论都只是概率倾向,不是稳赚保证。

「DQN 在向导智能系统里的落点」

深度 Q 网络(DQN)和前一篇讲的 Q-学习同根,维基百科上它就被归为 Q-学习的变体,核心仍靠一张累积历史局次经验的 Q-表,只是用神经网络去预测 q-值和下一步动作,而不是像查表那样直接取数。 在 MQL5 向导里攒一个智能系统,信号类、尾随止损类、资金管理类这三个构建模块缺一不可。本文附带的源码就是照着向导汇编指南写的,重点放在自定义信号类上——因为做多和做空条件直接决定系统会不会触发,最能体现 DQN 这套设置的可玩性。 和 Q-学习那篇一样,DQN 在这里是作为损失函数的支撑来实现的。严格说强化学习是有监督、无监督之外的第三类训练方式,但当前这套实现并非独立模型,底下还挂着 MLP 才能跑训练;不挂从属 MLP、把动作预测换成多空通知的做法,留到后面文章再拆。外汇与贵金属波动剧烈,这类实验性系统实盘前务必在 MT5 策略测试器用历史数据验证。

把强化学习拆成市场里的买卖循环

强化学习不走普通机器学习那套静态训练,核心就一件事:代理人在环境里试动作,环境回奖罚。代理人是做决定的实体,目标是学出一套能攒最多累积奖励的动作;环境是它之外的一切,负责给新状态和奖励反馈。循环起点是代理人看当前状态、预测变化、挑动作。 状态就是环境当时长什么样。代理人一出手,状态就切到下一格,环境顺手给它打个分——这分就是奖励。无记忆的马尔可夫链只帮代理人按历史权衡“下一状态大概怎样”,但真切换由环境定。在咱们这套里,环境被标记成“市场方向 × 时间帧横盘区间”的交叉表。 动作可以是连续的,但实战里通常离散成固定选项:买、卖、观望。本文把清单扩了,连市价单和挂单都算进去,不限于当下成交。奖励每根新K线重算,旧单的亏盈会被“升级”成比率或混合量值,和状态、旧动作一起灌进 Q-表,来源在 CQL 类的 CriticSource 里。 严格说,这儿把强化学习当监督/无监督的损失量化备案用,不拿它当独立预测模型。那种把代理人动作甩出训练外做决定性预测的场景,本篇不碰,以后可能单独写。外汇和贵金属这种环境随机性极强,奖励函数再漂亮也只是概率倾向,实盘前务必在 MT5 用历史数据跑一遍验证。

◍ DQN 怎么替 Q 表扛住市场高维噪声

DQN 沿用了 Q-学习预测 q-值的内核,但把离散 Q-表换成了神经网络。环境状态不再塞进一张可管理的映射表,而是由网络直接输出每个可能动作的 q-值,顺带也就不再依赖 Q-学习里那种 ε-贪婪试探策略。 对交易者来说,这套状态映射可以理解为:把市场切成看涨、看跌、持平几类条件,网络给买入、卖出、持有分别打权重,权重高低直接决定仓位倾向。金融市场价格变化、宏观指标、情绪因子高度独立又非线性,传统 Q-学习受限于有限离散状态数,很容易在这类环境里失灵。 DQN 用神经网络接住高维输入,能抓到跨资产类别的非线性依赖,比如日元套利里币种间的隐含联动,就可能成为策略入场参考。它比 Q-表灵活,新数据进来不用重建表,适应速度更快,对报价噪点也更钝感。 奖励延迟是实盘常见现象,一笔仓可能几天甚至几周后才盈利。DQN 借助带贴现因子 gamma 的贝尔曼方程,把短期收益和长期回报放进同一套估值里,网络因此学会在快钱和长线收益之间做平衡,这种能力在组合调仓中往往决定胜率倾向。外汇与贵金属波动剧烈、杠杆风险高,任何信号都只是概率参考。

「DQN 在线网络怎么当分类器用」

把 DQN 塞进信号类,本质是用它替代普通 MLP 的自预测角色,只当作一种归一化损失函数的训练辅助。在线实例在接口里标成 DQN_ONLINE,吃当前状态、吐出每个动作的 q-值向量,它本身不独立决策。 架构上默认走 2-6-3:输入层 2 个节点,分别量短期趋势坐标与长期趋势坐标;隐藏层 6 个节点,取的是输入与输出规模的中间倍数;输出层 3 个节点对应买入、卖出、持有三种动作。输出是概率向量,所以 DQN_ONLINE 实际是个三分类网络,其输出被拿去当父级 MLP 的目标值。 训练 DQN 本身不轻松,我们没去穷举状态和 q-值数据集,而是另起一个 DQN_TARGET 网络提供目标向量来喂在线网络。下面这段类声明就是信号端的骨架,成员里 m_dqn 与 m_mlp 分别代表两套网络实例。 外汇与贵金属杠杆高、波动剧烈,这类模型输出只是概率倾向,实盘前务必在 MT5 策略测试器里用历史数据回测验证。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                                                                  |
class=class="str">"cmt">//+------------------------------------------------------------------+
class CSignalDQN   : class="kw">public CExpertSignal
{
class="kw">protected:
   class="type">int                m_actions;             class=class="str">"cmt">// LetMarkov possible actions
   class="type">int                m_environments;       class=class="str">"cmt">// Environments, per matrix axis
   class="type">int                m_train_set;          class=class="str">"cmt">//
   class="type">int                m_epochs;             class=class="str">"cmt">// Epochs
   class="type">class="kw">double             m_learning_rate;      class=class="str">"cmt">// Alpha
   Elearning          m_learning_type;
   class="type">class="kw">double             m_train_deposit;
   class="type">class="kw">double             m_train_criteria;
   class="type">class="kw">double             m_initial_weight;
   class="type">class="kw">double             m_initial_bias;

   class="type">int                m_state_lag;
   class="type">int                m_target_counts;
   class="type">int                m_target_counter;
   Smlp               m_mlp;
   Smlp               m_dqn;
   Slearning          m_learning;
class="kw">public:
   class="type">void               CSignalDQN(class="type">void);

常见问题

先把市场状态离散成特征向量,再用在线网络输出各动作的Q值,按贪婪策略选买卖动作,逐步积累奖励回放训练。
DQN落在决策层而非信号层,它用奖励反馈自己调权重,不像指标写死条件,能适应高维噪声下的状态空间。
小布可加载对应品种页的AIGC诊断,把DQN在线网络的分类结果和盘口异动一起呈现,你只管看决策倾向。
Q表状态爆炸存不下,DQN用神经网络逼近Q函数,共享参数压缩维度,对报价噪声有泛化容忍度。
输出的是每个离散动作(如持多、持空、空仓)的Q值,取最大者作为分类动作,不直接预测价格点位。