MQL5中的自动化交易策略(第七部分):构建具备仓位动态调整功能的网格交易EA(基础篇)
📘

MQL5中的自动化交易策略(第七部分):构建具备仓位动态调整功能的网格交易EA(基础篇)

第 1/3 篇

「网格EA里的动态仓位该怎么调」

在 MT5 里写网格策略,最容易被忽略的是仓位随净值浮动这件事。固定手数网格遇到单边行情,浮亏会按层数线性放大,账户回撤速度远超多数人预期。 原文给出的第七部分示例里,每加一层网格不是吃固定 0.01,而是按当前权益的 0.5% 风险预算倒推手数,这样净值回撤时新单层风险自动缩水。 外汇与贵金属杠杆高,网格在极端跳空下可能触发连环止损,实盘前务必用 MT5 策略测试器跑至少 2020 年以来的多品种历史数据验证。 下面是核心的仓位计算片段,手数随权益走而不是写死:

MQL5 / C++
class="type">class="kw">double CalculateLot(class="type">class="kw">double riskPercent, class="type">class="kw">double stopLossPoints)
  {
   class="type">class="kw">double balance = AccountInfoDouble(ACCOUNT_EQUITY);
   class="type">class="kw">double riskMoney = balance * riskPercent / class="num">100.0;
   class="type">class="kw">double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
   class="type">class="kw">double lot = riskMoney / (stopLossPoints * tickValue);
   class="kw">return NormalizeDouble(lot, class="num">2);
  }

从订单块到网格:本篇要落地的东西

上篇我们用 MQL5 搭了一套自动识别订单块的模块,这一篇把重心移到网格交易:以固定价格间隔挂单,再叠加动态仓位缩放来调风险回报。 动态缩放的核心不是每格都下同样手数,而是按市况把仓位大小拉开梯度,让单边延伸时亏损暴露可控、回归时回血更快。外汇和贵金属杠杆高,网格在剧烈单边里可能快速放大浮亏,实盘前必须用 MT5 策略测试器跑一遍。 本篇会依次给到策略具体实现、MQL5 代码、回测结果,读完你应能拼出一个带动态缩放的网格 EA 骨架,直接丢进 MT5 测。

◍ 网格系统的五个构件怎么落进EA

网格交易本质是在预设价格间隔上挂买卖单,靠区间来回波动吃饭,不要求你提前猜准趋势方向。原文给出的实现框架把这套逻辑拆成五块:网格间距、入场执行、动态仓位、交易管理、退出逻辑。 网格结构先定单子之间的价格距离;入场规则用移动平均线加固定间距触发开仓,而不是随机撒网。动态仓位缩放会按账户余额、波动率或前几笔结果改手数,这是和普通马丁最不同的地方。 交易管理要接止损、止盈和可选保本;退出逻辑则基于盈利目标、风险上限或趋势反转平仓。把这五块写进一个EA,就能在MT5里跑出可验证的网格行为。外汇和贵金属杠杆高,网格在单边行情里浮亏扩张很快,实盘前务必用策略测试器看最大回撤。

「MT5里把网格策略跑起来的代码骨架」

打开 MetaEditor,在导航器里定位“指标”文件夹点新建,生成文件后先铺全局变量。用 #include 挂上 Trade/Trade.mqh 并实例化 obj_Trade 处理下单;定义 ClosureMode 枚举区分两种平仓逻辑,用户输入留了 closureMode 与 breakevenPoints,再声明止盈、初始手数、网格间距、动态缩放变量及均线数据数组。 函数原型先列清楚:CheckAndCloseProfitTargets 盯总盈利平仓,ExecuteInitialTrade 开首单,ManageGridPositions 按网格补单,UpdateMovingAverage 刷指标,IsNewBar 防同根 K 线重复交易,CalculateWeightedBreakevenPrice 算加权成本,CheckBreakevenClose 做保本退出,CloseAllPositions 清场。 OnInit 里用 iMA 建周期 21、SMA、收盘价均线;句柄若等于 INVALID_HANDLE 就打印错误并返回 INIT_FAILED,否则 ArraySetAsSeries(maData) 排好序回 INIT_SUCCEEDED。OnTick 首行调 IsNewBar,新 K 线才把 isTradeAllowed 置 true,再刷均线值。 无持仓时 PositionsTotal 为 0,LotSize 重置回 initialLotsize;用 iLow/iHigh 抓前两根 K 线高低点,SymbolInfoDouble 取 ask/bid 并 NormalizeDouble。允许交易且空仓就调 ExecuteInitialTrade:前一根低高于 maData 且再前一根低低于它则买,gridSize 落 ask 下方、TP 加 takeProfitPts;反向则卖,gridSize 落 bid 上方、TP 减点。 有仓后每 tick 调 ManageGridPositions,逆序遍历持仓,BUY 仓且 ask 触及/破 gridSize 就手数翻倍再买一单、gridSize 下移;SELL 仓对称处理。closureMode 为 CLOSE_BY_PROFIT 时累计 profitTotal_inCurrency 达标就 CloseAllPositions;为 CLOSE_BY_POINTS 时算加权保本价,BUY 看 bid≥加权价+breakevenPoints、SELL 看 ask≤加权价-breakevenPoints 才全平。 外汇与贵金属网格加仓属高风险玩法,翻倍手数在单边行情中可能快速放大浮亏,上述逻辑仅能在 MT5 策略测试器验证,实盘前务必用历史数据回测。代码头部声明见下,版权与版本信息原样保留便于你直接贴进 MetaEditor 对照。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//|                     Copyright class="num">2025, Forex Algo-Trader, Allan. |
class=class="str">"cmt">//|                 "https://t.me/Forex_Algo_Trader" |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Forex Algo-Trader, Allan"
class="macro">#class="kw">property link      "https:class=class="str">"cmt">//t.me/Forex_Algo_Trader"
class="macro">#class="kw">property version   "class="num">1.00"
class="macro">#class="kw">property description "This EA trades based on Grid Strategy"
class="macro">#class="kw">property strict

常见问题

通常按净值回撤比例或单格亏损额度触发仓位系数,浮亏超阈值时降低后续网格手数而非加仓,具体系数写在EA输入参数里便于回测。
先验证挂单间距、每格手数曲线、总持仓上限三项,用策略测试器跑三个月以上品种历史,看最大回撤是否可接受。
可以,小布能读取你当前品种页的挂单与持仓分布,提示网格密度过高或净值回撤临界,省去手动翻终端的麻烦。
多半是清仓退出条件,只写了建网格没写整体盈利平仓或止损拆解,导致行情单边时无法收手。
检查最小挂单距离和每格手数是否低于品种限制,再确认账户杠杆够不够覆盖最大网格层数占用保证金。