交易中的神经网络:统一轨迹生成模型(UniTraj)·综合运用
🛰️

交易中的神经网络:统一轨迹生成模型(UniTraj)·综合运用

(3/3)·从蒙版轨迹到双向时态编码,一篇看清 UniTraj 怎么在 MT5 里跑通预测与补全

偏理论 第 3/3 篇
不少交易者把轨迹预测当成单向外推,忽略了缺失数据恢复和反向依赖,结果模型在实盘里一遇断点就失准。把前向和后向时空关系拆开处理的框架,很难解释清楚价格为什么在某个区间反复折返。

「训练循环里的异常断点与进度回传」

这段自编码训练循环里,最容易被忽略的是两处硬中断:只要状态数组写入失败或反向传播返回 false,就立刻置 Stop=true 并 break,跳出内层 batch 循环。这种写法意味着单样本污染会直接终止整轮迭代,而非跳过该样本,实盘加载前应当确认 bState.AddArray 与 Encoder.backProp 的失败阈值是否合理。 [CODE] { PrintFormat("%s -> %d", __FUNCTION__, __LINE__); Stop = true; break; } } //--- Collect target data if(!bState.AddArray(Result)) continue; if(!Encoder.backProp((CBufferFloat*)GetPointer(bState), (CBufferFloat*)NULL)) { PrintFormat("%s -> %d", __FUNCTION__, __LINE__); Stop = true; break; } //--- if(GetTickCount() - ticks > 500) { double percent = double(iter + b) * 100.0 / (Iterations); string str = StringFormat("%-14s %6.2f%% -> Error %15.8f\n", "Encoder", percent, Encoder.getRecentAverageError()); Comment(str); ticks = GetTickCount(); } } } Comment(""); //--- PrintFormat("%s -> %d -> %-15s %10.7f", __FUNCTION__, __LINE__, "Encoder", Encoder.getRecentAverageError()); ExpertRemove(); //--- } [/CODE] 进度显示逻辑卡在 GetTickCount()-ticks>500 这个 500 毫秒门槛:每过半秒才用 Comment 刷一次 Encoder 的平均误差(getRecentAverageError,精度 15.8f)。若你在 MT5 策略测试器里跑,把 500 调小到 100 可能更跟手,但会多吃 CPU;外汇与贵金属品种波动大,这类自编码误差仅反映样本内拟合度,外推预测能力可能随品种 regime 切换而衰减,属高风险验证。 循环结束后的 PrintFormat 把最终 Encoder 误差打到日志,紧接 ExpertRemove() 卸载 EA——说明该段本质是离线训练脚本,不是常驻信号发生器。复制代码后搜一下 ExpertRemove,确认没有在 OnTick 里误用,否则 EA 会只跑一次就自毁。

MQL5 / C++
      {
      PrintFormat("%s -> %d", __FUNCTION__, __LINE__);
      Stop = true;
      break;
      }
     }
    class=class="str">"cmt">//--- Collect target data
    if(!bState.AddArray(Result))
      class="kw">continue;
    if(!Encoder.backProp((CBufferFloat*)GetPointer(bState), (CBufferFloat*)NULL))
      {
      PrintFormat("%s -> %d", __FUNCTION__, __LINE__);
      Stop = true;
      break;
      }
    class=class="str">"cmt">//---
    if(GetTickCount() - ticks > class="num">500)
      {
      class="type">class="kw">double percent = class="type">class="kw">double(iter + b) * class="num">100.0 / (Iterations);
      class="type">class="kw">string str = StringFormat("%-14s %class="num">6.2f%% -> Error %class="num">15.8f\n", "Encoder",
percent, Encoder.getRecentAverageError());
      Comment(str);
      ticks = GetTickCount();
      }
     }
   }
  Comment("");
class=class="str">"cmt">//---
  PrintFormat("%s -> %d -> %-15s %class="num">10.7f", __FUNCTION__, __LINE__, "Encoder", Encoder.getRecentAverageError());
  ExpertRemove();
class=class="str">"cmt">//---
  }

用 EURUSD 实盘历史验证 UniTraj 训练成效

训练阶段沿用了此前收集的数据集结构,仅改了编码器架构与训练流程,因此无需重新采集样本。我们取 EURUSD 整个 2023 年 H1 真实历史,指标全用默认值,先把环境状态编码器训到性能达标——模型不算轻量,耗时偏长,但过程平稳,输出的预测轨迹和重建轨迹都明显平滑,说明原始噪声被压下去了。 第二阶段迭代训参与者和评论者,目标是基于编码器给出的预测与重建走势,找出能盈利的策略。测试切到 2024 年 1 月、其余参数不动,跑下来参与者模型盈利超 40%,最大回撤略高于 24%。 具体账面上:EA 共做 65 笔交易,33 笔盈利,盈利因子 1.51,因为最大和平均盈利额都盖过了对应亏损额。外汇与贵金属属高风险品种,一个月、65 笔的样本量远不足以断言长期稳定,但这组数已优于 Traj-LLM 的同条件表现,值得开 MT5 用同年数据复跑一遍核对。

◍ 统一轨迹编码在 MT5 里的落地余味

把 UniTraj 的蒙版输入逻辑搬进 MQL5 环境状态编码器后,我们在真实历史报价上跑通了训练与测试闭环,模型对多任务轨迹的适配明显优于传统单任务写法。这套统一处理思路没有绑定某个具体品种,外汇与贵金属的高杠杆特性下,回测有效只代表概率倾向,实盘仍需防极端滑点。 如果你手上有 EURUSD 的 M1 历史,直接复用实践章的编码器结构,把蒙版比例从 0.3 调到 0.5,能更快看出轨迹补全偏差是否收敛。

「随包附带的八个程序文件」

这篇 LSTM 优化实操里,作者把整套流程拆成了 8 个可直接载入 MT5 的文件,EA 与类库分工明确。 样本收集由 Research.mq5 与 ResearchRealORL.mq5 两个 EA 负责,前者跑基础采样,后者用 Real ORL 方法补样本;Study.mq5 训模型,StudyEncoder.mq5 单独训编码器,Test.mq5 做泛化测试。 算法底层不写在 EA 里:Trajectory.mqh 定义系统状态结构,NeuroNet.mqh 封装建网类,NeuroNet.cl 是 OpenCL 核,丢给显卡跑。 MQL5.zip 体积 1667.85 KB,解压后上述文件齐全,外汇与贵金属行情高波动,拿去回测前先确认终端版本匹配,避免 OpenCL 设备调用失败。

交给小布盯盘看多体轨迹
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到基于不完整报价生成的轨迹补全提示,你只需判断概率倾向。

常见问题

矩阵 M 维度为 [N,T],元素为 1 表示个体在该时间步状态已知,0 表示缺失;可见区域取 X⊙M,缺失区域取 X⊙(1−M),模型以可见段为约束生成缺失段。
BTS 在全面扫描轨迹的同时保留序列内时态关系,避免双向编码时把前后依赖压平,从而更稳地捕捉长期多个体走势。
可以,小布已内置基于不完整报价的轨迹补全与可见性标记,无需自己写 Mamba 编码器,打开品种页就能看到倾向性提示。
它们往往只建前向依赖、忽视后向时空约束,且条件计算偏重重造过去而非生成未来,实际适用性因此受限。