English Русский Português
preview
交易机器人风险管理器(第一部分):EA风控头文件

交易机器人风险管理器(第一部分):EA风控头文件

MetaTrader 5交易系统 |
26 7
Yevgeniy Koshtenko
Yevgeniy Koshtenko

每一位交易者迟早都会认清一个残酷的现实:交易能否成功,并不完全取决于寻找入场点位的能力,更多取决于保全本金的能力。统计数据十分残酷:超过90%的交易者因为缺少有效的风险管理而亏光本金。现在,我们将讲解如何为MetaTrader 5搭建一套专业风险管理系统,该系统甚至可以把风险极高的策略改造为相对安全的盈利工具。


为何风控系统至关重要

结合日常观察以及与各类交易者打交道的经验,让我们来看一下交易中造成亏损的典型诱因。

根据我的观察,大量账户爆仓源于超出合理的单日风险上限。很多交易者开市之初心态平稳,但在第一笔交易亏损之后,情绪因素开始占上风——冲动、急于翻本的心理随之而来。到一天结束时,账户就可能会遭受重大损失。

另一类常见亏损原因是回撤不断累积,却没有相应管控手段。交易者日复一日小幅亏损,总告诉自己“明天就能赚回来”,最终账户缓慢却持续地走向归零。

许多交易者都会遇到心理难题:即便懂风控规则,明白止损、持仓管理的重要性,但在实际做交易决策时,却无法将这些知识落地执行。

值得一提的是,技术故障(网络中断、经纪商或平台报错)在全部亏损诱因中占比相对较低。

经验表明,缺少完善风控体系的交易账户,其生命周期往往十分短暂。

几乎每位新手交易者都会陷入三类经典心理陷阱。第一类,连续盈利之后产生过度乐观心态。连续几笔交易获利后,会产生自己已经看透市场、掌握市场奥秘的错觉。内心会冒出想法:“现在是盈利状态,可以承担更大风险!”于是交易者放大手数、放弃止损、同时大量持仓。结局可想而知:短短一天,就亏掉数周积累的收益。

第二类,寄希望于行情反转。持仓亏损持续扩大,屏幕上的浮亏数值不断走高,但交易者依旧死扛持仓。“马上就要反转了”,“这只是回调”,“行情不可能一直跌”,无数交易者抱着这类想法,直到被保证金追缴(爆仓)终结交易生涯。

第三类陷阱也最隐蔽 —— 无视自己定下的交易规则。交易者搭建交易系统,制定明确的开仓平仓条件,设置风险上限。但某个时刻心里会冒出念头:“能出什么问题呢?偶尔破一次规则没关系。”于是关闭止损、超出最大允许手数、逆势开仓。这必然走向账户溃败,交易者心里明明清楚后果,却无法克制。


技术方案:增强型风险管理器

常年观察以上各类问题之后,我决定开发一套适用于MetaTrader 5的通用风控系统。核心思路是把风险管理完全自动化,消除人为情绪带来的影响。该系统以头文件的形式实现,能够便捷集成到任意现有交易策略,无需大规模改写原有代码。

系统架构设计充分考虑模块化与可扩展性。每个组件各司其职,但同时各模块之间又紧密联动。EnhancedRiskManager.mqh头文件包含核心类,封装了一整套风险管理相关功能。

#property copyright "Copyright 2025, Evgeniy Koshtenko"
#property link      "https://www.mql5.com/en/users/koshtenko"
#property version   "2.0"
#property description "Enhanced Risk Manager with Visual Panel"

#include <Trade\Trade.mqh>

系统支持从保守到激进的多种运行模式。交易者可以根据自身交易经验、账户资金规模,以及对回撤的心理承受能力,选择适配的风险等级。每种模式都配有预设参数,这些参数基于对数千个实盘交易账户的分析完成优化。

enum ENUM_TRADING_MODE {
    MODE_CONSERVATIVE,   // Conservative mode
    MODE_MODERATE,       // Moderate mode  
    MODE_AGGRESSIVE,     // Aggressive mode
    MODE_CUSTOM          // Custom mode
};

保守模式面向新手交易者,以及更看重稳定性而非高收益的使用者。该模式下,单日最大回撤限制为2%,总回撤不得超过6%,单笔交易风险仅设置为1%。这些参数几乎可以杜绝账户爆仓的风险,为交易者留出学习和适应市场的时间。

中等模式是有经验交易者的折中优选。单日回撤上限为5%,总回撤上限为10%,单笔交易风险提升至2%。该参数在潜在收益与本金安全之间实现良好平衡,大多数专业交易者都会使用相近的配置。

