风险管理(第五部分):将风险管理系统集成到 EA 中·进阶篇
📘

风险管理(第五部分):将风险管理系统集成到 EA 中·进阶篇

第 2/3 篇

◍ EA 参数骨架与订单区块识别配置

在 MT5 里从模板新建 EA 时,只勾选 OnTradeTransaction 事件就够了,其余定时器、Tick 事件先留空,避免无谓开销。随后要定义一套与订单区块指标对齐的参数,让 EA 能独立识别并绘制区块矩形。 先落通用参数:Magic 设 545244 用于区分其他策略订单;timeframe_order_block 默认 PERIOD_M5 决定区块检测周期;Rango_universal_busqueda=500 表示向历史回看 500 根 K 线寻找潜在区块。Witdth_order_block=1 控制矩形边框粗细,Back_order_block 与 Fill_order_block 开关背景和填充,涨跌区块分别用 clrRed / clrGreen。 止盈止损有两种算法,由枚举 ENUM_TP_SL_STYLE 切换:ATR 模式用 Atr_Multiplier_1=1.5、Atr_Multiplier_2=2.0 乘波动率;POINT 模式直接读 TP_POINT 与 SL_POINT,默认都是 1000 点。手数方面 Lote_Type 默认 Dinamico,固定手数时才用 lote=0.1。 下面这段代码就是上述参数的 MQL5 声明,注意 sinput group 仅作面板分组、不进优化。外汇与贵金属杠杆高,参数回看范围过大会拖慢 MT5 每次报价的计算,实盘前建议先缩小 Rango_universal_busqueda 到 200 测帧率。

MQL5 / C++
enum ENUM_TP_SL_STYLE
{
  ATR = class="num">0,
  POINT = class="num">1
};
input class="type">ulong Magic = class="num">545244; class=class="str">"cmt">//Magic number
input ENUM_TIMEFRAMES timeframe_order_block = PERIOD_M5; class=class="str">"cmt">//Order block timeframe
sinput group "-- Order Block --"
input class="type">int  Rango_universal_busqueda = class="num">500; class=class="str">"cmt">//search range of order blocks
input class="type">int  Witdth_order_block = class="num">1; class=class="str">"cmt">//Width order block
input class="type">bool Back_order_block = true; class=class="str">"cmt">//Back order block?
input class="type">bool Fill_order_block = true; class=class="str">"cmt">//Fill order block?
input class="type">class="kw">color Color_Order_Block_Bajista = clrRed; class=class="str">"cmt">//Bearish order block class="type">class="kw">color
input class="type">class="kw">color Color_Order_Block_Alcista = clrGreen; class=class="str">"cmt">//Bullish order block class="type">class="kw">color
sinput group "-- Strategy --"
input ENUM_TP_SL_STYLE tp_sl_style = POINT;class=class="str">"cmt">//tp and sl style
sinput group "- ATR "
input class="type">class="kw">double Atr_Multiplier_1 = class="num">1.5;class=class="str">"cmt">//Atr multiplier class="num">1
input class="type">class="kw">double Atr_Multiplier_2 = class="num">2.0;class=class="str">"cmt">//Atr multiplier class="num">2
sinput group "- POINT "
input class="type">int TP_POINT = class="num">1000; class=class="str">"cmt">//TL in Points
input class="type">int SL_POINT = class="num">1000; class=class="str">"cmt">//SL in Points
input ENUM_LOTE_TYPE Lote_Type = Dinamico; class=class="str">"cmt">//Lote Type
input class="type">class="kw">double lote = class="num">0.1; class=class="str">"cmt">//lot size(only for fixed lot)

「EA 风控参数的分组输入逻辑」

