您应当知道的 MQL5 向导技术(第 64 部分):运用 DeMarker 和包络通道形态,搭配白噪内核·综合运用
(3/3)· 前两层铺垫完指标与内核,这篇用 Python 把信号接进 RNN 并实盘回测收口
「带白噪声注入的 RNN 回归模块」
这套网络把特征 0、1、5、6、7、8 的二维矢量输出喂给一个 PyTorch RNN,专门做单值回归——每条输入序列只吐一个标量。和普通 RNN 不同,它在隐藏状态里注入了可学习的白噪声,用来在训练时模拟随机过程、压住过拟合倾向。 初始化时三个参数最影响落地:input_size 取特征维度(这里全是 2 维,所以填 2),hidden_size 默认 64 控制容量,num_layers 设 1 基本够用,堆层数容易撞上梯度消失。noise_std 默认 0.05 是噪声强度超参,想更稳就调小,想逼模型适应乱序就调大。 前向过程里有个细节容易踩坑:如果 x 只有两维 (batch, features),先 unsqueeze(1) 补出序列维,否则 RNN 直接报错。之后 rnn_out 拿到全部时间步隐态,噪声要么实时 randn_like 生成、要么用预计算张量,再通过 noise_proj 线性层投到隐态空间,用 sigmoid(rnn_out) 在 0~1 间调制后再加进去——这一步让噪声幅度可被训练调整,不是死噪声。 最后取最后一个时间步的隐态过 fc 层映射到单输出。外汇与贵金属行情高波动、高风险,这套机制只是提升模型鲁棒性的一种尝试,实盘前务必用 MT5 导出的特征在本地跑通回测再谈信任。
class WhiteNoiseRNN(nn.Module): def __init__(self, input_size=class="num">5, hidden_size=class="num">64, num_layers=class="num">1): super().__init__() self.hidden_size = hidden_size self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True) self.noise_proj = nn.Linear(hidden_size, hidden_size) # Projects noise to hidden space self.fc = nn.Linear(hidden_size, class="num">1) # Single output for regression def forward(self, x, noise_std=class="num">0.05): """ Args: x: Input tensor of shape(batch_size, seq_len, input_size) noise_std: Either: - class="type">class="kw">float: Standard deviation for generated noise - tensor: Pre-computed noise(must match rnn_out shape: batch_size × seq_len × hidden_size) """ # Ensure proper input dimensions if x.dim() == class="num">2: x = x.unsqueeze(class="num">1) # (batch, features) → (batch, class="num">1, features) # RNN processing rnn_out, _ = self.rnn(x) # (batch_size, seq_len, hidden_size) # Noise injection if isinstance(noise_std, torch.Tensor): noise_std = noise_std.class="type">class="kw">float() if noise_std.dim() == class="num">1: noise_std = noise_std.view(-class="num">1, class="num">1, class="num">1) # (batch,) → (batch, class="num">1, class="num">1) noise = noise_std.expand_as(rnn_out) elif noise_std > class="num">0: noise = torch.randn_like(rnn_out) * noise_std else:
把噪声注入 RNN 输出的实现细节
这段代码展示了一个 PyTorch 模型里把外部噪声叠加到 RNN 隐藏态输出的写法,核心在噪声张量的判断与投影。 当传入的 noise 是 torch.Tensor 时,先通过 self.noise_proj 做线性投影得到 projected_noise,维度和 rnn_out 对齐;随后用 torch.sigmoid(rnn_out) 作为门控,把 projected_noise 按元素乘加进去,让噪声强度随隐藏态大小自适应。 最后一行 return self.fc(rnn_out[:, -1, :]) 只取序列最后一个时间步的隐藏向量送全连接层,输出形状为 (batch_size,),对应单值回归或二分类 logit。在 MT5 侧若想复刻这套逻辑,可用 ONNX 导出的 PyTorch 模型由 Python 桥接调用,外汇与贵金属波动下这种噪声注入可能提升泛化但也可能放大过拟合风险,建议用历史数据做 walk-forward 验证。
noise = class="num">0 if isinstance(noise, torch.Tensor): projected_noise = self.noise_proj(noise) rnn_out = rnn_out + torch.sigmoid(rnn_out) * projected_noise class="kw">return self.fc(rnn_out[:, -class="num">1, :]) # (batch_size,)
◍ GBPUSD 上六个形态的前向漫游实测
我们把网络定义里的六个形态(编号 0、1、5、6、7、8)在 GBPUSD 上跑前向漫游测试。训练用 Python 在 2023 年 H4 周期完成,输出做多或做空指导;之后把 ONNX 模型塞进 MT5,由向导生成的 EA 用加权多空条件再对 2023 年度的参数做一轮优化。 和 earlier 文章不同,这一版每个形态都显式带看涨与看跌检查索引,不再拉长网络输入去硬凑指标配对,这也解释了早前漫游通过率偏高的现象可能来自结构差异。 测试窗口拉到 2023.01.01–2025.01.01,两年实跑下来只有三个形态走通:特征-5、特征-7、特征-8 通过,特征-0、1、6 直接走不通。外汇和贵金属这类品种波动剧烈、杠杆风险高,走通的形态也仅代表历史样本内可行,换周期或品种都可能失效。 想复现的话,开 MT5 导入同一 ONNX,把 EA 多空权重按 2023 优化值锁死,再切 GBPUSD H4 跑 2023 年后的样本外,看是否仍只有那三个编号存活。
「别急着下结论」
DeMarker 作为动量振荡器与包络线构成的支撑阻力带,在上一篇文章里已做过无修正形态的互补配对测试;本文进一步用循环神经网络套上白噪内核去训练同一组指示形态,试图让模型自己抓特征。 目前放出的工程文件里,wz64.mq5 仅 7.56 KB,SignalWZ_64.mqh 为 18.51 KB,而 64_0 / 64_1 / 64_5 到 64_8 这六个 ONNX 模型每个都是 35.81 KB——说明特征-2、3、4 暂未导出,网络对形态的覆盖还不完整。 作者提到还在研究把全部形态(含人为虚构的无修正信号形态)整合进单一神经网络的方案,这部分要等后续文章。开 MT5 把 ZIP 里的 mqh 与 onnx 丢进对应目录,用向导编译 wz64 就能看到信号类怎么调白噪内核,但外汇与贵金属杠杆高、模型回测不代表实盘概率,先跑历史验证再谈仓位。