English Русский Español Deutsch 日本語
preview
您应该了解的MQL5向导技巧(第六十六部分):结合点积核使用FrAMA与强力指数形态

您应该了解的MQL5向导技巧(第六十六部分):结合点积核使用FrAMA与强力指数形态

MetaTrader 5交易系统 |
89 0
Stephen Njuki
Stephen Njuki

引言

在前一篇文章中,我们介绍了将这组指标作为EA入场信号形态的方案,但前向测试结果并不理想。我们当时分析了部分原因,并且特别说明所做的训练与优化仅基于1年数据,因此无论采用何种形态,都必须在海量历史数据上进行尽可能全面的测试。与之前一样,本篇我们将继续研究那些能够通过前向测试的形态。通过机器学习来实现。

在MQL5中应用机器学习算法时,OpenCL始终是一个可选方案,然而,这通常需要配备GPU硬件。有GPU固然更好,但Python的代码库如今已经非常完善,仅使用CPU也能获得很高的运行效率。这也是本系列文章一直在探索的方向。与之前部分文章一样,我们将使用Python编写神经网络,因为在Python中进行编码与训练效率极高。 

在前一篇文章中我们优化并训练了10种形态,但其中仅有2种通过了前向测试,即形态6与形态9。因此,我们将使用神经网络对这两种形态做进一步测试。与之前的文章类似,区别在于本次我们使用卷积神经网络(CNN),并且该CNN将采用点积核实现。然而,在使用Python实现之前,我们照例先定义所需的指标函数,以便为网络提供信号数据。 


分形自适应移动平均线(FrAMA)函数

FrAMA是一种动态移动平均线,它会根据价格波动的分形维度自动调整平滑程度。这使其对大幅价格变动更为灵敏,同时对噪音信号反应更平缓。我们在Python中实现该函数的代码如下:

def FrAMA(df, period=14, price_col='close'):
    """
    Calculate Fractal Adaptive Moving Average (FrAMA) for a DataFrame with price data.
    
    Args:
        df: Pandas DataFrame with a price column (default 'close').
        period: Lookback period for fractal dimension (default 20).
        price_col: Name of the price column (default 'close').
        
    Returns:
        Pandas DataFrame with a single column 'main' containing FrAMA values.
    """
    prices = df[price_col]
    frama = pd.Series(index=prices.index, dtype=float)
    
    for t in range(period, len(prices)):
        # 1. High-Low range (volatility proxy)
        high = prices.iloc[t-period:t].max()
        low = prices.iloc[t-period:t].min()
        range_hl = high - low
        
        # 2. Fractal Dimension (simplified)
        fd = 1.0 + (np.log(range_hl + 1e-9) / np.log(period))  # Avoid log(0)
        
        # 3. Adaptive EMA smoothing factor
        alpha = 2.0 / (period * fd + 1)
        
        # 4. Update FrAMA (recursive EMA)
        frama.iloc[t] = alpha * prices.iloc[t] + (1 - alpha) * frama.iloc[t-1]
    
    return pd.DataFrame({'main': frama})

以上函数具备输入灵活性,可以接收pandas数据帧,并支持自定义价格列与周期参数。函数通过最高价 - 最低价区间作为波动率指标来估算市场波动,并计算简化的分形维度以衡量价格复杂度。函数通过递归式指数移动平均线(EMA)来更新FrAMA数值。

通读代码后可知,首先从输入数据帧中提取指定的价格列。这一提取操作保证了函数可以使用用户指定的任意价格列。这样避免了硬编码,同时保持了兼容性。在实际使用时,建议对函数做如下改进:校验输入的价格列是否存在于数据帧中;确保价格数据存在,无NaN或缺失值,因为FrAMA对价格输入较为敏感。

接下来,我们创建一个与原数据索引相同的空pandas序列,这种预分配内存的方式可以为FrAMA数值预留空间,保证与输入数据帧索引对齐,实现高效的迭代更新。在使用时,FrAMA需要回溯窗口进行计算,这意味着开头部分会是NaN,需要处理或置0。同时必须保证价格索引(时间 - 价格对应关系)一致,避免错位。

之后进入for循环,在回溯周期内计算高低价区间以估算波动率。对每个时间步长t,取周期窗口内的最高价与最低价并计算差值。高低区间作为市场波动率指标,对确定分形维度至关重要。区间越大,波动率越高,也直接影响FrAMA的自适应特性。在实现中,可以加入NaN异常处理机制以应对缺失数据。