这段 MQL5 输入段把账户风控拆成了几组独立开关:先选风险模式(个人户 or Prop Firm),再决定手数怎么算,后面紧跟 ML / MWL / MDL 三组最大亏损限额。 ML、MWL、MDL 三组都用了同样的字段结构:percentage_or_money_xxx_input 填 0 即不启用该限额;mode_calculation_xxx 选按百分比还是金额;applied_percentages_xxx 指定百分比基于余额还是净值。外汇与贵金属杠杆高,实盘前务必确认这三组限额不会在同一笔回撤里叠加击穿账户。 GMLPO 是单笔总亏损上限,mode_gmlpo 给了三种动态模式枚举。DYNAMIC_GMLPO_FULL_CUSTOM 下用 str_percentages_to_be_reviewed="2,5,7,9" 和 str_percentages_to_apply="1,0.7,0.5,0.33" 做阈值联动:权益跌破 2% 阈值后,后续单笔风险自动降到原比例的 1,跌破 5% 降到 0.7,以此类推。revision_type_gmlpo 控制是平仓时还是每个 tick 检查,默认平仓时检查更省算力。 开 MT5 把这段代码贴进 EA 输入区,改 prop_firm_balance=1000 与百分比串,就能直接验证动态降险是否在回测里按预期触发。

MQL5 / C++
input ENUM_MODE_RISK_MANAGEMENT risk_mode = personal_account;class=class="str">"cmt">//type of risk management mode
input ENUM_GET_LOT get_mode = GET_LOT_BY_STOPLOSS_AND_RISK_PER_OPERATION; class=class="str">"cmt">//How to get the lot
input class="type">class="kw">double prop_firm_balance = class="num">1000; class=class="str">"cmt">//If risk mode is Prop Firm FTMO, then put your ftmo account balance
sinput group "- ML/Maxium loss/Maxima perdida -"
input class="type">class="kw">double percentage_or_money_ml_input = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used ML)
input ENUM_RISK_CALCULATION_MODE mode_calculation_ml = percentage; class=class="str">"cmt">//Mode calculation Max Loss
input ENUM_APPLIED_PERCENTAGES applied_percentages_ml = Balance; class=class="str">"cmt">//ML percentage applies to:
sinput group "- MWL/Maximum weekly loss/Perdida maxima semanal -"
input class="type">class="kw">double percentage_or_money_mwl_input  = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used MWL)
input ENUM_RISK_CALCULATION_MODE mode_calculation_mwl = percentage; class=class="str">"cmt">//Mode calculation Max weekly Loss
input ENUM_APPLIED_PERCENTAGES applied_percentages_mwl = Balance;class=class="str">"cmt">//MWL percentage applies to:
sinput group "- MDL/Maximum  daily loss/Perdida maxima diaria -"
input class="type">class="kw">double percentage_or_money_mdl_input  = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used MDL)
input ENUM_RISK_CALCULATION_MODE mode_calculation_mdl = percentage; class=class="str">"cmt">//Mode calculation Max daily loss
input ENUM_APPLIED_PERCENTAGES applied_percentages_mdl = Balance;class=class="str">"cmt">//MDL percentage applies to:
class=class="str">"cmt">//--- Enumeration of the types of dynamic operational risk
enum ENUM_OF_DYNAMIC_MODES_OF_GMLPO
{
  DYNAMIC_GMLPO_FULL_CUSTOM, class=class="str">"cmt">//Customisable dynamic risk per operation
  DYNAMIC_GMLPO_FIXED_PARAMETERS,class=class="str">"cmt">//Risk per operation with fixed parameters
  NO_DYNAMIC_GMLPO class=class="str">"cmt">//No dynamic risk for risk per operation
};
class=class="str">"cmt">//--- Enumeration to determine when to review a decrease in the initial balance to modify the risk per operation
enum ENUM_REVISION_TYPE
{
  REVISION_ON_CLOSE_POSITION, class=class="str">"cmt">//Check GMLPO only when closing positions
  REVISION_ON_TICK class=class="str">"cmt">//Check GMLPO on all ticks
};
sinput group "- GMLPO/Gross maximum loss per operation/Porcentaje a arriesgar por operacion -"
input ENUM_OF_DYNAMIC_MODES_OF_GMLPO mode_gmlpo = DYNAMIC_GMLPO_FULL_CUSTOM; class=class="str">"cmt">//Select GMLPO mode:
input ENUM_REVISION_TYPE revision_type_gmlpo = REVISION_ON_CLOSE_POSITION; class=class="str">"cmt">//Type revision
input class="type">class="kw">double percentage_or_money_gmlpo_input  = class="num">1.0; class=class="str">"cmt">//percentage or money(class="num">0 => not used GMLPO)
input ENUM_RISK_CALCULATION_MODE mode_calculation_gmlpo = percentage; class=class="str">"cmt">//Mode calculation Max Loss per operation
input ENUM_APPLIED_PERCENTAGES applied_percentages_gmlpo = Balance;class=class="str">"cmt">//GMPLO percentage applies to:
sinput group "-- Optional GMLPO settings, Dynamic GMLPO"
sinput group "--- Full customizable dynamic GMLPO"
input class="type">class="kw">string note1 = "subtracted from your total balance to establish a threshold.";  class=class="str">"cmt">//This parameter determines a specific percentage that will be
input class="type">class="kw">string str_percentages_to_be_reviewed = "class="num">2,class="num">5,class="num">7,class="num">9"; class=class="str">"cmt">//percentages separated by commas.
input class="type">class="kw">string note2 = "a new risk level will be triggered on your future trades: "; class=class="str">"cmt">//When the current balance(equity) falls below this threshold
input class="type">class="kw">string str_percentages_to_apply = "class="num">1,class="num">0.7,class="num">0.5,class="num">0.33"; class=class="str">"cmt">//percentages separated by commas.
input class="type">class="kw">string note3 = "class="num">0 in both parameters => do not use dynamic risk in gmlpo"; class=class="str">"cmt">//Note:
sinput group "--- Fixed dynamic GMLPO with parameters"
sinput group "- class="num">1 -"

