English Русский Deutsch 日本語
preview
您应该了解的MQL5向导技巧(第七十四部分):结合监督学习运用一目均衡表与ADX-Wilder形态

您应该了解的MQL5向导技巧(第七十四部分):结合监督学习运用一目均衡表与ADX-Wilder形态

MetaTrader 5交易 |
26 0
Stephen Njuki
Stephen Njuki

引言

在前一篇文章中,我们研究了一目均衡表与韦尔德平均趋向指数(ADX-Wilder)指标的组合,将其作为一套互补的支撑/阻力与趋势分析工具。按照惯例,我们基于向导组装式EA,对10种不同信号形态进行了测试。在该指标组合下,大部分形态经过前一年的测试与优化后,都能在后续一年的前向步进中实现盈利。然而,其中有3个形态的表现不尽如人意,分别是形态0、形态1和形态5。因此,我们将延续上篇研究,验证监督学习能否有效改善这些形态的交易表现。我们的研究思路:将这些形态的信号重构为简单的输入向量,输入至神经网络中,让神经网络成为信号的额外过滤层。


网络

我们选用的监督学习模型是一种基于谱混合核的网络。其定义公式如下:

形式

其中:

  • τ(tau):两个数据点之间的时间差;
  • Q:谱分量的数量;
  • wᵢ:第i个分量的权重(幅值);
  • lᵢ:第i个分量的长度尺度(控制衰减);
  • fᵢ:第i个分量的频率(振荡速率)。

我们使用该谱混合核来定义神经网络的输入层,其后再接标准的PyTorch线性层。我们创建并使用的这种层,称为谱混合层。该层以及后续的回归网络,我们均在Python中实现,代码如下:

class DeepSpectralMixtureRegressor(nn.Module):
    def __init__(self, input_dim=2, num_components=96):
        super().__init__()
        self.smk = DeepSpectralMixtureLayer(input_dim, num_components)
        feature_dim = input_dim * num_components  # 2 * 96 = 192

        self.head = nn.Sequential(
            nn.Linear(feature_dim, 1024),
            nn.ReLU(),
            nn.Linear(1024, 512),
            nn.ReLU(),
            nn.Linear(512, 256),
            nn.ReLU(),
            nn.Linear(256, 128),
            nn.ReLU(),
            nn.Linear(128, 1)  # <--- Removed sigmoid!
        )

    def forward(self, x):
        features = self.smk(x)
        output = self.head(features)
        return output

已有研究表明,在输入层使用这种特殊的谱混合核,能够有效地从输入数据中提取特征;而后续层构成的回归输出头,如果搭配使用Sigmoid激活函数,非常适合回归类模型场景。我们实现的谱混合核,会让第一层对周期型数据进行建模,后续的回归层(输出头)则学习网络的频率、方差与权重。该实现方式最适用于输入数据带有振荡模式的回归任务,同时也将神经网络的灵活性与高斯过程思想相结合。

我们将该网络命名为DeepSpectralMixtureRegressor。采用模块化架构,分为两部分:特征提取和回归。第一部分特征提取由专门的DeepSpectralMixtureLayer函数实现,其代码如下:

class DeepSpectralMixtureLayer(nn.Module):
    def __init__(self, input_dim, num_components):
        super().__init__()
        self.num_components = num_components
        hidden = 512  # Wider hidden layers

        # Go deeper with 4 layers
        def make_subnet():
            return nn.Sequential(
                nn.Linear(input_dim, hidden),
                nn.ReLU(),
                nn.Linear(hidden, hidden),
                nn.ReLU(),
                nn.Linear(hidden, hidden),
                nn.ReLU(),
                nn.Linear(hidden, num_components),
            )

        self.freq_net = make_subnet()
        self.var_net = nn.Sequential(*make_subnet(), nn.Softplus())
        self.weight_net = nn.Sequential(*make_subnet(), nn.Softplus())

    def forward(self, x):
        mu = self.freq_net(x)
        v = self.var_net(x)
        w = self.weight_net(x)

        expanded = x.unsqueeze(2)
        mu = mu.unsqueeze(1)
        v = v.unsqueeze(1)
        w = w.unsqueeze(1)

        x_cos = torch.cos(2 * np.pi * expanded * mu)
        x_exp = torch.exp(-v * expanded**2)
        features = w * x_exp * x_cos

        return features.flatten(start_dim=1)

