English Русский Português
preview
基于Mamba选择性状态空间模型的神经网络交易机器人开发

基于Mamba选择性状态空间模型的神经网络交易机器人开发

MetaTrader 5交易系统 |
31 3
Yevgeniy Koshtenko
Yevgeniy Koshtenko

现代算法交易面临一个根本性难题。基于注意力机制的经典神经网络架构拥有二次计算复杂度O(N²)。也就是说,时间序列长度翻倍,处理耗时会增至原来的四倍。对于需要分析数千根K线历史数据的交易者而言,这种低下的运算效率会成为严重的瓶颈。

设想这样一种场景:您的交易系统需要解析最近2048根价格K线,以此判断是否开仓。Transformer架构为此要执行约400万次注意力计算,处理过程会耗费数秒。在高频交易当中,交易成败由毫秒级时延决定,这类延迟几乎会让策略失去实用价值。

除此之外,当代市场复杂度不断提升,不同品种之间关联性越来越强。想要做好预测,就需要分析跨度越来越大的历史周期,同时兼顾不同资产、不同时间尺度之间的关联关系。传统架构无法应对该挑战,通常将交易者的上下文长度限制在512–1024个时间点。


2024‑2025时间序列预测发展趋势:Mamba

2023年12月,卡内基梅隆大学的研究人员发布了Mamba —— 一套处理序列数据的全新架构。它以选择性状态空间模型(SSM)为基础,兼具高预测精度与线性计算复杂度O(N),这一点使其区别于Transformer系列模型。

在2024‑2025年,时间序列预测领域正在从基于注意力机制的架构转向状态空间模型。原因在于行业需要处理更长、更复杂的序列,金融领域尤为突出,多年度市场周期、品种间联动关系都需要纳入分析。

Mamba是循环架构研究发展的产物。从早期简单RNN,再到LSTM、GRU,之后迎来Transformer与注意力机制的技术变革;研究界逐渐意识到,我们需要一套本质上全新的技术方案。作为Mamba的底层基础,状态空间模型集合了前代各类架构的优势:RNN的运算高效性、LSTM的长记忆能力、Transformer的并行计算特性。

推动这一轮技术演进的现实需求,是对宏观经济周期、长期市场规律的分析。传统模型受限于几百个时间步的上下文窗口,难以捕捉季节效应、多年周期以及跨市场联动关系。Mamba的理论上下文长度不受限制,在保证计算效率的前提下,为分析十年量级历史行情提供了可能性。

其核心思想是“选择性记忆”。模型可以识别重点事件(经济数据发布、危机、技术突破),同时过滤噪声。这对金融数据分析极具价值,因为金融市场经常在平静行情与剧烈突变之间交替切换。Mamba摒弃注意力机制,改用紧凑的隐藏状态;只有出现关键信息时,才对隐藏状态做更新。该设计让模型处理长时序数据时,速度更快、预测效果更好。

// State Space Model fundamental equations
h(t+1) = A·h(t) + B·x(t)    // Update state
y(t) = C·h(t) + D·x(t)      // Output signal

其中,h(t)代表系统在t时刻的隐藏状态,x(t)是输入信号(例如某资产的价格),矩阵A、B、C、D用于定义该系统的动力学特性。

Mamba与前代模型的一项重要区别在于:这些矩阵并非静态不变,而是会根据输入数据自适应变化,以此实现信息处理的选择性。


选择性:实现高效运算的关键

Mamba的核心创新点就是选择性机制。传统状态空间模型会无差别地处理全部输入数据,而Mamba能够区分重要信息与无关信息。这既有助于避免“遗忘”关键事件,又可以防止噪声在隐藏状态中不断累积。

在该选择性机制下,系统参数B和C转变为输入数据的函数:

void ApplySelectiveSSM(Matrix &input_data, Matrix &output) {
    // Dynamic adaptation of parameters
    for(int i = 0; i < input_data.cols; i++) {
        double input_val = input_data.Get(0, i);
        double selection_weight = Sigmoid(input_val);
        
        // Selective updating of parameters
        adaptive_B.Set(i, j, B.Get(i, j) * selection_weight);
        adaptive_C.Set(j, i, C.Get(j, i) * selection_weight);
    }
}

该机制使模型能够“遗忘”无关紧要的信息(例如低波动时期的小幅价格震荡),同时“记住”关键性事件(例如价格剧烈异动或者成交量暴增)。