阶梯式回撤触发的风险参数与OB捕捉设定

这段输入参数把「账户回撤深度」和「单笔风险百分比」绑成了一条阶梯曲线。当净值回撤触及 2%、5%、7%、9% 这四个阈值时,GMLPO 风险系数会分别从基准被改写成 1.0%、0.7%、0.5%、0.33%——越亏越收手,逻辑上倾向降低连亏放大。 外汇与贵金属属高杠杆品种,这类自动降险参数只是概率层面的缓冲,不保证避免爆仓。MDP(单日最大盈利)模块默认严格模式开启,percentage_or_money_mdp_input 设为 0 表示暂不限制日内利润封顶,交易者可按自己资金曲线手动填百分比或金额。 交易时段被钉在 16:30 至 18:00(服务器时),Order Block 逻辑跑在 M5 周期,Magic 号固定 545244。OB 搜索跨度给到 500 根 K 线,块宽 1 根,允许回画与填充,熊块标红。开 MT5 把这段直接贴进 EA 输入区,改 Rango_universal_busqueda 到 200 看 OB 识别密度变化,是验证参数敏感度的快办法。

MQL5 / C++
input class="type">class="kw">string note1_1 = "subtracted from your total balance to establish a threshold.";   class=class="str">"cmt">//This parameter determines a specific percentage that will be
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_1 = class="num">2.0; class=class="str">"cmt">//percentage class="num">1 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">string note2_1 = "a new risk level will be triggered on your future trades: "; class=class="str">"cmt">//When the current balance(equity) falls below this threshold
input class="type">class="kw">double inp_percentage_to_be_modified_1 = class="num">1.0;class=class="str">"cmt">//new percentage class="num">1 to which the gmlpo is modified
sinput group "- class="num">2 -"
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_2 = class="num">5.0;class=class="str">"cmt">//percentage class="num">2 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">double inp_percentage_to_be_modified_2 = class="num">0.7;class=class="str">"cmt">//new percentage class="num">2 to which the gmlpo is modified
sinput group "- class="num">3 -"
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_3 = class="num">7.0;class=class="str">"cmt">//percentage class="num">3 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">double inp_percentage_to_be_modified_3 = class="num">0.5;class=class="str">"cmt">//new percentage class="num">3 to which the gmlpo is modified
sinput group "- class="num">4 -"
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_4 = class="num">9.0;class=class="str">"cmt">//percentage class="num">4 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">double inp_percentage_to_be_modified_4 = class="num">0.33;class=class="str">"cmt">//new percentage class="num">4 class="num">1 to which the gmlpo is modified
sinput group "- MDP/Maximum daily profit/Maxima ganancia diaria -"
input class="type">bool mdp_is_strict = true; class=class="str">"cmt">//MDP is strict?
input class="type">class="kw">double percentage_or_money_mdp_input = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used MDP)
input ENUM_RISK_CALCULATION_MODE mode_calculation_mdp = percentage; class=class="str">"cmt">//Mode calculation Max Daily Profit
input ENUM_APPLIED_PERCENTAGES applied_percentages_mdp = Balance;class=class="str">"cmt">//MDP percentage applies to:
sinput group "--- Session ---"
input       class="type">char hora_inicio = class="num">16;class=class="str">"cmt">//start hour to operate(class="num">0-class="num">23)
input       class="type">char min_inicio = class="num">30;class=class="str">"cmt">//start minute to operate(class="num">0-class="num">59)
input       class="type">char hora_fin = class="num">18;class=class="str">"cmt">//end hour to operate(class="num">1-class="num">23)
input       class="type">char min_fin =class="num">0;class=class="str">"cmt">//end minute to operate(class="num">0-class="num">59)
sinput group "--- Order Block EA settings ---"
input class="type">ulong Magic = class="num">545244; class=class="str">"cmt">//Magic number
input ENUM_TIMEFRAMES timeframe_order_block = PERIOD_M5; class=class="str">"cmt">//Order block timeframe
sinput group "-- Order Block --"
input class="type">int  Rango_universal_busqueda = class="num">500; class=class="str">"cmt">//search range of order blocks
input class="type">int  Witdth_order_block = class="num">1; class=class="str">"cmt">//Width order block
input class="type">bool Back_order_block = true; class=class="str">"cmt">//Back order block?
input class="type">bool Fill_order_block = true; class=class="str">"cmt">//Fill order block?
input class="type">class="kw">color Color_Order_Block_Bajista = clrRed; class=class="str">"cmt">//Bearish order block class="type">class="kw">color