接下来,我们通过高低区间的对数比值计算简化分形维度。式中加入极小量1e-9是为了防止区间为0时出现除零或对零取对数的错误。分形维度fd用于衡量价格的复杂度或趋势性:fd越高(越接近2),代表市场震荡、噪音较重;fd越低(越接近1),代表市场处于趋势行情。该参数是驱动FrAMA自适应的核心。1e-9是保持数值稳定的技巧,足够小而不会扭曲结果。此外,这里使用的是简化版的分形维度,对于更复杂的形式可采用盒计数法。完成后,我们计算平滑系数α。

该平滑系数用于指数移动平均,其值由分形维度和周期共同决定。它非常关键,因为自适应α决定了FrAMA对新价格的响应速度。噪音更强的市场会得到更高的fd,从而降低α,让EMA变慢以过滤噪音;趋势市场会得到更低的fd,从而提高α,让FrAMA对价格变动更灵敏。

这一公式在响应速度与平滑度之间取得平衡。周期可根据需要调整,以控制灵敏度。同时必须保证分母period * fd + 1为正,避免除零问题。

下一行代码使用EMA公式更新t时刻的FrAMA值,即当前价格与上一期FrAMA的加权组合。这是FrAMA的核心,递归EMA计算通过α动态适配市场状态,生成平滑且自适应的移动平均线。可改进的方面包括:避免初始FrAMA为NaN,并对缓冲区边界情况做校验。

FrAMA函数的最后一行将计算结果以单列pandas数据帧形式返回,列名为main。这种标准化输出格式便于与其他技术分析工具或绘图库兼容。使用main作为列名是单缓冲区指标的通用惯例。在不同集成场景下,如需作为调用标识,可自定义为FrAMA或更具描述性的名称。同时需要保证返回的数据帧与输入数据帧索引对齐。


强力指数震荡指标函数

该震荡指标结合价格变动与成交量,用于衡量价格波动的强度。其通过EMA平滑以突出趋势或反转信号。在Python中的具体实现如下:

def ForceIndex(df, period=14, price_col='close', volume_col='tick_volume'):
    """
    Calculate Force Index for a DataFrame with price and volume data.
    
    Args:
        df: Pandas DataFrame with columns for price and volume (default 'close' and 'volume').
        period: Smoothing window for EMA (default 13).
        price_col: Name of the price column (default 'close').
        volume_col: Name of the volume column (default 'volume').
        
    Returns:
        Pandas DataFrame with a single column 'main' containing Force Index values.
    """
    closes = df[price_col]
    volumes = df[volume_col]
    
    # 1. Raw Force Index = Price Delta * Volume
    price_delta = closes.diff()
    raw_force = price_delta * volumes
    
    # 2. Smooth with EMA
    alpha = 2.0 / (period + 1)
    force_index = pd.Series(index=closes.index, dtype=float)
    
    for t in range(1, len(raw_force)):
        if pd.isna(raw_force.iloc[t]):
            force_index.iloc[t] = np.nan
        else:
            force_index.iloc[t] = alpha * raw_force.iloc[t] + (1 - alpha) * force_index.iloc[t-1]
    
    return pd.DataFrame({'main': force_index})

与FrAMA函数一样,我们编写的强力指数函数也具备输入灵活性,支持自定义价格列和成交量列。它通过结合价格变动与成交量计算原始强力值,以此衡量多空买卖力量。再通过EMA平滑过滤噪音和突出持续性行情。内置NaN缺失值处理。最终返回标准化的数据帧格式,便于后续集成使用。

逐行来看,我们首先从pandas数据帧中提取收盘价和成交量列。这一步的意义在于分离计算所需的核心数据,支持自定义列名,处理效率更高。可改进的方面包括:校验价格列与成交量列是否存在,避免报错;确保成交量非负、价格数据无缺失,因为强力指数高度依赖这两组数据。

接下来,我们计算价格差值,即连续收盘价的差额。Python中的方法会自动计算相邻收盘价的变化,用于衡量价格波动。这一点至关重要,因为价格变动直接反映了市场量价驱动的方向与幅度,是强力指数的核心组成部分。第一个索引位置会产生NaN,需要置0处理;其他缺失值也需要统一处理。