上述函数通过神经网络自动学习频率、方差与权重。由于方差和权重均采用Softplus激活函数,可以保证输出恒为正值。回归头将提取到的特征映射为单一输出,如果使用Sigmoid激活函数,适用于有界回归或二分类任务。该架构的核心优势在于自适应能力,模型可自动适配多种不同的数据模式。这使其非常适合时间序列预测类任务,尤其当序列中包含周期性成分时。该结构最终实现了神经网络方法与核方法的优势结合。

威尔逊等人(2013) 指出,如果将谱密度表示为多个分量的混合形式,谱混合核可在GPyTorch等库中作为协方差函数,用于高斯过程建模以捕捉周期性模式。我们的方法正是将这一理念融入神经网络,通过神经网络参数化谱混合核的核心组件 —— 频率、方差与权重。这实现了数据驱动的自适应特征提取,尤其适用于数据中存在周期性/振荡模式的时间序列预测等问题。塞巴斯蒂安・卡尔(Sebastian Callh)在其关于谱混合核的博客文章中也强调了这一点。我们采用这种核函数的部分灵感,也来自GPyTorch官方文档。 

简言之,我们的模型摒弃了固定参数的核函数,转而通过神经网络学习:用μ标记频率、用v标记方差、用w表示权重。这种方法使模型能自适应适配各类数据模式。第一层特征提取层通过公式w * exp(-v * x²) * cos(2πμx)计算特征:该公式通过余弦调制捕捉周期性,并通过指数衰减保证平滑性。模块化设计将特征提取(通过DeepSpectralMixtureLayer实现)与回归头拆分为独立组件,提升了架构的灵活性。回归头是一个深度全连接网络,将核特征映射为单一输出,并通过Sigmoid激活将输出约束在0至1区间内,使其天然适配有界回归或二分类任务。

让我们深入解析上述代码,探讨该设计如何落地实现。代码以PyTorch及相关库的标准导入开头。这些导入提供了张量运算、网络构建、优化器、数据处理,以及将训练好的模型导出为ONNX格式(用于第三方平台推理)的全套工具。这是构建、训练与部署模型的基础,也是PyTorch开发乃至整个机器学习领域的通用基石。需要注意的是,务必保证PyTorch与ONNX版本兼容,以确保训练时数据加载高效。

接下来,我们定义DeepSpectralMixtureLayer的初始化逻辑。该层定义三个神经网络:频率网络、方差网络、权重网络。每个网络将输入映射为对应数量的分量输出,并推荐使用Softplus激活函数 —— 这样确保方差与权重始终为正,从而满足核函数形式对正值的要求。这三个网络分别参数化谱混合核,从而实现融合高斯过程思想的数据驱动特征提取。参数num_components控制模型的特征丰富度,可根据任务复杂度灵活调整。使用Softplus激活可避免出现负值,从而杜绝数值不稳定的问题。

接下来,我们定义网络的前向传播函数。该函数基于前文所述公式计算谱混合特征:先对输入与参数进行维度重塑,以适配回归头的广播运算;再通过余弦与指数函数完成核心变换,将输出展平后送入回归层。这一核心变换完整复现了谱混合核的计算逻辑。输入x的形状需遵循(batch_size, input_dim)格式。为保证指数运算的数值稳定性,可能需要对方差v进行截断。num_components同样可用于调整最终的特征维度。

完成特征提取层设计后,我们转向回归器 —— 这是定义模型时实例化的类。其核心目标是将上述谱混合层与全连接回归头结合,回归头将核特征可以通过Sigmoid映射为0至1区间内的单一输出。可通过增加层数/扩大层维度调整回归头复杂度,以适配不同任务;如果为无界回归任务,可直接移除Sigmoid激活。与上述谱混合层函数类似,回归器也定义了前向传播函数。输入先经谱混合层提取特征,再送入回归头得到最终输出。该函数定义了完整的端到端前向流程,支持端到端训练与推理。

输入x的维度必须与input_dim匹配。由于使用Sigmoid激活,二元交叉熵(BCE)是合适的损失函数。num_components对网络性能极为敏感,直接决定谱分量总数:数值越高,模型表达能力越强,但高数值导致过拟合风险也随之上升。建议初始值设为64,再根据数据复杂度微调。鉴于谱混合层的过表达特性,训练时监控过拟合至关重要。可通过正则化与早停有效缓解过拟合问题。