◍ EA 参数面板里的风控与止损逻辑

这段输入变量定义了 MT5 EA 在加载时的外部配置,核心落在订单块颜色、止盈止损算法和三层风控阈值。看懂这些 input/sinput 分组,你才能在策略测试器里不盲调。

MQL5 / C++
input class="type">class="kw">color Color_Order_Block_Alcista = clrGreen; class=class="str">"cmt">// 看涨订单块绘制颜色,默认绿
input ENUM_TP_SL_STYLE tp_sl_style = POINT; class=class="str">"cmt">// 止盈止损计算方式,默认按点数
input class="type">class="kw">double Atr_Multiplier_1 = class="num">1.5; class=class="str">"cmt">// ATR 止损倍数一,取 class="num">1.5 倍
input class="type">class="kw">double Atr_Multiplier_2 = class="num">2.0; class=class="str">"cmt">// ATR 止盈倍数二,取 class="num">2.0 倍
input class="type">int TP_POINT = class="num">1000; class=class="str">"cmt">// 点数模式下的止盈距离,class="num">1000 点
input class="type">int SL_POINT = class="num">1000; class=class="str">"cmt">// 点数模式下的止损距离,class="num">1000 点
input ENUM_LOTE_TYPE Lote_Type = Dinamico; class=class="str">"cmt">// 仓位类型,默认动态
input class="type">class="kw">double lote = class="num">0.1; class=class="str">"cmt">// 固定仓位的手数,仅固定模式生效
input ENUM_MODE_RISK_MANAGEMENT risk_mode = personal_account; class=class="str">"cmt">// 风控模式,默认个人账户
input class="type">class="kw">double prop_firm_balance = class="num">1000; class=class="str">"cmt">// 若走 FTMO 等 prop firm 模式填账户余额
input class="type">class="kw">double percentage_or_money_ml_input = class="num">0; class=class="str">"cmt">// 最大总亏损阈值,class="num">0 表示不限制
input class="type">class="kw">double percentage_or_money_mdl_input = class="num">0; class=class="str">"cmt">// 最大日亏损阈值,class="num">0 表示不限制
input class="type">class="kw">double percentage_or_money_mwl_input = class="num">0; class=class="str">"cmt">// 最大周亏损阈值,class="num">0 表示不限制
input class="type">class="kw">double percentage_or_money_gmlpo_input = class="num">1.0; class=class="str">"cmt">// 单笔最大亏损占余额比,默认 class="num">1%
input class="type">class="kw">string str_percentages_to_be_reviewed = "class="num">2,class="num">5,class="num">7,class="num">9"; class=class="str">"cmt">// 动态降险触发线:回撤 class="num">2/class="num">5/class="num">7/class="num">9% 时换挡
注意 Atr_Multiplier_1=1.5 与 Atr_Multiplier_2=2.0 只在 tp_sl_style 切到 ATR 时生效;若保持 POINT,则 TP_POINT/SL_POINT 的 1000 点会直接覆盖。外汇与贵金属杠杆高,1000 点止损在黄金上可能对应数十美元浮亏,开实盘前先用策略测试器跑一遍。 动态 GMLPO 的 str_percentages_to_be_reviewed 写了 "2,5,7,9",意思是权益较余额回撤到这些百分比时,后续新单的风险档位会逐级收紧。这种机制倾向降低连亏扩张的概率,但是否有效取决于行情波动结构,需你用历史数据自行验证。