实战落地:从理论到代码

在MQL5中实现Mamba架构,需要对底层数据结构进行严谨设计。核心组件为Matrix(矩阵)结构体,用来安全地处理多维数组:

struct Matrix {
    double data[];
    int rows, cols;
    
    Matrix() {
        rows = 0; cols = 0;
        ArrayResize(data, 0);
    }
    
    double Get(int r, int c) { 
        if(r < 0 || r >= rows || c < 0 || c >= cols) return 0.0;
        return data[r * cols + c]; 
    }
    
    void Set(int r, int c, double val) { 
        if(r < 0 || r >= rows || c < 0 || c >= cols) return;
        data[r * cols + c] = val; 
    }
};

Mamba块的架构由多个模块组合而成:用于捕捉短期依赖关系的局部卷积、负责实现长程记忆的选择性状态空间模型(SSM),以及用于管控信息流的门控机制。

struct MambaBlock {
    Matrix A, B, C, D;           // SSM parameters
    Matrix conv_weights;         // 1D convolution
    Matrix gate_weights;         // Gating
    Matrix state;               // Hidden state
    
    void Forward(Matrix &input_data, Matrix &output) {
        output.Init(input_data.rows, input_data.cols);
        
        for(int t = 0; t < input_data.rows; t++) {
            // Local processing via convolution
            Matrix conv_out;
            conv_out.Init(1, input_data.cols);
            ApplyConvolution(input_data, t, conv_out);
            
            // Selective processing via SSM
            Matrix gated;
            gated.Init(1, input_data.cols);
            ApplySelectiveSSM(conv_out, gated);
            
            // Residual connection for learning stability
            for(int j = 0; j < input_data.cols; j++) {
                double residual = input_data.Get(t, j);
                double processed = gated.Get(0, j);
                output.Set(t, j, residual + processed * 0.5);
            }
        }
    }
};

A矩阵的初始化需要格外留意。相关研究表明,采用HiPPO(高阶多项式投影算子)初始化方式,可以赋予系统最优的记忆特性。

void InitializeHiPPOMatrix() {
    for(int i = 0; i < SSM_STATE_SIZE; i++) {
        for(int j = 0; j < SSM_STATE_SIZE; j++) {
            if(i == j) {
                A.Set(i, j, -1.0);  // Diagonal stabilization
            } else if(j < i) {
                A.Set(i, j, 0.1 / (i - j + 1));  // HiPPO weights
            }
        }
    }
}

时间序列处理领域的一项关键创新就是分块处理(patching)理念:将长序列切分为若干短片段(块),把每个片段当作单个标记(token)进行处理。该思路借鉴自计算机视觉领域,并由PatchTST改进适配到时间序列任务,能够大幅度降低计算开销。

struct PatchEmbedding {
    Matrix patch_weights;
    Matrix position_embedding;
    
    void Forward(double &time_series[], Matrix &patches) {
        int num_patches = (ArraySize(time_series) / 2) / PATCH_SIZE;
        patches.Init(num_patches, HIDDEN_SIZE);
        
        for(int p = 0; p < num_patches; p++) {
            for(int h = 0; h < HIDDEN_SIZE; h++) {
                double sum = 0.0;
                
                // Handle a patch of PATCH_SIZE
                for(int i = 0; i < PATCH_SIZE; i++) {
                    int price_idx = (p * PATCH_SIZE + i) * 2;
                    int vol_idx = price_idx + 1;
                    
                    if(price_idx < ArraySize(time_series)) {
                        sum += time_series[price_idx] * patch_weights.Get(i * 2, h);
                        sum += time_series[vol_idx] * patch_weights.Get(i * 2 + 1, h);
                    }
                }
                
                // Positional encoding to preserve temporal information
                sum += position_embedding.Get(p, h);
                patches.Set(p, h, sum);
            }
        }
    }
};

分块处理应用在金融时间序列场景中的效果尤为突出。一个包含16个时间步的块,在15分钟K线图上可以代表4小时行情周期,在小时K线图上则可以代表一个完整交易日。这就让模型基于具备实际时序语义的时间单元开展运算,而非单独处理一个个零散的价格点。

训练Mamba架构需要使用现代优化算法。AdamW(带权重衰减的Adam)是经典Adam算法的改进版本,它修正了正则化处理不正确的问题:

void UpdateWeightsAdamW(double grad_scale) {
    step_count++;
    double effective_lr = learning_rate * adaptive_lr_factor;
    double weight_decay = 0.01;
    
    for(int i = 0; i < output_projection.rows; i++) {
        for(int j = 0; j < output_projection.cols; j++) {
            double grad = grad_scale * 0.01;
            double weight = output_projection.Get(i, j);
            
            // Update moments
            double m = beta1 * output_m.Get(i, j) + (1 - beta1) * grad;
            double v = beta2 * output_v.Get(i, j) + (1 - beta2) * grad * grad;
            
            output_m.Set(i, j, m);
            output_v.Set(i, j, v);
            
            // Bias correction
            double m_hat = m / (1 - MathPow(beta1, step_count));
            double v_hat = v / (1 - MathPow(beta2, step_count));
            
            // Update with weight decay
            double update = effective_lr * (m_hat / (MathSqrt(v_hat) + epsilon) + weight_decay * weight);
            output_projection.Set(i, j, weight - update);
        }
    }
}


深度解析架构创新

想要透彻理解Mamba,就需要从数学运算层面剖析它的各个架构组件。选择性机制是它和传统方案的根本区别。在经典状态空间模型中,参数B和C不随时间发生改变,这就导致模型无法适配输入数据流不断变化的特征。

Mamba的选择性机制依靠投影函数实现,这类函数会将输入信号转换为系统参数:

Matrix ComputeSelectiveParameters(Matrix &input_sequence) {
    Matrix selective_B, selective_C;
    selective_B.Init(input_sequence.rows, SSM_STATE_SIZE);
    selective_C.Init(SSM_STATE_SIZE, input_sequence.rows);
    
    for(int t = 0; t < input_sequence.rows; t++) {
        // Projection of the input signal into the parameter space
        double input_norm = 0.0;
        for(int f = 0; f < input_sequence.cols; f++) {
            input_norm += input_sequence.Get(t, f) * input_sequence.Get(t, f);
        }
        input_norm = MathSqrt(input_norm);
        
        // Adaptive scaling of parameters
        double adaptation_factor = Tanh(input_norm * 0.1);
        
        for(int s = 0; s < SSM_STATE_SIZE; s++) {
            selective_B.Set(t, s, base_B.Get(t, s) * adaptation_factor);
            selective_C.Set(s, t, base_C.Get(s, t) * adaptation_factor);
        }
    }
    
    return selective_parameters;
}

该机制让模型可以动态调整对不同输入信息的“敏感度”。放到金融市场场景下,意味着模型在高波动行情阶段可以提高关注度,而在盘整震荡阶段则降低关注度。


硬件感知优化

Mamba能够取得出色效果,其中一个关键因素就是针对现代计算架构做的专项优化。传统SSM需要按时间步顺序串行处理,很难发挥并行计算的优势。Mamba通过并行扫描算法解决了该问题,可以高效利用GPU架构。

void ParallelScanSSM(Matrix &input_sequence, Matrix &output_sequence) {
    int sequence_length = input_sequence.rows;
    Matrix cumulative_states;
    cumulative_states.Init(sequence_length, SSM_STATE_SIZE);
    
    // Phase 1: Upward scan
    for(int level = 0; level < (int)MathLog2(sequence_length); level++) {
        int step_size = 1 << level;
        
        for(int i = step_size; i < sequence_length; i += step_size * 2) {
            // Combine states using an associative operation
            CombineStates(cumulative_states, i - step_size, i);
        }
    }
    
    // Phase 2: Downward propagation
    for(int level = (int)MathLog2(sequence_length) - 1; level >= 0; level--) {
        int step_size = 1 << level;
        
        for(int i = step_size * 3; i < sequence_length; i += step_size * 2) {
            // Propagation of accumulated states
            PropagateStates(cumulative_states, i - step_size, i);
        }
    }
    
    // Generate output sequence
    GenerateOutput(cumulative_states, output_sequence);
}

该实现方案在拥有N个处理器的条件下,处理长度为N的序列可以达到O(log N)的时间复杂度,相较于复杂度为O(N)的串行算法,可显著提升可扩展性能。


高级参数初始化技术

SSM的参数初始化,对于保障训练稳定性以及长程记忆效果起到至关重要的作用。研究表明,采用HiPPO(高阶多项式投影算子)初始化,能够对连续函数实现最优逼近特性:

void InitializeHiPPOAdvanced() {
    // Calculate the optimal HiPPO coefficients
    Matrix legendre_matrix;
    legendre_matrix.Init(SSM_STATE_SIZE, SSM_STATE_SIZE);
    
    for(int n = 0; n < SSM_STATE_SIZE; n++) {
        for(int k = 0; k < SSM_STATE_SIZE; k++) {
            if(n > k) {
                // Coefficients of Legendre polynomials
                double coeff = MathSqrt((2*n + 1) * (2*k + 1));
                if((n - k) % 2 == 1) coeff *= -1;
                legendre_matrix.Set(n, k, coeff);
            } else if(n == k) {
                legendre_matrix.Set(n, k, -(2*n + 1));
            }
        }
    }
    
    // Discretization for digital processing
    double time_scale = 1.0;
    Matrix discrete_A;
    discrete_A.Init(SSM_STATE_SIZE, SSM_STATE_SIZE);
    
    for(int i = 0; i < SSM_STATE_SIZE; i++) {
        for(int j = 0; j < SSM_STATE_SIZE; j++) {
            double continuous_val = legendre_matrix.Get(i, j);
            // Tustin transform for discretization
            double discrete_val = (2.0/time_scale - continuous_val) / (2.0/time_scale + continuous_val);
            discrete_A.Set(i, j, discrete_val);
        }
    }
    
    A = discrete_A;
}

该初始化方式赋予模型高效拟合具备长程依赖关系函数的能力,这对于分析金融时间序列至关重要 —— 金融时序包含复杂的周期成分与趋势成分。


结合多尺度分析

金融市场的特点是在多个不同时间尺度上同时存在行情结构。日线级别趋势可能和周度周期相互矛盾,而周度周期又嵌套在月度、季度的行情模式之中。Mamba架构通过多尺度处理机制,为解决该问题提供了一套简洁高效的实现方案:

struct MultiScaleMambaProcessor {
    MambaBlock scales[4];  // M5, M15, H1, H4
    Matrix fusion_weights;
    
    void Init() {
        // Different parameters for different scales
        for(int i = 0; i < 4; i++) {
            scales[i].Init();
            // Adapt the state size to the time scale
            int scale_state_size = SSM_STATE_SIZE * (i + 1);
            scales[i].ResizeState(scale_state_size);
        }
        
        fusion_weights.Init(4, HIDDEN_SIZE);
        fusion_weights.Random(0.1);
    }
    
    Matrix ProcessMultiScale(double &price_data[], int timeframes[]) {
        Matrix scale_outputs[4];
        
        for(int scale = 0; scale < 4; scale++) {
            // Resample data for the appropriate timeframe
            double resampled_data[];
            ResampleData(price_data, timeframes[scale], resampled_data);
            
            // Process using the corresponding Mamba block
            Matrix scale_input;
            PrepareScaleInput(resampled_data, scale_input);
            scales[scale].Forward(scale_input, scale_outputs[scale]);
        }
        
        // Merge information from different scales
        Matrix fused_output;
        FuseMultiScaleOutputs(scale_outputs, fused_output);
        
        return fused_output;
    }
    
private:
    void FuseMultiScaleOutputs(Matrix scale_outputs[], Matrix &fused) {
        fused.Init(scale_outputs[0].rows, HIDDEN_SIZE);
        
        for(int t = 0; t < fused.rows; t++) {
            for(int h = 0; h < HIDDEN_SIZE; h++) {
                double weighted_sum = 0.0;
                double total_weight = 0.0;
                
                for(int scale = 0; scale < 4; scale++) {
                    if(t < scale_outputs[scale].rows && h < scale_outputs[scale].cols) {
                        double weight = fusion_weights.Get(scale, h);
                        weighted_sum += scale_outputs[scale].Get(t, h) * weight;
                        total_weight += weight;
                    }
                }
                
                fused.Set(t, h, total_weight > 0 ? weighted_sum / total_weight : 0.0);
            }
        }
    }
};

训练Mamba模型需要采用适配SSM架构自身特性的专用方法。其中一项核心难题是循环计算过程中的梯度稳定问题:

void StabilizedTraining(double &training_data[], double targets[]) {
    double gradient_norm_threshold = 1.0;
    double stability_factor = 0.99;
    
    for(int epoch = 0; epoch < training_epochs; epoch++) {
        double epoch_loss = 0.0;
        int batch_count = 0;
        
        for(int batch = 0; batch < num_batches; batch++) {
            // Forward pass with gradient tracking
            Matrix intermediate_states[NUM_LAYERS];
            double prediction = ForwardWithGradientTracing(training_data, intermediate_states);
            
            double loss = ComputeLoss(prediction, targets[batch]);
            epoch_loss += loss;
            
            // Calculate gradients with regularization
            Matrix gradients[NUM_LAYERS];
            ComputeRegularizedGradients(loss, intermediate_states, gradients);
            
            // Check the stability of gradients
            double grad_norm = ComputeGradientNorm(gradients);
            if(grad_norm > gradient_norm_threshold) {
                // Scale gradients to prevent explosion
                ScaleGradients(gradients, gradient_norm_threshold / grad_norm);
            }
            
            // Update parameters with exponential smoothing
            UpdateParametersSmoothed(gradients, stability_factor);
            batch_count++;
        }
        
        double avg_loss = epoch_loss / batch_count;
        
        // Adaptive learning rate correction
        if(epoch > 0 && avg_loss > previous_loss * 1.1) {
            learning_rate *= 0.8;  // Decrease in case of instability
        } else if(avg_loss < previous_loss * 0.95) {
            learning_rate *= 1.05; // Increase with stable improvement
        }
        
        previous_loss = avg_loss;
        
        Print("Epoch ", epoch, " | Loss: ", DoubleToString(avg_loss, 6), 
              " | LR: ", DoubleToString(learning_rate, 6));
    }
}

将Mamba架构集成到生产环境交易系统,需要综合考量诸多实际工程因素。性能监控系统不仅要跟踪模型的预测准确率,还要监控模型内部状态的稳定性:

struct MambaMonitoringSystem {
    double state_stability_threshold;
    double prediction_variance_limit;
    int monitoring_window;
    
    bool MonitorSystemHealth() {
        // Check the stability of internal states
        double state_variance = ComputeStateVariance();
        if(state_variance > state_stability_threshold) {
            Print("WARNING: High state variance detected: ", state_variance);
            return false;
        }
        
        // Analysis of the consistency of predictions
        double prediction_variance = ComputePredictionVariance();
        if(prediction_variance > prediction_variance_limit) {
            Print("WARNING: Prediction instability: ", prediction_variance);
            return false;
        }
        
        // Check gradients for anomalies
        if(DetectGradientAnomalies()) {
            Print("WARNING: Gradient anomalies detected");
            TriggerModelReinitialization();
            return false;
        }
        
        return true;
    }
    
private:
    double ComputeStateVariance() {
        double variance_sum = 0.0;
        for(int layer = 0; layer < NUM_LAYERS; layer++) {
            Matrix layer_state = mamba_layers[layer].GetCurrentState();
            double layer_variance = 0.0;
            double layer_mean = 0.0;
            
            // Calculate the average
            for(int i = 0; i < layer_state.rows * layer_state.cols; i++) {
                layer_mean += layer_state.data[i];
            }
            layer_mean /= (layer_state.rows * layer_state.cols);
            
            // Calculating the variance
            for(int i = 0; i < layer_state.rows * layer_state.cols; i++) {
                double diff = layer_state.data[i] - layer_mean;
                layer_variance += diff * diff;
            }
            layer_variance /= (layer_state.rows * layer_state.cols);
            
            variance_sum += layer_variance;
        }
        
        return variance_sum / NUM_LAYERS;
    }
};


未来研究方向

Mamba架构的发展为后续研究开辟了多个方向。将其与强化学习算法相结合,有望构建出自适应交易智能体,能够在不断变化的市场环境中实现自主学习。

基于Mamba开展小样本学习研究,有望得到仅需少量训练数据,就可以快速适配全新金融品种的模型。这对于新兴市场以及新型加密货币而言有着极高的现实意义。

将Mamba和元学习技术相结合,则有机会打造通用交易系统,无需人工调参,就可以自动适配各类市场行情。


实现方面的实用建议

为测试Mamba在真实交易环境下的表现,相应地开发了这款ModernAI_Expert.mq5 EA。它在MetaTrader 5平台中完整实现了选择性状态空间模型。其目的是演示现代机器学习方法在算法交易当中的实际应用。