这些GPyTorch示例所示,分析学习得到的μ、v、w参数,有助于理解数据中的周期性规律。与传统高斯过程模型相比,我们的方法缺少不确定性估计,后续可补充相关量化指标。最后,前向传播的计算量较大,尤其是在 num_components 取值很大或输入维度较高时。在对模型进行微调与优化时,需要将这一点纳入考量。


指标实现

在前一篇文章测试的信号形态中,大部分形态的前向步进效果都较为理想,只有形态0、形态1和形态5表现不佳。我们在2023年针对英镑兑美元(GBPUSD)品种,对10种信号形态进行了测试与优化。本次采用的是30分钟周期,而非我们常用的4小时周期,因为一目均衡表在大周期上信号通常较为稀少。与之前相同,2024年为前向步进年份。尽管10个形态中有7个在后续前向步进测试中实现盈利,但我们的测试周期仅为两年。因此,建议读者在将本文内容应用到实盘交易前,务必对更长周期的历史数据进行更严谨的测试与验证。

基于以上背景,我们来看一目均衡表与韦尔德平均趋向指数在Python中的实现方式,以及针对形态0、1、5的特征提取函数。

Python中的一目均衡表

我们在Python中实现一目均衡表函数如下:

def Ichimoku(df, tenkan_period: int = 9, kijun_period: int = 26, senkou_span_b_period: int = 52, displacement: int = 26) -> pd.DataFrame:
    """
    Calculate Ichimoku Kinko Hyo components and append them to the input DataFrame.

    The components are:
        - Tenkan-sen (Conversion Line)
        - Kijun-sen (Base Line)
        - Senkou Span A (Leading Span A)
        - Senkou Span B (Leading Span B)
        - Chikou Span (Lagging Span)

    Args:
        df (pd.DataFrame): DataFrame with 'high', 'low', and 'close' columns.
        tenkan_period (int): Lookback period for Tenkan-sen (default 9).
        kijun_period (int): Lookback period for Kijun-sen (default 26).
        senkou_span_b_period (int): Lookback period for Senkou Span B (default 52).
        displacement (int): Forward displacement of Senkou spans and backward shift of Chikou span (default 26).
        
    Returns:
        pd.DataFrame: Input DataFrame with added Ichimoku columns.
    """
    # Input validation
    required_cols = {'high', 'low', 'close'}
    if not required_cols.issubset(df.columns):
        raise ValueError("DataFrame must contain 'high', 'low', and 'close' columns")
    if not all(p > 0 for p in [tenkan_period, kijun_period, senkou_span_b_period, displacement]):
        raise ValueError("All period values must be positive integers")

    result_df = df.copy()

    # Tenkan-sen (Conversion Line)
    high_tenkan = result_df['high'].rolling(window=tenkan_period).max()
    low_tenkan = result_df['low'].rolling(window=tenkan_period).min()
    result_df['Tenkan_sen'] = (high_tenkan + low_tenkan) / 2

    # Kijun-sen (Base Line)
    high_kijun = result_df['high'].rolling(window=kijun_period).max()
    low_kijun = result_df['low'].rolling(window=kijun_period).min()
    result_df['Kijun_sen'] = (high_kijun + low_kijun) / 2

    # Senkou Span A (Leading Span A)
    result_df['Senkou_Span_A'] = ((result_df['Tenkan_sen'] + result_df['Kijun_sen']) / 2).shift(displacement)

    # Senkou Span B (Leading Span B)
    high_span_b = result_df['high'].rolling(window=senkou_span_b_period).max()
    low_span_b = result_df['low'].rolling(window=senkou_span_b_period).min()
    result_df['Senkou_Span_B'] = ((high_span_b + low_span_b) / 2).shift(displacement)

    # Chikou Span (Lagging Span)
    result_df['Chikou_Span'] = result_df['close'].shift(-displacement)

    return result_df