激进模式专为愿意承担风险、追求高额收益的人群设计。单日回撤可达10%,总回撤可达20%,单笔交易风险设置为3%。使用这套参数需要极强的心理素质与丰富交易经验,但运用得当可以获得可观收益。

我对风险计算体系做了重点打磨。评估回撤有多种实现思路,每种思路各有优劣。部分交易者倾向于仅基于账户余额计算回撤,忽略浮动盈亏。另一部分交易者只以净值作为计算依据,这种方式能够反映更贴合真实的账户状态。还有组合式计算方案,取两种计算结果中更恶劣的值作为风控判定依据。

enum ENUM_RISK_CALC_TYPE {
    RISK_CALC_BALANCE_ONLY,   // Calculation based solely on balance
    RISK_CALC_EQUITY_ONLY,    // Calculation based solely on equity
    RISK_CALC_COMBINED,       // Combined calculation
    RISK_CALC_ADAPTIVE        // Adaptive calculation
};

自适应计算是我的自研方案。系统会根据当前账户状况自动选择对应的计算方式。如果存在亏损的持仓,就以账户净值作为计算基准,以此把实际浮亏纳入考量。如果持仓为盈利状态,或是没有任何开仓订单,系统则采用账户余额进行计算。该方案可以在风险较高的场景下提供最大限度保护,同时在行情有利时给予合理的交易自由度。

系统的核心是CEnhancedRiskManager类,负责管控风险管理的全部环节。该类保存初始账户余额、当前回撤、已开仓订单数量、时间戳以及大量其他信息。此设计为完全自包含模式:完成初始化之后,不需要外部再对其做额外管理。


CEnhancedRiskManager主类架构

该类遵循面向对象编程原则,各个组件之间职责划分清晰:

class CEnhancedRiskManager {
private:
    // Main parameters
    ENUM_TRADING_MODE    m_tradingMode;
    ENUM_RISK_CALC_TYPE  m_riskCalcType;
    double               m_startingBalance;
    double               m_dailyStartBalance;
    double               m_dailyStartEquity;
    double               m_weeklyStartBalance;
    double               m_weeklyStartEquity;
    