随后,我们计算原始强力指数:价格差值 × 成交量。Python通过将缓冲区/数组当作标量值相乘,大幅简化了编码。该乘积代表价格波动的强度,将价格动量与成交量结合,量化买入或卖出压力。伴随高成交量的价格大涨通常代表市场信心更强。在做向量乘法时,务必保证成交量与价格差值索引对齐,避免计算错误。同时需要注意,原始强力指数噪音较大,后续必须做平滑处理。

接着设置α系数。这是EMA平滑系数,使用标准公式计算:2/(周期 + 1) 。该系数很重要,因为它决定了新数据与历史数据在平滑后的权重比例。周期越大,则α越小,结果越平滑。我们使用行业通用的默认周期14。然而,在实际应用时必须根据交易周期调整。通常来说,较短周期适合日内交易,较长周期适合日线及更大周期。同时必须保证周期为正数,避免除零错误。

接下来,我们从输入的pandas数据帧初始化强力指数缓冲区。创建一个与价格数据索引相同的空序列,用于存储平滑后的强力指数值。这一步用于预分配内存、保证索引对齐,让迭代式EMA计算更高效。初始值为NaN属正常现象,因为第一个值需要前序数据才能计算。

我们会检查t时刻的原始强力指数是否为NaN。这一步显式处理缺失数据,避免EMA计算出错,提升鲁棒性。真实市场数据经常存在缺口,虽然处理NaN看起来琐碎,但绝不能忽略。在调试时记录或标记NaN也是很好的实践。

之后,我们使用EMA公式逐行更新强力指数缓冲区。将当前原始强力指数与上一期平滑值加权结合。这是核心的平滑步骤,其作用是过滤原始强力指数的噪音和突出持续性趋势或反转信号。在这一步中,请务必保证正确初始化force_index[t-1] ,因为其早期索引值通常为NaN。因此,缓冲区的边界情况必须妥善处理。

计算完成后,函数将平滑后的强力指数以单列pandas数据帧返回,列名为main。与FrAMA一样,这种标准化的输出格式便于根据用户需求与其他格式或工具集成。main命名符合技术分析的通用惯例。同时必须保证输出索引与输入数据完全一致,方便后续合并使用。

在Python中定义好两个指标函数后,我们现在处理前一篇文章中通过前向测试的两个信号形态。即形态6和形态9。我们将这两个形态编码为一个简单的2位向量,作为神经网络的输入。这两个“位”分别代表看涨信号和看跌信号,取值只能是0或1。概括而言,输入向量长度为2,在第一个索引处,如果所有的看涨条件都满足,则记录为1,否则记录为0;同样,在第二个索引处,如果所有的看跌条件都满足,则记录为1,否则记录为0。

在此之前,我们曾尝试将看涨、看跌信号拆分成更细的条件,构建更复杂的输入向量到神经网络中。但这种方式的前向测试结果并不理想,效果类似于我们之前在另一篇文章中尝试的 —— 将多个形态直接合并到一个EA中。

然而这项分析的结论并非绝对,因此读者可以直接使用并修改附带的源代码,独立进行测试,从而得出自己的结论。附上的代码可直接用于MQL5向导,相关使用指南可参考此处


特征6函数

我们在Python中实现的形态6函数,会生成一个由0或1组成的二维二进制信号数组,原理与前文所述一致。首先,我们将特征输出数组初始化为全0。输出是一个NumPy二维数组,等价于一个两列矩阵。此“矩阵”的行数,设置为输入数据帧one_df的长度。这种初始化方式为分别存储看涨、看跌信号搭建了输出结构。全0初始化意味着:只有形态条件满足时,才会产生信号,保证初始为“空白状态”。

在实现过程中,必须确保第一个输入的长度与第二个数据帧two_df及价格数据帧price_df的长度完全一致,以避免索引错位导致计算错误。二维结构是区分看跌、看涨信号的关键,因此务必检查数组形状是否符合预期。实现方式如下:

def feature_6(one_df, two_df, price_df):
    """
    Generate binary signals based on sustained price-FrAMA alignment and Force Index momentum.
    
    Args:
        one_df: DataFrame with FrAMA values ('main' column).
        two_df: DataFrame with Force Index values ('main' column).
        price_df: DataFrame with price data ('close' column).
    
    Returns:
        2D NumPy array with bullish (column 0) and bearish (column 1) signals.
    """
    feature = np.zeros((len(one_df), 2))
    
    feature[:, 0] = ((price_df['close'] > one_df['main']) &
                     (price_df['close'].shift(1) > one_df['main'].shift(1)) &
                     (price_df['close'].shift(2) > one_df['main'].shift(2)) &
                     (two_df['main'] > 0.0) &
                     (two_df['main'].shift(1) < two_df['main'].shift(2))).astype(int)
    feature[:, 1] = ((price_df['close'] < one_df['main']) &
                     (price_df['close'].shift(1) < one_df['main'].shift(1)) &
                     (price_df['close'].shift(2) < one_df['main'].shift(2)) &
                     (two_df['main'] < 0.0) &
                     (two_df['main'].shift(1) < two_df['main'].shift(2))).astype(int)
    
    feature[0, :] = 0
    feature[1, :] = 0
    
    return feature

接下来,我们定义看涨条件,也就是每一行中第一个索引的值。回顾上一篇文章,构成看涨形态的条件:如果当前价格在FrAMA之上;前一根K线价格也在前一根FrAMA之上;两根K线前同样满足价格在FrAMA之上;当前强力指数为正;前一期强力指数低于当前值,且当前值也高于两期前的强力指数。

第一列代码封装了看涨逻辑:只有价格趋势持续在自适应FrAMA上方时才会触发信号,表示明确的上升趋势。强力指数用于确认强劲的买盘力量。连续三期的校验提升了信号可靠性,强力指数过滤了弱势波动。在实现时,必须确保所有输入数据帧索引对齐且数据有效。shift()操作会在前几行产生NaN,在返回指标前必须处理。 

第二列定义看跌信号,其条件与看涨完全对应:当前价格低于FrAMA;前一根K线价格也低于前一根FrAMA;两根K线前同样满足价格低于FrAMA;当前强力指数为负;前一期强力指数高于当前值,且前一期强力指数也小于前两期强力指数。强力指数呈现N回落,代表负向成交量或市场情绪在增强。

该形态与看涨形态完全对称,用于捕捉卖出机会。可识别伴有强劲卖盘压力的持续下跌趋势。对称性保证了多空形态逻辑一致。与看涨形态一样,必须确保数据对齐。同时建议测试该形态的出现频率是否足够。强力指数的动量判断(shift(1) < shift(2))在熊市与牛市中的表现可能不同,因此,必须分析历史表现来验证可靠性。

接下来我们将特征数组前两行均设为0。因为.shift(1)和.shift(2)会让前几行产生NaN,从而导致条件无法判断。这可以避免在历史数据不足的首行产生无效信号,确保输出明确可用,后续无需手动处理。该校验对鲁棒性至关重要。如果后续使用超过2期的偏移(比如对比3期),必须根据最大偏移量确认只置0前两行是否足够。如果增加偏移量,这里也要同步调整。

总结一下特征6,对于看涨形态,价格连续至少3期站稳在FrAMA上方,且强力指数为正值并呈现近期U形回升。用于确认上升趋势的持续性。与看涨完全相反,看跌形态价格连续至少3期运行在FrAMA下方,强力指数为负值并呈现近期N形下降。用于确认下跌趋势的有效性。

两者除了对称相反之外,一个关键区别在于强力指数的情绪判断特别要求近期力度增强。由于市场行为的不对称性,该条件在看涨和看跌行情中的表现会有所差异。例如,下跌通常比上涨更快。


特征9函数

此信号9的 Python 实现,专注于单周期内价格、FrAMA、强力指数的情绪同步,因此,它比特征6对短期的变化更敏感。与实现特征6相同,我们先将输出目标初始化为全0。其整体结构与特征6类似:输出二维NumPy数组的长度与输入数据帧one_df保持一致。Python实现如下:

def feature_9(one_df, two_df, price_df):
    """
    Generate binary signals based on single-period momentum alignment of price, FrAMA, and Force Index.
    
    Args:
        one_df: DataFrame with FrAMA values ('main' column).
        two_df: DataFrame with Force Index values ('main' column).
        price_df: DataFrame with price data ('close' column).
    
    Returns:
        2D NumPy array with bullish (column 0) and bearish (column 1) signals.
    """
    feature = np.zeros((len(one_df), 2))
    
    feature[:, 0] = ((price_df['close'] > price_df['close'].shift(1)) &
                     (one_df['main'] > one_df['main'].shift(1)) &
                     (two_df['main'] > two_df['main'].shift(1))).astype(int)
    feature[:, 1] = ((price_df['close'] < price_df['close'].shift(1)) &
                     (one_df['main'] < one_df['main'].shift(1)) &
                     (two_df['main'] < two_df['main'].shift(1))).astype(int)
    
    feature[0, :] = 0
    feature[1, :] = 0
    
    return feature