我们上面编写的函数会计算该指标的各个组成部分,并将其添加到输入数据框中,默认参数为:转换线(Tenkan-sen)周期9、基准线(Kijun-sen)周期26、偏移量 26、先行下线B(Senkou span B)周期52。代码开头部分用于对输入进行校验,确保数据框包含必需的价格列,且周期参数均为正值,以避免计算错误。这一步对保证数据完整性、避免运行时错误至关重要。指标函数必须在合法的运行数据上执行。在处理数据前先进行输入校验,优雅地处理缺失数据或无效参数,始终是最优实践。

校验完成后,我们开始计算转换线。代码会计算过去tenkan_period个周期内最高价最大值与最低价最小值的平均值。通常我们使用周期9,它作为短期趋势指标。该指标在穿越基准线时会发出潜在反转信号,由于反映近期价格行为,可辅助短期交易决策。可通过调整tenkan_period来改变对短期价格波动的敏感度:周期越短,敏感度越高;周期越长,敏感度越低。

接下来,我们计算基准线。计算逻辑与转换线类似,但采用更长的周期(通常为26),作为中期趋势指标。基准线的重要性在于确认趋势方向,并充当支撑/阻力位。相比转换线,它对市场的反映更为平稳可靠,适用于中期分析。而它与转换线的交叉,本身即可作为交易信号。

接下来,我们计算先行上线A,它是转换线与基准线的平均值,并向前平移偏移周期。通常偏移周期为26。该线构成了云带的一条边界,其至关重要,因为能显示未来的支撑与阻力位,为趋势分析提供前瞻性视角,正如此处所述。需要重点关注云带相对价格的位置 —— 价格在云带上方为看涨信号,在云带下方则为看跌信号。

随后计算先行下线B,取通常为52周期内最高价的最大值与最低价的最小值的平均值,同样向前平移,构成云带的第二条边界。先行下线B反映更长期的支撑与阻力,强化趋势识别,尤其在大周期上效果明显。作为参考,云带厚度(即先行A与B之间的距离)可作为波动率的替代指标。因此,云带越厚,代表支撑/阻力越强。

最后,我们计算最后一个指标线 —— 滞后线(Chikou Span)。该线为收盘价向后平移偏移周期(通常为26),用于对比当前价格与历史价格,从而确认当前价格相对历史的高低,验证趋势是否成立。因此滞后线的核心作用是趋势确认,由于用到平移与长周期均值计算,通常需要足够的历史数据支撑。


Python中实现韦尔德平均趋向指数

完成一目均衡表的Python代码实现后,轮到韦尔德平均趋向指数。该函数采用韦尔德计算方法求解ADX,与一目均衡表的处理方式一样,在价格数据框中新增ADX、+DI、-DI三列数据。指标默认周期为14,可根据一目均衡表参数或对价格敏感度的需求进行调整,本文仍使用默认的14周期。在Python中的具体实现如下:

def ADX_Wilder(df, period: int = 14) -> pd.DataFrame:
    """
    Calculate the Average Directional Index (ADX) using Wilder's method and 
    append the ADX, +DI, and -DI columns to the input DataFrame.

    ADX measures trend strength, while +DI and -DI measure trend direction.
    
    Args:
        df (pd.DataFrame): DataFrame with 'high', 'low', and 'close' columns.
        period (int): The lookback period to use. Default is 14.
        
    Returns:
        pd.DataFrame: Input DataFrame with 'ADX', '+DI', and '-DI' columns.
    """
    if not all(col in df.columns for col in ['high', 'low', 'close']):
        raise ValueError("DataFrame must contain 'high', 'low', and 'close' columns")
    if period <= 0:
        raise ValueError("Period must be a positive integer")

    result_df = df.copy()

    # Calculate directional movements
    up_move = result_df['high'].diff()
    down_move = result_df['low'].diff()

    plus_dm = np.where((up_move > down_move) & (up_move > 0), up_move, 0)
    minus_dm = np.where((down_move > up_move) & (down_move > 0), down_move, 0)

    # Calculate True Range (TR)
    high_low = result_df['high'] - result_df['low']
    high_close = np.abs(result_df['high'] - result_df['close'].shift(1))
    low_close = np.abs(result_df['low'] - result_df['close'].shift(1))
    tr = np.maximum(high_low, np.maximum(high_close, low_close))

    # Apply Wilder's smoothing
    atr = pd.Series(tr).rolling(window=period).mean()
    plus_di = 100 * pd.Series(plus_dm).rolling(window=period).sum() / atr
    minus_di = 100 * pd.Series(minus_dm).rolling(window=period).sum() / atr
    dx = 100 * np.abs(plus_di - minus_di) / (plus_di + minus_di)
    adx = dx.rolling(window=period).mean()

    result_df['+DI'] = plus_di
    result_df['-DI'] = minus_di
    result_df['ADX'] = adx

    return result_df