MQL5 / C++
input class="type">class="kw">color Color_Order_Block_Alcista = clrGreen; class=class="str">"cmt">//Bullish order block class="type">class="kw">color
sinput group "-- Strategy --"
input ENUM_TP_SL_STYLE tp_sl_style = POINT;class=class="str">"cmt">//tp and sl style
sinput group "- ATR "
input class="type">class="kw">double Atr_Multiplier_1 = class="num">1.5;class=class="str">"cmt">//Atr multiplier class="num">1
input class="type">class="kw">double Atr_Multiplier_2 = class="num">2.0;class=class="str">"cmt">//Atr multiplier class="num">2
sinput group "- POINT "
input class="type">int TP_POINT = class="num">1000; class=class="str">"cmt">//TL in Points
input class="type">int SL_POINT = class="num">1000; class=class="str">"cmt">//SL in Points
sinput group "--- Risk Management ---"
input ENUM_LOTE_TYPE Lote_Type = Dinamico; class=class="str">"cmt">//Lote Type
input class="type">class="kw">double lote = class="num">0.1; class=class="str">"cmt">//lot size(only for fixed lot)
input ENUM_MODE_RISK_MANAGEMENT risk_mode = personal_account;class=class="str">"cmt">//type of risk management mode
input ENUM_GET_LOT get_mode = GET_LOT_BY_STOPLOSS_AND_RISK_PER_OPERATION; class=class="str">"cmt">//How to get the lot
input class="type">class="kw">double prop_firm_balance = class="num">1000; class=class="str">"cmt">//If risk mode is Prop Firm FTMO, then put your ftmo account balance
sinput group "- ML/Maxium loss/Maxima perdida -"
input class="type">class="kw">double percentage_or_money_ml_input = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used ML)
input ENUM_RISK_CALCULATION_MODE mode_calculation_ml = percentage; class=class="str">"cmt">//Mode calculation Max Loss
input ENUM_APPLIED_PERCENTAGES applied_percentages_ml = Balance; class=class="str">"cmt">//ML percentage applies to:
sinput group "- MWL/Maximum weekly loss/Perdida maxima semanal -"
input class="type">class="kw">double percentage_or_money_mwl_input  = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used MWL)
input ENUM_RISK_CALCULATION_MODE mode_calculation_mwl = percentage; class=class="str">"cmt">//Mode calculation Max weekly Loss
input ENUM_APPLIED_PERCENTAGES applied_percentages_mwl = Balance;class=class="str">"cmt">//MWL percentage applies to:
sinput group "- MDL/Maximum  daily loss/Perdida maxima diaria -"
input class="type">class="kw">double percentage_or_money_mdl_input  = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used MDL)
input ENUM_RISK_CALCULATION_MODE mode_calculation_mdl = percentage; class=class="str">"cmt">//Mode calculation Max daily loss
input ENUM_APPLIED_PERCENTAGES applied_percentages_mdl = Balance;class=class="str">"cmt">//MDL percentage applies to:
sinput group "- GMLPO/Gross maximum loss per operation/Porcentaje a arriesgar por operacion -"
input ENUM_OF_DYNAMIC_MODES_OF_GMLPO mode_gmlpo = DYNAMIC_GMLPO_FULL_CUSTOM; class=class="str">"cmt">//Select GMLPO mode:
input ENUM_REVISION_TYPE revision_type_gmlpo = REVISION_ON_CLOSE_POSITION; class=class="str">"cmt">//Type revision
input class="type">class="kw">double percentage_or_money_gmlpo_input  = class="num">1.0; class=class="str">"cmt">//percentage or money(class="num">0 => not used GMLPO)
input ENUM_RISK_CALCULATION_MODE mode_calculation_gmlpo = percentage; class=class="str">"cmt">//Mode calculation Max Loss per operation
input ENUM_APPLIED_PERCENTAGES applied_percentages_gmlpo = Balance;class=class="str">"cmt">//GMPLO percentage applies to:
sinput group "-- Optional GMLPO settings, Dynamic GMLPO"
sinput group "--- Full customizable dynamic GMLPO"
input class="type">class="kw">string note1 = "subtracted from your total balance to establish a threshold.";  class=class="str">"cmt">//This parameter determines a specific percentage that will be
input class="type">class="kw">string str_percentages_to_be_reviewed = "class="num">2,class="num">5,class="num">7,class="num">9"; class=class="str">"cmt">//percentages separated by commas.
input class="type">class="kw">string note2 = "a new risk level will be triggered on your future trades: "; class=class="str">"cmt">//When the current balance(equity) falls below this threshold