    // Risk limits (in %)
    double               m_maxDailyLoss;      
    double               m_maxTotalLoss;      
    double               m_maxWeeklyLoss;     
    double               m_maxTradeRisk;      
    double               m_trailingStopPercent;

类的构造函数会根据选定的交易模式自动完成全部参数配置。交易者无需手动录入数十项设置,同时也避免了由此带来的潜在参数错误。所有参数值均经过精心筛选,参考了大量盈利交易策略的分析结果以及顶尖交易者的实践建议。

系统仅需调用一次Initialize()方法即可完成初始化。该方法会对运行环境做全面校验、配置全部内部变量、生成可视化仪表盘;如果系统此前运行过,还会加载保存的历史状态。代码对错误处理做了重点优化:一旦出现异常,交易者会收到清晰的问题提示信息。

bool CEnhancedRiskManager::Initialize(double startBalance = 0) {
    // Define the starting balance
    if (startBalance <= 0) {
        m_startingBalance = AccountInfoDouble(ACCOUNT_BALANCE);
    } else {
        m_startingBalance = startBalance;
    }

    // Check validity
    if (m_startingBalance <= 0) {
        Print("❌ RISK MANAGER: Invalid starting balance");
        return false;
    }

主风险校验循环在每个Tick到来时都会执行。它持续校验全部风控参数、更新各项指标、检测风控规则触发情况;必要时会阻止交易,或是平掉高风险持仓。整套运算瞬间完成,不会给系统带来明显的性能负担。

该系统的告警机制颇具特色。并非等到触及风险阈值才直接禁止交易,系统会在临近危险区间时提前向交易者发出预警。当单日回撤达到限制值的80%,界面弹出黄色警告;达到90%时,警告变为橙色;一旦超出风险上限,交易将被完全阻断,并且全部未平仓持仓会被自动平仓。

安全开仓方法把全套风控校验封装到一个简洁函数内。交易者无需自行处理各类风险校验逻辑,只需调用OpenPosition()成员方法,系统就会自动校验全部风控限制、计算合规开仓手数,仅在满足安全条件时才执行交易。

本系统的一项核心特性是重启终端后可保留运行状态。所有关键数据都保存至MetaTrader全局变量中,每个账户使用独有的前缀做区分。也就是说,即便重启电脑或是更新EA,系统依然可以准确读取今日已开仓数量、当前回撤数值,以及是否触发过风控限制。

// In the EA: check before opening
if(!RiskManager.CanOpenPosition(lotSize, Symbol())) {
    return false; // Block a dangerous operation
}


实际应用:驯服马丁格尔策略

为展示这套系统的真实能力,我做了一组极限测试。选用风险等级最高的一类策略作为测试对象:带马丁格尔的激进网格策略。该策略逻辑:每一笔交易亏损后,下一次就增加持仓。理论上,只需要一次盈利就可以挽回之前全部亏损。但在实盘当中,这套策略几乎必然会亏掉账户本金。

用于本次测试的AggressiveGridEA,集齐了风险极高的策略的全部特征。将马丁格尔乘数设置为1.5,网格后续每一档持仓,手数放大至前一档的1.5倍;网格步长仅为200点,因此会频繁开仓;EA最多同时持有8笔持仓;当回撤超过1.5%时,会开启激进修复模式,手数直接翻倍;最关键的一点是,策略本身没有设置止损。

该配置如果不叠加风控系统,账户100%会爆仓。这并非夸大其词:我使用9年历史数据回测该EA,不接入风险管理器时,账户存活时间从未超过一周。

将风控系统集成进来的过程十分简便,只需要在EA的关键位置增加少量代码。每一次开仓之前,EA会向风险管理器申请开仓许可,如果系统判定这笔交易风险过高,则禁止建立该持仓。


测试结果

测试结果远超预期。不启用风控系统时,账户平均存活周期仅为3.2天。最大回撤达到100%,也就是本金全部亏光。直到追加保证金通知为其交易生涯画上句号。

接入增强型风险管理器之后,情况发生了根本性改变。在完整9年的测试周期内,账户始终保持盈利。单日最大回撤为4.8%,略低于设定的5%上限。账户总最大回撤为9.7%,并未突破10%的临界阈值。最令人惊喜的是,整个测试周期最终收益达到 127%。

该套系统是如何驯服这类高风险策略的?第一,拦截高风险持仓的开仓动作。当网格订单的持仓规模即将逼近单笔交易2%的风险上限时,系统直接禁止开仓,避免亏损不受控制地持续放大。

第二,出现临界回撤时自动强制平仓。当单日回撤达到4.5%时,系统会强制平掉全部持仓,预留一小段缓冲空间,避免直接触碰风控临界线。从而避免交易被彻底锁定,并为次日恢复交易留出空间。

第三,限制激进的亏损修复行为。原本亏损时的持仓加倍功能,只能在整体风控约束范围内生效。一旦整体风险临近危险阈值,该加仓功能会被自动禁用。

最后,对已实现收益进行保护。当单日盈利达到3%时,会触发一套专门的盈利保护追踪止损机制,保护部分收益,防止行情回吐利润。即便在市场剧烈波动的交易日,也能锁住部分盈利。

作为对照,下面是同一EA在没有风险管理器保驾护航时的测试结果:


防护机制实际运行效果

该系统的各层级防护均表现出良好的效果:

  • 拦截高风险持仓开仓:当单笔交易风险即将逼近2%限制时,系统自动阻止新增网格档位,避免亏损持续扩大。
  • 临界回撤自动平仓:单日回撤达到4.5%时,系统强制平掉全部持仓,距离5%的临界风险线保留一小段缓冲余量。
  • 激进修复行为管控:亏损状态下的持仓加倍功能受整体风控规则约束,杜绝毁灭性亏损。
  • 单日盈利移动止盈:盈利达到3%时,触发保护机制,在行情发生回吐时锁定一部分收益。


实操测试得出的结论

针对激进网格EA的测试有力证明:在极端场景下,增强型风险管理器具备可靠的防护能力。该系统不仅规避了毁灭性亏损,还能够让策略在严格的风控框架之下保持盈利能力。

尤为重要的一点是,系统全程全自动运行,出现危急状况时无需交易者手动介入。这对于网格策略意义重大,这类策略在行情压力下,交易者的情绪往往会催生错误决策。

测试结果证实:增强型风险管理器,即便是风险最为激进的交易策略,也能够对其进行约束管控!


结论

该套自研的增强型风险管理器,是一套解决交易风险管理问题的完整方案。它将风控流程完全自动化,消除人为因素以及情绪化交易决策带来的影响。选用风险最高的马丁‑格尔网格策略开展的实操测试充分证明:即便处于极端行情条件下,该系统依旧可以稳定发挥防护作用。

专业的交易,始于专业的风险管理。即便您的入场策略再出色,如果缺少完善的风控体系,迟早也会亏掉账户本金。增强型风险管理器接管全部重复性的风控工作,让交易者可以把精力集中在市场分析与交易决策上。

该系统已公开提供,任何人都可以将其应用到自己的交易当中。代码附带详尽注释,便于理解内部逻辑,也可以根据自身需求做二次修改适配。建议从保守模式起步,随着交易经验积累再逐步调高风险等级。请时刻牢记:保全本金,远比追求眼前的收益更加重要。

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

附加的文件 |
最近评论 | 前往讨论 (7)
Aleksander Gladkov
Aleksander Gladkov | 11 8月 2025 在 21:02

您好,感谢您的付出!

不过,希望能看到与文章中描述相对应的类代码,例如

在文章中:

enum ENUM_RISK_CALC_TYPE {
    RISK_CALC_BALANCE_ONLY,   // 仅根据余额进行计算
    RISK_CALC_EQUITY_ONLY,    // 仅基于权益进行计算
    RISK_CALC_COMBINED,       // 组合计算
    RISK_CALC_ADAPTIVE        // 自适应计算
};

在附带的文件中:

enum ENUM_RISK_CALC_TYPE {
    RISK_CALC_BALANCE_ONLY,   // Only Balance
    RISK_CALC_EQUITY_ONLY,    // Only Equity
    RISK_CALC_BALANCE_EQUITY, // Balance/Equity (US Prop Style)
    RISK_CALC_PROP_STANDARD   // Standard Prop Company Rules
};

文章中提到的“自适应计算”在附带的类代码中并未体现。

此外,代码中存在一个错误,导致无法编译专家顾问代码:

// Trading Object
    CTrade              m_trade;

应在 public 部分中:

请检查一下。

Борис Ворона
Борис Ворона | 12 8月 2025 在 06:04
我的代码也无法编译,卡在第124行: 123 // 为交易对象设置魔法数字
124 g_RiskManager.m_trade.SetExpertMagicNumber(InpMagicNumber);
Aleksander Gladkov
Aleksander Gladkov | 12 8月 2025 在 06:37
Борис Ворона #:
我的代码也无法编译,卡在第124行: 123 // 为交易对象设置魔术数字
124 g_RiskManager.m_trade.SetExpertMagicNumber(InpMagicNumber);
请将 EnhancedPropRiskManager.mqh 类描述文件中 private: 部分的“CTrade m_trade;”这一行移至 public: 部分:
Борис Ворона
Борис Ворона | 12 8月 2025 在 09:50
谢谢,现在能编译了。不过自适应版本还是无法编译。
Aleksander Gladkov
Aleksander Gladkov | 5 9月 2025 在 09:39

将风险管理器应用于我正在运行的马丁格尔策略交易顾问

以下是未启用风险管理器的2025回测结果:

而这是采用最佳风险管理器设置后的结果:

如您所见,最大回撤减少了一半,而盈利增加了三倍。

基于Mamba选择性状态空间模型的神经网络交易机器人开发 基于Mamba选择性状态空间模型的神经网络交易机器人开发
本文探究可用于金融时间序列预测的创新性Mamba/SSM神经网络架构。我们将完整介绍该模型在MQL5平台下的实现方案,它是Transformer的现代替代方案,计算复杂度为线性O(N),而非二次复杂度O(N²)。还会详细讲解选择性状态空间模型、硬件感知优化、分块处理,以及先进的AdamW训练算法。并附带实测结果:模型预测准确率由62%提升至71%,同时训练耗时从45分钟缩短至8分钟。本文提供一个现成的MetaTrader 5交易EA,具备自动训练与自适应风险管理能力。
从基础到中级:对象(四) 从基础到中级:对象(四)
这可能是迄今为止最有趣的一篇文章。原因在于,我们将修改 MetaTrader 5 中已有的一个对象,以创建另一个原本不在该平台上的对象。当然,我们接下来要介绍的内容可能看起来有点疯狂,但它确实有效,并且具有非常有趣的用途。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
MQL5交易工具(第八部分):具备可拖拽与可最小化功能的增强型信息仪表盘 MQL5交易工具(第八部分):具备可拖拽与可最小化功能的增强型信息仪表盘
在本文中,我们将开发一套增强型信息仪表盘。该版本在上一篇内容的基础上进行升级,新增可拖拽和最小化功能以优化用户交互,同时保持对多品种持仓与账户指标的实时监控能力。