首先,我们对函数输入进行校验。与往常一样,这一步确保数据包含必需的价格列,且指标周期有效,避免计算错误。这对保证数据完整性、仅在合法数据上运行至关重要,同时也要妥善处理缺失值情况。校验完成后,我们开始计算动向指标。通过最高价与最低价的差值,确定+DM(正向动向)与-DM(负向动向),用以衡量上涨与下跌趋势的强度,这是趋势判断与强度分析的核心数据。请务必保证有足够的历史数据以计算准确的动向差值,同时留意数据中的跳空缺口。

接下来计算真实波幅(TR)。取以下三者中的最大值:当期最高价 - 最低价、当期最高价 - 前收盘价、当期最低价 - 前收盘价。计算时采用绝对值以保证一致性。该波幅用于标准化动向值,使其能在不同品种间横向比较,符合ADX的计算要求。请必须确保价格数据无缺失,避免计算中出现NaN导致错误。

接下来,用滚动均值对真实波幅进行平滑处理。同时对+DM和-DM进行平滑,并将正负动向指标归一化到0至100区间,以百分比形式呈现。动向指数DX用于衡量趋势强度,计算方式为:(+DM与- DM的绝对差值) ÷ (+DM与- DM之和)。最后,核心指标ADX即为DX在指标周期(本文为14)上的平滑值,这一最终输出结果用于衡量当前趋势的整体强度。

回顾前一篇文章,ADX的取值范围为0至100,高于25通常代表强趋势,另一方面,低于20则代表趋势较弱或尚未形成。+DI与-DI分别量化多头与空头趋势的强度,二者的差值可作为入场信号。所用周期14可根据敏感度需求调整:周期越小,信号出现越早、拐点捕捉更灵敏,但波动更大;周期越长则越平稳。

在通过引言中定义的谱混合核回归网络进行应用时,我们将这两个指标的输出组合为简单的二维向量作为输入。在以往文章中,我们曾尝试将每个形态的各类信号拆解为布尔值0或1,以此扩大监督学习网络的输入向量维度。这种方式在训练/优化阶段效果更好,但在前向步进中并未体现出优势。因此,本次我们不再拆分信号,而是直接将各指标的信号与形态合并为单一布尔值。这个二维向量的每一维都融合了两个指标的综合信号:第一维专门用于确认多头信号,第二维用于确认空头信号。



形态0

我们将表现较差的三个信号形态输入网络,分别对应形态0、形态1 和形态5。形态0在Python中的实现如下:

def feature_0(df):
    """
    """
    feature = np.zeros((len(df), 2))
    
    feature[:, 0] = ((df['close'].shift(1) < df['Senkou_Span_A'].shift(1)) &
                     (df['close'] > df['Senkou_Span_A']) &
                     (df['ADX'] >= 25.0)).astype(int)
    
    feature[:, 1] = ((df['close'].shift(1) > df['Senkou_Span_A'].shift(1)) &
                     (df['close'] < df['Senkou_Span_A']) &
                     (df['ADX'] >= 25.0)).astype(int)
    
    feature[0, :] = 0
    feature[1, :] = 0
    
    return feature

该函数首先创建一个初始值全为零的NumPy数组。这个特征数组的行数与输入数据框一致,列数设置为2列。这样可以为信号生成提供一个干净的初始空间,避免残留数值影响输出结果。接下来,我们为数组的第一列赋值,这一列用于判断多头信号。根据前一篇文章中定义的条件,当满足以下情况时,该列对应行赋值为1:前一根K线收盘价低于先行上线A;当前收盘价高于当前先行上线A;ADX值大于等于25。检测到价格向上突破先行上线A的看涨交叉,通常提示可能进入上升趋势。ADX大于等于25的条件可以确保信号出现在强趋势中,以减少弱势行情下的假信号。