「GMLPO 动态降险与时段参数的实盘接法」

这段输入参数定义了 GMLPO 策略在净值回撤时逐级收缩风险的机制。核心思路是:当账户权益较初始余额下跌到特定百分比阈值以下,后续订单的手数风险比例自动调低,而不是死扛原始仓位。 str_percentages_to_apply 默认给的是 "1,0.7,0.5,0.33",对应四级风险档位。inp_balance_percentage_to_activate_the_risk_1 到 _4 分别是 2.0、5.0、7.0、9.0,意思是权益比初始余额低 2% 触发第一档(风险降到 1.0),低 5% 触发第二档(0.7),低 7% 第三档(0.5),低 9% 第四档(0.33)。若两个相关参数都填 0,则不使用动态风险,按原比例跑。 最大日盈利(MDP)模块里 percentage_or_money_mdp_input 设为 0 即不限制;非 0 时按 Balance 或 Equity 计算,mode_calculation_mdp 选 percentage 就以百分比封顶。外汇与贵金属波动剧烈,这类自动降险只能降低概率性爆仓风险,不保证不亏。 交易时段由 hora_inicio=16、min_inicio=30、hora_fin=18、min_fin=0 锁死,只在 16:30–18:00 之间下单。你打开 MT5 把这几行贴进 EA 输入区,改改百分比和时段,就能验证自己的经纪商点差下触发逻辑是否如预期。

MQL5 / C++
input class="type">class="kw">string str_percentages_to_apply = "class="num">1,class="num">0.7,class="num">0.5,class="num">0.33"; class=class="str">"cmt">//percentages separated by commas.
input class="type">class="kw">string note3 = "class="num">0 in both parameters => do not use dynamic risk in gmlpo"; class=class="str">"cmt">//Note:
sinput group "--- Fixed dynamic GMLPO with parameters"
sinput group "- class="num">1 -"
input class="type">class="kw">string note1_1 = "subtracted from your total balance to establish a threshold.";  class=class="str">"cmt">//This parameter determines a specific percentage that will be
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_1 = class="num">2.0; class=class="str">"cmt">//percentage class="num">1 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">string note2_1 = "a new risk level will be triggered on your future trades: "; class=class="str">"cmt">//When the current balance(equity) falls below this threshold
input class="type">class="kw">double inp_percentage_to_be_modified_1 = class="num">1.0;class=class="str">"cmt">//new percentage class="num">1 to which the gmlpo is modified
sinput group "- class="num">2 -"
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_2 = class="num">5.0;class=class="str">"cmt">//percentage class="num">2 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">double inp_percentage_to_be_modified_2 = class="num">0.7;class=class="str">"cmt">//new percentage class="num">2 to which the gmlpo is modified
sinput group "- class="num">3 -"
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_3 = class="num">7.0;class=class="str">"cmt">//percentage class="num">3 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">double inp_percentage_to_be_modified_3 = class="num">0.5;class=class="str">"cmt">//new percentage class="num">3 to which the gmlpo is modified
sinput group "- class="num">4 -"
input class="type">class="kw">double inp_balance_percentage_to_activate_the_risk_4 = class="num">9.0;class=class="str">"cmt">//percentage class="num">4 that will be exceeded to modify the risk separated by commas
input class="type">class="kw">double inp_percentage_to_be_modified_4 = class="num">0.33;class=class="str">"cmt">//new percentage class="num">4 class="num">1 to which the gmlpo is modified
sinput group "- MDP/Maximum daily profit/Maxima ganancia diaria -"
input class="type">bool mdp_is_strict = true; class=class="str">"cmt">//MDP is strict?
input class="type">class="kw">double percentage_or_money_mdp_input = class="num">0; class=class="str">"cmt">//percentage or money(class="num">0 => not used MDP)
input ENUM_RISK_CALCULATION_MODE mode_calculation_mdp = percentage; class=class="str">"cmt">//Mode calculation Max Daily Profit
input ENUM_APPLIED_PERCENTAGES applied_percentages_mdp = Balance;class=class="str">"cmt">//MDP percentage applies to:
sinput group "--- Session ---"
input        class="type">char hora_inicio = class="num">16;class=class="str">"cmt">//start hour to operate(class="num">0-class="num">23)
input        class="type">char min_inicio = class="num">30;class=class="str">"cmt">//start minute to operate(class="num">0-class="num">59)
input        class="type">char hora_fin = class="num">18;class=class="str">"cmt">//end hour to operate(class="num">1-class="num">23)
input        class="type">char min_fin =class="num">0;class=class="str">"cmt">//end minute to operate(class="num">0-class="num">59)

