交易中的神经网络:统一轨迹生成模型(UniTraj)·综合运用
(3/3)·从蒙版轨迹到双向时态编码,一篇看清 UniTraj 怎么在 MT5 里跑通预测与补全
「训练循环里的异常断点与进度回传」
这段自编码训练循环里,最容易被忽略的是两处硬中断:只要状态数组写入失败或反向传播返回 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 会只跑一次就自毁。
{
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 设备调用失败。