该EA遵循纯AI的设计思路:全部交易决策完全依靠神经网络预测结果生成。不同于混合式交易系统,ModernAI_Expert完全依靠Mamba架构挖掘市场数据中的隐藏规律,不使用传统技术指标。这套选择性状态空间模型基础实现最多支持200根输入K线,分析深度可配置;每24小时自动重新训练模型;还具备可自定义置信度阈值的智能信号过滤功能。


ModernAI_Expert内置一套完善的输入数据归一化系统,这对神经网络稳定运行至关重要。系统处理经过归一化的价格变动数据与对数缩放后的成交量,保障训练过程稳定,避免某一类数据在计算中占据主导地位。金融时间序列波动剧烈、行情突发扰动多,该处理方式对此类数据尤为关键。


ModernAI_Expert的核心特性是动态仓位管理。交易手数不只依据标准风控规则,还会参考AI模型输出的置信度。每一笔交易都会附带备注,显示本次决策的置信度,交易者可以实时评判模型决策质量。

另一个重要的特性是智能离场信号。持仓不仅可以通过止损、止盈进行平仓;当模型多空情绪发生转变时同样会触发平仓。多头持仓,如果置信度下跌至40%以下则平仓;空头持仓,如果置信度上升超过60%则平仓。这使得系统可以在传统止损止盈被触发之前,就对市场环境变化做出响应。


结论

Mamba架构解决了Transformer模型二次复杂度这一根本性难题,是算法交易领域的显著突破。线性复杂度O(N)加上选择性记忆机制,让我们可以在保证运算效率的前提下,处理超长时间序列。

以ModernAI_Expert.mq5完成的工程实现证明,该技术已经具备投入生产环境的条件,实现了不依赖传统技术指标的纯AI交易方案。


主要研究结论

Mamba架构最主要的成果是计算层面的突破 —— 从二次复杂度进化到线性复杂度,能够处理数千根K线,而不会显著增加计算负担。选择性记忆机制实现信息自适应筛选,重点捕捉关键行情事件,过滤市场噪声。系统具备良好可扩展性,可以分析长期历史数据,挖掘宏观经济周期规律。

该技术已成功集成至MetaTrader 5,显示出面向生产环境部署的可行性。这标志着交易决策范式的转变:从传统混合策略系统,迈向纯人工智能决策体系。

Mamba开启了算法交易的全新时代,兼顾长序列处理效率与对多变市场环境的自适应能力。


本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/19047

附加的文件 |
最近评论 | 前往讨论 (3)
Борис Ворона
Борис Ворона | 27 8月 2025 在 06:26
编译 ModernTimeSeriesNet.mqh 文件时出现以下错误:- undeclare
Yevgeniy Koshtenko
Yevgeniy Koshtenko | 27 8月 2025 在 07:17
Борис Ворона #:
编译 ModernTimeSeriesNet.mqh 文件时出现错误:- undeclare

您好!我已将最新版本附在文章的新版本中。而在之前的版本中,该专家顾问原本是可以编译通过的,只是问题在于所需变量是在EA中定义的,而不是在mqh文件中定义的)

Борис Ворона
Борис Ворона | 28 8月 2025 在 13:33
Yevgeniy Koshtenko #:

大家好!我已将最新版本附在文章的新版本中。而在之前的版本中,该专家顾问原本就能编译通过,只是问题出在变量是在EA中定义的,而不是在m中定义的

谢谢,现在都正常运行了。

交易策略 交易策略
各种交易策略的分类都是任意的,下面这种分类强调从交易的基本概念上分类。
交易机器人风险管理器(第一部分):EA风控头文件 交易机器人风险管理器(第一部分):EA风控头文件
交易对风控纪律有着极高的要求。本文分析了交易者亏损的主要原因,并针对MQL5平台提出一套技术方案 —— CEnhancedRiskManager(增强型风险管理器)类,并在激进网格EA上完成了实操测试。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
从基础到中级:对象(四) 从基础到中级:对象(四)
这可能是迄今为止最有趣的一篇文章。原因在于,我们将修改 MetaTrader 5 中已有的一个对象,以创建另一个原本不在该平台上的对象。当然,我们接下来要介绍的内容可能看起来有点疯狂,但它确实有效,并且具有非常有趣的用途。