对于这两个特征函数,one_df代表FrAMA指标数据帧,two_df代表强力指数数据帧。因此,正如我们在特征6中提到的,必须检查one_df、two_df和价格数据帧长度完全一致,避免维度不匹配。此矩阵/二维数组用于分开存储看涨与看跌形态,因此,校验行数非常重要。

接下来,我们先定义该形态的看涨条件。当前价格大于前一根K线收盘价;当前FrAMA大于前一期FrAMA;当前强力指数大于上一期强力指数值。该条件捕捉短期看涨动量,当价格、FrAMA、强力指数同步上行,代表买盘力量一致。它比特征6更灵敏,因为只检查单周期变化,更适合剥头皮交易或短线交易。

使用时必须确保所有输入数据索引对齐,避免错位比较。由于该形态对单周期变化高度敏感,需要测试信号频率,防止在噪音行情中过度交易。在价格图表上可视化信号,确认其与量价情绪匹配,也是很有帮助的做法。

我们为特征9定义看跌形态条件:当前价格小于前一期价格;当前FrAMA小于前一期FrAMA;当前强力指数小于上一期强力指数。该条件捕捉短期看跌情绪,当三项指标同步下行,代表卖盘力量一致。单周期判断让它对即时下跌行情反应极快。

与看涨形态相同,数据完整性校验和信号频率测试至关重要。看跌信号在波动市场中可能更频繁触发,因此必须分析历史表现来精细调优策略。

由于使用了上文提到的shift函数,我们将输出数组的第一行设为0,然后返回数组作为函数输出。


采用点积核的卷积神经网络

为了扩展FrAMA和强力指数形态的应用,我们选用的机器学习算法是使用点积核的卷积神经网络。我们通过DotProductConv1D类实现该网络。该类基于PyTorch的神经网络模块,将一维卷积与点积注意力机制结合,设计灵感来自Transformer架构。

它处理形状为[批次,通道,序列长度]的输入数据,每个样本输出一个[0, 1]区间的单一预测值:趋近于0将会是看跌预测;趋近于1将会是看涨预测。点积注意力机制让网络能聚焦输入序列的关键部分,而卷积层将数据投影到适合注意力计算的特征空间。

在CNN中使用这种核函数有诸多优势。首先,允许选择性聚焦关键特征。点积注意力计算查询向量与键向量的相似度,让网络更重视关键步骤与特征。这在时间序列中非常有用,例如,高波动周期比平稳周期更具参考价值。其次,引入一种全局上下文感知能力。

不同于传统CNN依赖固定尺寸卷积核与局部感受野,点积注意力允许每个时间步关注所有其他时间步长,无需增大卷积核即可捕捉长程依赖关系。再次,具备动态加权自适应。注意力分数基于输入动态计算,使得模型能自适应数据中的不同模式(如时间序列中多变的市场状态)。 

最后,CNN和点积核优势互补。CNN擅长局部特征提取,点积核擅长全局关系建模。点积注意力在中等序列长度上计算高效,一维卷积降低输入维度,使得整个模型比完整的transformer模型更轻量。该网络类的代码实现如下:

class DotProductConv1D(nn.Module):
    def __init__(self, in_channels=1, out_channels=1, kernel_size=3):
        super().__init__()
        self.kernel_size = kernel_size
        self.padding = kernel_size // 2
        
        # Projections for dot product attention (1D convolution)
        self.query = nn.Conv1d(in_channels, out_channels, kernel_size=1)
        self.key = nn.Conv1d(in_channels, out_channels, kernel_size=1)
        self.value = nn.Conv1d(in_channels, out_channels, kernel_size=1)
        
        # Output projection to produce a single value per sample
        self.proj = nn.Sequential(
            nn.Conv1d(out_channels, 1, kernel_size=1),
            nn.AdaptiveAvgPool1d(1),  # Reduce width to 1 (global average pooling)
            nn.Sigmoid()  # Ensures output in [0, 1]
        )

    def forward(self, x):
        B, C, W = x.shape  # [Batch, Channels, Width]
        
        # Compute Q/K/V (all [B, out_channels, W])
        q = self.query(x)
        k = self.key(x)
        v = self.value(x)
        
        # Dot product attention
        attn = torch.bmm(q.transpose(1, 2), k)  # [B, W, W]
        attn = F.softmax(attn / (W ** 0.5), dim=-1)  # Scaled softmax
        
        # Apply attention to values
        out = torch.bmm(v, attn.transpose(1, 2))  # [B, out_channels, W]
        
        # Project to [B, 1, 1] and squeeze to [B, 1]
        out = self.proj(out)  # [B, 1, 1]
        return out.squeeze(-1)  # [B, 1]