EA 全局变量的落地声明

把风险与下单逻辑收口到全局变量,是这套 EA 跑起来的前提。我们直接引自己写的 Risk_Management.mqh,而不是调用平台默认风控,这样仓位计算能按 prop_firm_balance 与 risk_mode 走自定义规则。 CTrade 负责发单,CRiskManagemet 的实例在构造时就要喂入 mdp_is_strict、get_mode、Magic、risk_mode、prop_firm_balance 五个参数,顺序错一个就会编译报错。 指标句柄分两个:order_block_indicator_handle 接订单区块,hanlde_ma 接 EMA;注意原文把 handle 拼成了 hanlde_ma,复制代码时最好顺手改回,不然后期维护容易看走眼。 tp1/tp2/sl1/sl2 四个 double 数组用来承接指标缓冲区的止盈止损价,日线周线和订单区块周期的收盘时间戳则落在 TiempoBarraApertua、TiempoBarraApertua_1、prev_vela 三个 datetime 变量上。 布尔量 opera 初始为 true,用来在浮亏触限后一键禁交易;start_sesion 与 end_sesion 框定信号扫描的时段。外汇与贵金属杠杆高,这类全局开关最好在策略测试器里先跑几周 tick 数据验证再上实盘。

MQL5 / C++
class="macro">#include&nbsp;&nbsp;<Risk_Management.mqh>
CTrade trade;
CRiskManagemet risk(mdp_is_strict, get_mode, Magic, risk_mode, prop_firm_balance);
class=class="str">"cmt">//--- Handles
class="type">int order_block_indicator_handle;
class="type">int hanlde_ma;
class="type">class="kw">double tp1[];
class="type">class="kw">double tp2[];
class="type">class="kw">double sl1[];
class="type">class="kw">double sl2[];
class=class="str">"cmt">//---
class="type">class="kw">datetime TiempoBarraApertua;
class="type">class="kw">datetime TiempoBarraApertua_1;
class="type">class="kw">datetime prev_vela;
class=class="str">"cmt">//---
class="type">bool opera = true;
class="type">class="kw">datetime start_sesion;
class="type">class="kw">datetime end_sesion;

常见问题

把风控拆成「订单区块识别」「阶梯回撤触发」「时段降险」三组独立输入块,每组只暴露相关字段,调参时按块改就不会串。
在时段参数里给亚洲/欧洲/美洲盘分别设风险系数,GMLPO 按当前时段读取系数动态乘到基础仓位上,无需手动切。
可以,把 EA 参数面板截图或导出给小布,它会按订单区块、回撤阶梯、时段降险三块比对,标出缺失或冲突项。
回撤阈值用收盘价确认而非即时价,且每级间隔设 1.5% 以上,并加最小持仓时间过滤,避免短时插针误触。
用终端全局变量而非局部缓存,在初始化函数里读是否存在、不存在再写默认值,重启 EA 数值保留。