从头开始采用 MQL 语言进行深度神经网络编程·综合运用
🧠

从头开始采用 MQL 语言进行深度神经网络编程·综合运用

(3/3)· 前两层铺垫了理论与单元,本篇把 DNN 真正跑进 MT5 策略优化器里

实战向 第 3/3 篇
很多人卡在把教科书里的神经网络搬到 MQL5 就放弃,以为只要写出前向传播就够了。其实从单层神经元到能被策略测试器调用的深度网络,中间差的是一整套训练与优化闭环。本篇顺着前两步,直接把模型塞进 MetaTrader 5 的实战流程。

神经网输出怎么驱动开平仓

这段逻辑把神经网络的三类输出直接映射成 MT5 下单动作:索引 0 对应多、索引 1 对应空、索引 2 对应清仓,阈值统一卡在 0.6。也就是说,只有某类神经元输出概率突破 60%,才允许对应操作触发,避免噪声信号频繁刷单。 多头分支里先查当前是否已有持仓,若持空则直接 return 不反向开多,防止在对冲逻辑外叠加新仓;空头分支则相反,持多就平多再开空,持空则不动。最后一类输出大于 0.6 时无条件平掉该符号所有仓位,相当于模型判了「离场」。 外汇与贵金属杠杆高,这类基于概率阈值的自动平仓若遇滑点,实际成交价可能偏离信号价数个点,建议在策略测试器里把点差设成实时均值再跑一遍。

MQL5 / C++
m_Trade.Buy(lot_size,my_symbol);class=class="str">"cmt">//open a Long position
   }
class=class="str">"cmt">//--- if the output value of the neuron is mare than class="num">60%
   if(yValues[class="num">1]>class="num">0.6)
    {
     if(m_Position.Select(my_symbol))class=class="str">"cmt">//check if there is an open position
      {
       if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);class=class="str">"cmt">//Close the opposite position if exists
       if(m_Position.PositionType()==POSITION_TYPE_SELL) class="kw">return;
      }
     m_Trade.Sell(lot_size,my_symbol);class=class="str">"cmt">//open a Short position
    }
   if(yValues[class="num">2]>class="num">0.6)
    {
     m_Trade.PositionClose(my_symbol);class=class="str">"cmt">//close any position
    }

「把权重训练交给 MT5 优化器」

前面实现的前馈机制只是把数值往前推,并没有任何反向修正能力,模型权重处于未训练状态。真正让网络学会识别价格行为的,是 MetaTrader 5 的策略测试器——它用暴力枚举的方式替你把参数跑出来。 输入层和隐藏层的权重、偏置值,都可以放在 -1 到 1 的区间里让优化器搜索。步长可选 0.1、0.01 或 0.001:步长越大跑得越快但精度粗,步长越小网格越密但计算量指数上升。外汇与贵金属杠杆品种波动剧烈,这种网格搜索不保证样本外稳定,仅代表历史窗口内的拟合倾向。 实测中采用 0.001 作为步长是可行方案,能在不过度粗化的情况下压住组合数。一旦在 MT5 里拿到一套优化后的权重数值,直接抄进 MT4 的对应数组即可,无需重新训练。

◍ H4 上只跑开盘价的回测结果

把回测触发条件锁在“仅开盘价”是有道理的:策略读的是最后一根已收盘蜡烛,若在每一次即时报价(tick)上都重算,既浪费资源也引入噪声。换句话说,等 K 线收完再动,比盯着报价跳动更干净。 我在 H4 周期跑了一次优化,回测区间覆盖去年整年。结果显示该设定下信号只在每根 H4 棒线开盘时刷新一次,避免了盘内重复触发。 具体盈亏曲线与参数组合依赖你本地 MT5 的“仅开盘价”模式重跑;建议直接打开策略测试器,时间帧切 H4、模型选 Open prices only,用去年数据复验,看看和你手上的品种会不会有偏离。外汇与贵金属杠杆高,回测顺不代表实盘稳,参数过拟合风险得自己扛。

两层网络之外的现实落差

文献里有个共识:两个隐藏层足以覆盖绝大多数实际工程问题,再堆层数往往只是增加调参成本。前面给出的深度网络在初步回测里,预测精度高于常见货币市场基准模型,但那只是特定样本期内的现象。 评论区里 Ivan Butko 贴过一组实跑记录:用 2021 年数据训练,2022 年 11 月前 EURUSD 能维持正数;可若用 2020 年训练,2021 年第一个月就全盘失效,切到其他货币对表现接近随机。这说明深度模型的外推能力高度依赖行情结构复现,外汇和贵金属属高风险品种,样本外失效是常态而非意外。 所以别把那句「精度明显高于基准」当成可复用的盈利承诺。开 MT5 把附带的 DemoEADNN.mq5 跑一遍,用 2020 训、2021 测,自己看 equity 从哪个月开始崩,比任何结论都直观。

让小布替你盯训练曲线
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到回测与权重收敛状态,把重复劳动交给小布,你专注决策。

常见问题

隐藏层常用 Tan-h 做非线性变换,输出层用 Softmax 把三态分类压成概率分布,便于解读买入卖出持有信号。
可以,小布盯盘的 AIGC 模块能直接呈现品种页的回测概要与异常权重提示,减少手动翻日志的时间。
MT5 优化器并行评估参数组合,能绕开手动实现反向传播的坑,倾向更快摸到可用权重区间,但外汇贵金属仍属高风险。
可减小隐藏层宽度或加入简单正则,样本外表现可能更稳,但概率上无法保证实盘与回测一致。