首先,将该类定义为PyTorch中nn.Module的子类。它可以作为一个标准的神经网络模块使用,具备自动参数管理和GPU加速支持。接下来,我们使用以下参数初始化模块:输入通道数、用于注意力映射的输出通道数和用于计算填充的卷积核大小。这些参数定义了网络的容量以及与输入数据的兼容性。之后我们计算填充大小,目的是在卷积后保持输入序列的长度不变,并使用整数除法确保对称填充。

接下来,我们定义三个一维卷积层,用于将输入数据映射为注意力机制所需的Q(查询)、K(键)和V(值) 张量中。每层都使用大小为1的卷积核,相当于对每个时间步长执行线性变换。接下来,定义输出映射流程。将注意力输出的通道数压缩至1。应用全局平均池化,将时间维度压缩为单个值。最后,将输出转换为[0, 1]范围内的单个标量。 

定义好“类初始化”部分后,我们开始编写前向传播函数。在前向函数中,第一步是将形状为[B, C, W]的输入张量"x"传入Q、K、V卷积层,得到三个形状为[B, out_channels, W]的张量。完成后,我们通过批量矩阵乘法(bmm)计算点积注意力分数:将转置后的Q张量[B, W, out_channels]与K张量[B, out_channels, W]相乘,得到形状为[B, W, W]的注意力矩阵。

接下来,我们通过除以序列长度的平方根来对注意力分数应用缩放Softmax,以稳定梯度。最后,在最末一个维度上进行归一化,生成总和为1的注意力权重。前向函数的输出由以下步骤获取:将V张量[B, out_channels, W]与转置后的注意力矩阵[B, W, W]进行批量矩阵乘法,得到形状为[B, out_channels, W]的输出。

再将注意力输出传入输出映射模块(self.proj),得到形状为[B, 1, 1]的张量。在此之后,只需压缩掉最后一维,返回形状为[B, 1]的最终输出。


测试运行

两种特征形态(6和9)的测试运行结果如下:两者均能通过前向测试,但与以往一样,我们的训练仅基于非常有限的数据集。因此,读者在根据测试报告得出任何长期结论之前,必须自行进行更严谨、更全面的测试。

r6

c6

对于形态6。

r9

c9

对于形态9。


结论

我们已经展示了如何借助搭载点积核的机器学习模型,对FrAMA指标与强力指数震荡指标的信号进行扩展应用,并有望从其初步展现的潜力中获取交易收益。本次我们仅测试了形态6和形态9两种,样本十分有限。除了之前未纳入研究的另外8种形态外,仅这两个指标的组合就还有多种其他实现方式值得进一步探索。

名称 描述
wz_66.mq5 由向导生成的EA,其头文件中标注了所引用的包含文件
SignalWZ_66.mqh 自定义信号类文件
66_6.0nnx 形态6 ONNX文件
66_9.onnx 形态9 ONNX文件

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

附加的文件 |
wz_66.mq5 (6.69 KB)
SignalWZ_66.mqh (11.84 KB)
66_6.onnx (29.43 KB)
66_9.onnx (29.43 KB)
交易策略 交易策略
各种交易策略的分类都是任意的,下面这种分类强调从交易的基本概念上分类。
神经网络在交易中的应用:多元时间序列的双重聚类(DUET) 神经网络在交易中的应用:多元时间序列的双重聚类(DUET)
DUET 框架提供了一种创新的时间序列分析方法,该方法结合了时间和通道聚类,以揭示分析数据中的隐藏模式。这使得模型能够随着时间的推移而适应变化,并通过消除噪声来提高预测质量。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
外汇套利交易:汇率关系评估面板 外汇套利交易:汇率关系评估面板
本文介绍了在 MQL5 中开发套利分析面板的过程。如何通过不同方式在外汇交易中获得公允的汇率?制定一个指标,以获取市场价格与公允汇率之间的偏差,并评估一种货币兑换为另一种货币的套利方式(如三角套利)的收益。