使用NumPy数组进行赋值,可以同时对多行执行批量操作,这也是在Python中开发和训练模型极为高效的主要原因之一。接下来,我们对空头信号列进行整行赋值,在每一行中,如果满足以下条件则赋值为1:前一根K线收盘价高于上一期先行上线A;当前收盘价低于当前先行上线A;ADX主缓冲区值大于等于25。这一逻辑用于识别价格向下跌破先行上线A的空头交叉信号,标志着潜在的下跌趋势。ADX过滤条件同样用于确保趋势强度足够支撑该信号。

在完成多空信号赋值后,我们将特征数组的前两行强制设置为0,因为这两行无有效历史数据用于比较,其原始计算结果为NaN。我们仅用这一个形态训练网络,并将其导出为74_0.onnx文件,随后导入到MQL5 EA的自定义信号类中。在前一篇文章中,该形态的前向步进效果很差,但本次将神经网络作为指标输入信号的额外过滤器后,测试报告如下:

r0

c0

目前效果出现了明显好转,不过这里的结果仅对应只开多头仓位的情况。同时需要重申,我们的测试数据范围依然非常有限,因此仍仅属于探索性研究。形态0的买入信号在图表上的显示效果如下:

p0



形态1

在前一篇文章中,形态1是另一个表现极差的特征/形态。在Python中的具体实现如下:

def feature_1(df):
    """

    """
    feature = np.zeros((len(df), 2))
    
    feature[:, 0] = ((df['Tenkan_sen'].shift(1) < df['Kijun_sen'].shift(1)) &
                     (df['Tenkan_sen'] > df['Kijun_sen']) &
                     (df['ADX'] >= 20.0)).astype(int)
    
    feature[:, 1] = ((df['Tenkan_sen'].shift(1) > df['Kijun_sen'].shift(1)) &
                     (df['Tenkan_sen'] < df['Kijun_sen']) &
                     (df['ADX'] >= 20.0)).astype(int)    
    
    feature[0, :] = 0
    feature[1, :] = 0
    
    return feature

我们再次初始化一个名为feature的目标输出数组,初始值全为0,行数与输入数据框保持一致。将数组设置为2列,用于记录每个数据点的多头与空头信号。对于第一列,满足以下条件时赋值为1,表示确认多头信号:上一期转换线低于基准线;当前转换线向上突破基准线;ADX大于等于20。该信号捕捉的是转换线与基准线之间的看涨交叉,它属于中期信号,预示主要趋势的启动,因此,不必将ADX 门槛设置为25,设置为20即可。

空头信号则录入数组第二列,条件与多头完全相反:如果上一期转换线在基准线上方,当前转换线下穿基准线,且ADX大于等于20,则标记为1,视为空头信号。我们的方案要求同时满足多个条件才会输出非零信号,规则较为严格。这与前面提到的、用更大数组将单个指标信号拆分为独立位输入网络的方式形成了明显的对比。最后,我们将数组前两行设置为0,因为使用了位移比较,这两行存在NaN无效值。以下是形态1在英镑兑美元30分钟周期上、跨度两年的训练与测试报告:

r1

c1

我们将网络作为过滤器,叠加在上一篇文章的信号处理逻辑之上,显然再次改善了这个向导组装EA的表现。形态1在K线图上的多头形态示例如下:

p1



形态5

我们重新测试的最后一个形态是第六个形态,即形态5。我们在Python中的实现如下:

def feature_5(df):
    """

    """
    feature = np.zeros((len(df), 2))
    
    feature[:, 0] = ((df['close'].shift(2) > df['close'].shift(1)) &
                     (df['close'].shift(1) < df['close']) &
                     (df['close'].shift(2) > df['Tenkan_sen'].shift(2)) &
                     (df['close'] > df['Tenkan_sen']) &
                     (df['close'].shift(1) <= df['Tenkan_sen'].shift(1)) &
                     (df['+DI'] > df['-DI']) &
                     (df['ADX'] >= 25.0)).astype(int)
    
    feature[:, 1] = ((df['close'].shift(2) < df['close'].shift(1)) &
                     (df['close'].shift(1) > df['close']) &
                     (df['close'].shift(2) < df['Tenkan_sen'].shift(2)) &
                     (df['close'] < df['Tenkan_sen']) &
                     (df['close'].shift(1) >= df['Tenkan_sen'].shift(1)) &
                     (df['+DI'] < df['-DI']) &
                     (df['ADX'] >= 25.0)).astype(int)
    
    
    feature[0, :] = 0
    feature[1, :] = 0
    
    return feature

