您应当知道的 MQL5 向导技术(第 64 部分):运用 DeMarker 和包络通道形态,搭配白噪内核·综合运用
🧠

您应当知道的 MQL5 向导技术(第 64 部分):运用 DeMarker 和包络通道形态,搭配白噪内核·综合运用

(3/3)· 前两层铺垫完指标与内核,这篇用 Python 把信号接进 RNN 并实盘回测收口

含代码示例偏理论 第 3/3 篇
直接把 DeMarker 和包络线丢进模型而不校验周期对齐,回测里看着顺、实盘就断层。很多人以为库函数齐了就能跑,其实自定义实现差一行 clip 逻辑,信号极性就反了。

「带白噪声注入的 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 导出的特征在本地跑通回测再谈信任。

MQL5 / C++
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 验证。

MQL5 / C++
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 就能看到信号类怎么调白噪内核,但外汇与贵金属杠杆高、模型回测不代表实盘概率,先跑历史验证再谈仓位。

把信号校验交给小布盯盘
这些 DeMarker 极值与包络带突破的诊断,小布盯盘的 AIGC 已内置,打开对应品种页即可看到实时标注,你只管判断白噪内核给出的概率倾斜。

常见问题

因为该库用布林带和 Donchian 通道覆盖了通道类需求,原生包络需自写,本文给出了自定义实现以求模块精简与执行稍快。
目前小布内置的是信号诊断与标注,模型训练仍在 Python 端完成;把导出的概率阈值贴进品种页,小布会按你设定持续盯盘口异动。
它只保留最高价较前高抬升的正差,把非上行动能清零,从而让指标纯粹度量上行推力,对称处理最低价得到 DeMin。
白噪内核前建议对通道宽度与价格偏离做缩放,否则不同品种量纲混杂会令梯度更新偏向高价资产,回测失真。