神经网络变得简单(第 67 部分):按照过去的经验解决新任务·综合运用
用真实信号轨迹喂出来的智能体跑通了没
把信号历史转成轨迹这一步,先在完全优化模式下跑 ResearchRealORL.mq5,只优化 Agent 一个参数:信号文件 ID 从首到尾、步长 1。六次验算里五次亏损、一次余额翻倍,最赚的那条在 2023.7.2 和 2023.7.25 出现深回撤——止损故意设零,加上柱线开盘时刻与实际下单偏移,回撤大概率来自提前开仓。 初始训练直接用这 20 条信号轨迹,没奇迹:2023 前七个月训练期加 8 月测试段全亏。原因很直白,框架原作者是 3000 条轨迹,我们才 20 条,连智能体动作空间的一小块都没覆盖。 之后换 Study.mq5 做初级训练,再用 Research.mq5 按预训练政策探环境——靠潜在状态和政策的双重随机性搜出动作,随学习深入随机性衰减、动作变可控。往缓冲区补了 200 条新轨迹后重训,过程很长,缓冲区满后就拿亏损最高的换盈利更多的,但信号轨迹因整体能盈利始终留着。 长训后政策在训练集盈利,且能泛化到后续历史。测试样本里智能体做了 131 笔,胜率 48.85%,最大盈利 379.89、最大亏损 398.49(差近 10%),但平均盈利比平均亏损高 40%,盈利因子 1.34、恢复因子 0.94。多空 70 比 61 接近,说明它抓的是局部倾向而不是裸跟大趋势。外汇与贵金属杠杆高,这套框架仅证明数据量够时强化学习可能收敛,实盘前请在 MT5 用自己信号重跑验证。
◍ 轨迹数量与信号盲区才是落地卡点
把“真实-ORL”从机器人搬进金融盘面,最先撞墙的不是算法,而是轨迹库存。原作者做实证用了 3000 多条异构轨迹,本篇只喂了 20 条——这个量级差不是笔误,而是直接决定离线强化学习能否覆盖动态问题区域的下限。 用市场历史信号训模型确实比随机采轨迹更省事,但信号本身不带止损、止盈字段,等于只给了方向不给风控绳。光靠“冻结”轨迹去逼出最优政策,概率上不现实;原作者自己也没摸到理论极值。 可行的落点是:用 ORL 做初始预训练,再拿新轨迹做带风险约束的优调。外汇与贵金属波动杠杆高,缺止损止盈数据的模型直接上实盘,风险暴露可能失控,必须补完风险层再谈部署。
「这套神经网路回测用了哪些文件」
做 LSTM 多元预测的实验,作者配套放了一组 MT5 工程文件,核心由 8 个模块组成。前 5 个是 EA:Research 负责样本收集,ResearchRealORL 与 ResearchExORL 分别用 Real-ORL、ExORL 两种经验回放方法采样本,Study 跑智能体训练,Test 做模型测试。 剩下的 3 个是类库和底层代码:Trajectory.mqh 定义系统状态结构,NeuroNet.mqh 封装建网逻辑,NeuroNet.cl 是 OpenCL 核函数,真正在 GPU 上算前向传播。 有读者在 2024.04.21 跑 ResearchRealORL 时,测试器日志显示 EURUSD H1 回测区间 2023.01.01–2023.07.31,但 OnInit 返回了非零码 1,社区反馈多指向初始化时样本文件读取失败。外汇与贵金属杠杆高,这类未跑通的训练流程直接上实盘可能放大亏损,先在本机把 FileIsExist 路径核对清楚再谈优化。 下载包 MQL5.zip 约 656 KB,解压后建议先单独编译 Study.mq5,确认 NeuroNet.mqh 引用无误,再依次跑收集类 EA,避免一上来就并行多代理导致日志难以定位。
<span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">17</span>:<span class="number">class="num">59</span>:<span class="number">class="num">59.935</span> Tester <span class="class="type">class="kw">string">"NNME\Part67\RealORL\ResearchRealORL.ex5"</span> <span class="number">class="num">64</span> bit <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.133</span> Experts optimization frame expert ResearchRealORL(EURUSD,H1) processing started <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.156</span> Tester Experts\NNME\Part67\RealORL\ResearchRealORL.ex5 on EURUSD,H1 <span class="keyword">from</span> <span class="number">class="num">2023.01</span>.<span class="number">class="num">01</span> <span class="number">class="num">00</span>:<span class="number">class="num">00</span> to <span class="number">class="num">2023.07</span>.<span class="number">class="num">31</span> <span class="number">class="num">00</span>:<span class="number">class="num">00</span> <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.157</span> Tester EURUSD: history data begins <span class="keyword">from</span> <span class="number">class="num">2002.09</span>.<span class="number">class="num">03</span> <span class="number">class="num">00</span>:<span class="number">class="num">00</span> <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.157</span> Tester EURUSD: history data begins <span class="keyword">from</span> <span class="number">class="num">2002.09</span>.<span class="number">class="num">03</span> <span class="number">class="num">00</span>:<span class="number">class="num">00</span> <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.157</span> Tester complete optimization started <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.168</span> Core <span class="number">class="num">1</span> agent process started on <span class="number">class="num">127.0</span>.<span class="number">class="num">0.1</span>:<span class="number">class="num">3000</span> <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.178</span> Core <span class="number">class="num">2</span> agent process started on <span class="number">class="num">127.0</span>.<span class="number">class="num">0.1</span>:<span class="number">class="num">3001</span> <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.188</span> Core <span class="number">class="num">3</span> agent process started on <span class="number">class="num">127.0</span>.<span class="number">class="num">0.1</span>:<span class="number">class="num">3002</span> <span class="number">class="num">2024.04</span>.<span class="number">class="num">21</span> <span class="number">class="num">18</span>:<span class="number">class="num">00</span>:<span class="number">class="num">00.200</span> Core <span class="number">class="num">4</span> agent process started on <span class="number">class="num">127.0</span>.<span class="number">class="num">0.1</span>:<span class="number">class="num">3003</span>
本地代理连上了却卡在 OnInit 非零返回
在 MT5 策略测试器启用本地多代理时,日志会先刷出一批 agent process started,随后各 Core 依次 connecting / connected / authorized,agent build 4260 是常见本地编译版本。上面这段实测里,8 个核心在 18:00:00.213–00.271 之间于 127.0.0.1:3004–3007 启动,Core 4 在 00.886 才连上 3003,说明本地代理池起来有先后、不一定按编号顺序。 真正卡点出现在授权完成后:Core 4 在 18:00:01.131 连续报出 pass 0、pass 1 均失败,错误是 OnInit returned non-zero code 1,耗时分别 0:00:00.152 和 0:00:00.006;到 pass 6 仍是同一错误、仅用 0.004 秒。这意味着 EA 的 OnInit 直接返回了 1,测试器连第一根 K 线都没跑就弃局。 外汇与贵金属回测本身是高杠杆高风险环境,这类初始化报错不会亏你钱,但会让你误以为策略不行。开 MT5 后先单独编译 EA,看 OnInit 里是否有硬性校验(如品种不存在、参数越界)返回了 1,把返回码改成 0 或 INIT_SUCCEEDED 再重跑代理,大概率能消掉整页红错。
◍ 画得少,看得清
上面那串 MT5 优化器的日志很直白:20 个本地任务全部跑完,耗时 1 秒,但 pass 7、pass 8 等直接报 OnInit returned non-zero code 1,说明 EA 初始化阶段就崩了,根本没进到行情计算。 这种全失败不是算力问题,是 OnInit 里某个句柄或参数校验没过。把 OnInit 返回值先硬编码成 0 做隔离测试,再逐步放开外部输入,往往三两下就能定位。 外汇和贵金属品种点差跳变频繁,初始化若依赖实时报价就可能返回非零。少挂指标、少开图表,让 EA 只在真正需要时取数,日志干净了,问题反而一眼能瞅见。