格式与以上形态0和形态1类似,我们先初始化并设置好输出NumPy数组的尺寸。多头信号(第一列赋值为1)需满足以下条件:收盘价在转换线上方形成U型反弹/企稳,同时+DI大于-DI,且ADX大于等于25。这类价格行为通常预示趋势延续,在确认信号前,必须综合考量ADX的正负动向指标(+DI与-DI)的相对大小及其数值。

空头信号(第二列赋值为1)需满足以下条件:价格从转换线下方向下跌破并承压,当前收盘价收在其下方,ADX大于等于25,且-DI大于+DI作为最终确认。最后,我们将特征数组前两行置为0,以处理因位移计算产生的NaN无效值。我们在与前两个形态相同的条件下对该形态进行了测试,得到的报告如下:

r5

c5

模型虽然实现了盈利,但资金曲线波动十分剧烈,因此,有必要将机器学习与常规指标信号结合使用。尽管本次结果不够理想,且测试范围有限,却仍然可以说明:利用谱混合核网络作为额外过滤器,对传统指标信号进行补充,能够优化入场点位并提升策略表现。



结论

本文研究了基于谱混合核设计的神经网络,用于对一目均衡表与平均趋向指数组合指标的原始交易信号进行精调优化。该专用网络展现出一定的应用潜力,与前一篇仅使用纯指标信号进行交易的结果相比,表现有明显改善。与之前相同,读者在将本文结论直接应用或集成到现有交易系统前,仍需进行更细致的验证。这种信号集成思路,尤其在测试阶段,可通过MQL5向导组装EA实现 —— 因为在组装过程中可以同时选用多个自定义信号。

名称 描述
WZ-74.mq5 向导组装式EA,其头文件显示组装中所包含的文件
SignalWZ-74.mqh 自定义信号类文件
74-5.onnx 信号形态5的ONNX网络
74-1.onnx 信号形态1的ONNX网络
74-0.onnx 信号形态0的ONNX网络

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/18776

附加的文件 |
WZ-74.mq5 (7.17 KB)
SignalWZ_74.mqh (15.37 KB)
74_5.onnx (10222.44 KB)
74_1.onnx (10222.44 KB)
74_0.onnx (10222.44 KB)
海豚回波定位算法(DEA) 海豚回波定位算法(DEA)
在本文中,我们将深入探讨 DEA 算法:一种受海豚利用回声定位捕食的独特能力启发而设计的元启发式优化方法。从数学基础到 MQL5 中的实际实现,从原理分析到与经典算法的对比,我们将详细剖析为什么这一相对较新的方法值得在面临优化问题的研究者工具箱中占有一席之地。
神经网络在交易中的应用:用于多元时间序列预测的 LSTM 优化(DA-CG-LSTM) 神经网络在交易中的应用:用于多元时间序列预测的 LSTM 优化(DA-CG-LSTM)
本文介绍了 DA-CG-LSTM 算法,该算法为时间序列分析和预测提供了新的方法。它解释了创新的注意力机制和模型灵活性如何提高预测准确性。
神经网络在交易中的应用:用于多元时间序列预测的 LSTM 优化(终篇) 神经网络在交易中的应用:用于多元时间序列预测的 LSTM 优化(终篇)
我们继续实现 DA-CG-LSTM 框架,该框架为时间序列分析和预测提供了创新方法。使用 CG-LSTM 和双重注意力机制可以更准确地检测数据中的长期和短期依赖关系,这在金融市场分析中尤其有用。
您应该了解的MQL5向导技巧(第七十三部分):使用一目均衡表形态与ADX-Wilder形态 您应该了解的MQL5向导技巧(第七十三部分):使用一目均衡表形态与ADX-Wilder形态
一目均衡表(Ichimoku-Kinko-Hyo)指标与韦尔德平均趋向指数(ADX-Wilder)震荡指标,可在MQL5智能交易系统(EA)中形成互补搭配。一目均衡表本身功能多元,但在本文中,我们主要利用其识别支撑与阻力位的特性。同时,我们也使用ADX来判断趋势强弱。我们依旧通过MQL5向导来构建并测试这一组合的潜在效果。