多层级网格交易系统:从架构到MQL5落地的零基础拆解(基础篇)
🧱

多层级网格交易系统:从架构到MQL5落地的零基础拆解(基础篇)

(1/3)·别被网格策略的层层挂单吓退,这篇把模块划分和参数初始化讲透

新手友好 第 1/3 篇
很多交易者一听到网格就直接堆等距挂单,却没想清楚信号检测、执行和风控该谁管谁。层级一多,平仓逻辑乱套,浮亏放大才意识到架构没搭好。先把系统拆成独立组件,比急着写EA更重要。

◍ 网格系统的多层仓位骨架

多层网格和单层马丁最大的区别,是把加仓动作按价格距离切成若干独立层,每层有各自的触发价与手数系数。这样在震荡行情里,远端层不会因近端波动而被频繁触发,回撤曲线更平滑。 实际跑在 MT5 上,一个基础三层网格常把首层间距设为 50 点,第二层 120 点,第三层 200 点;手数按 0.1 / 0.15 / 0.25 递增。外汇与贵金属杠杆高,这种结构在单边市仍可能快速放大浮亏,需用止损总闸限制。 下面这段初始化代码把三层参数直接写进数组,方便后续在 OnTick 里按层遍历。注意 Lot 数组和 Step 数组下标要一一对应,否则会出现层位错配。

MQL5 / C++
input class="type">class="kw">double Step[] = {class="num">50, class="num">120, class="num">200};
input class="type">class="kw">double Lot[]  = {class="num">0.1, class="num">0.15, class="num">0.25};
class="type">int layers = ArraySize(Step);

「从趋势动量切到分层网格」

上一篇我们用 MQL5 写了一个把移动平均线和动量过滤结合起来的 EA,跑的是趋势平移动量策略。这一篇不沿老路走,转去搭一套多层级网格交易系统:核心是用分层网格的方法,在价格波动里找利差,而不是赌单边方向。 整篇会按体系架构、MQL5 实现、回测三个硬块推进。外汇和贵金属杠杆高、滑点跳空频繁,网格在极端行情里可能快速放大敞口,实盘前务必先在 MT5 用历史数据跑通逻辑。 读完你应该能拿到一套可直接加载的网格程序,但别急着挂真仓——先把回测章节里的参数区间自己调一遍,看最大回撤是否落在你能忍的范围。

把网格拆成三块来写才稳

多级网格不是把一堆挂单扔进图表就完事。它的本质是在一串等距价格水平上布置买卖单,靠价格来回扫动吃波动,不赌方向——涨、跌、横盘都可能产生收益,但外汇和贵金属杠杆高,回撤可能远超本金,必须当高风险系统对待。 我们的 MT5 程序用模块化把三件事拆开:信号检测、订单执行、风险管理各自独立。先初始化关键参数,比如用一条移动平均线判方向,再把初始手数、网格间距、止盈写进结构体,后面每一层都读这套配置。 运行时程序盯着价格,触条件就在对应层级加单,同时动态调风险参数:重算盈亏平衡、改止盈、碰盈利目标或风险阈值就平仓。这样每一层网格都是可控子单元,方便你直接拉去回测。 架构落地后大致是:参数与结构体初始化 → 信号模块输出层级触发 → 执行模块挂单/平仓 → 风控模块动态改止盈与保本。你开 MT5 新建 EA,先照这个顺序建空函数,比一上来写下单逻辑更不容易乱。

◍ MT5里搭一个多篮子网格EA的骨架

打开 MetaEditor,在导航器「指标」目录下新建文件只是第一步,真正决定策略行为的是全局变量与交易对象的声明。引入 Trade/Trade.mqh 并把 CTrade 实例化为 obj_Trade,后续下单、改单、平仓全部走这个对象,比直接调 OrderSend 更不容易在多线程 tick 下出乱子。 退出逻辑用枚举 ClosureMode 切两种:CLOSE_BY_PROFIT 是总浮盈达到账户货币阈值就清仓,CLOSE_BY_POINTS 是按距盈亏平衡点的点数平。实盘里外汇和贵金属波动跳空频繁,这种双模切换能让你在剧烈行情切到点数保护、震荡期切到金额目标,但两种都属于高风险操作,仓位失控会直接爆仓。 输入参数区是调策略的旋钮:inpLotSize 管首仓手数,inpMagicNo 隔离其他EA,inpTp_Points 和 inpGridSize 定每层止盈与网格间距,inpMultiplier 做自适应扩仓,inpBreakevenPts 到阈值搬保本,maxBaskets 限并行篮子数。把点数乘 _Point 转成价格差(takeProfitPts / gridSize_Spacing),这一步精度错了,网格就会卡在错误价位。 BasketInfo 结构体让每个网格篮子独立:basketId 追踪、magic 区分、direction 定多空、initialLotSize 与 currentLotSize 分离首仓和扩仓、gridSize 与 takeProfit 管层级、signalTime 防重复触发。baskets[] 动态数组装所有活跃篮子,nextBasketId 自增分配,baseMagic 统一定底号。 OnInit 里 iMA 取均线句柄,失败就 INIT_FAILED 不跑;ArraySetAsSeries 让 maData[0] 是最新值。OnTick 配合 IsNewBar 做到每根 K 线只跑一次:iBars 当前数大于 totalBars 才推进并回 true,否则回 false 省算力。UpdateMovingAverage 用 CopyBuffer 抓最近 3 根均线值(从索引1跳当前形成中 K 线),失败 Print 报错。 信号判定在 CheckForNewSignal:iClose 取前两根收价,金叉(今收>MA 且昨收<MA)开买、死叉开卖,且遍历 baskets 用 signalTime 排重,满了 maxBaskets 直接 return。ExecuteInitialTrade 给新篮子发 ID 和 magic,Buy/Sell 前按 gridSize_Spacing 算网格价、takeProfitPts 算止盈;成功 Print,失败 GetLastError 并 ArrayResize 缩数组。 ManageGridPositions 在 for 循环里逐篮子调,ArraySize 定上限防越界,newPositionOpened 标是否新开层,GetPositionComment 生成备注、SetExpertMagicNumber 绑 magic,保证每层网格可回溯。

「篮子平仓与空壳回收的实操链路」

买入篮子触发条件是卖价跌至或低于 gridSize 阈值,随后用 inpMultiplier 放大 currentLotSize,调 obj_Trade.Buy() 下单;成功就减 gridSize_Spacing 重定位下一格,失败用 GetLastError() 留痕。卖出篮子镜像处理:买价触顶后调 Sell(),gridSize 加 spacing。外汇与贵金属网格加仓属高风险操作,倍数放大在逆向行情中可能迅速扩大浮亏。 新网格仓成型且组内多单后,止盈要拉到盈亏平衡。CalculateBreakevenPrice() 按手数加权开仓价算均价,买入篮 TP = 均价 + inpBreakevenPts 点,卖出篮 TP = 均价 - 该值。遍历持仓时用 POSITION_MAGIC 验归属,PositionModify() 改 TP,改不动就记错误。 平仓分两种模式:CLOSE_BY_PROFIT 调 CheckAndCloseProfitTargets(),篮内总利润 ≥ profitTotal_inCurrency 就 CloseBasketPositions();CLOSE_BY_POINTS 需篮内多于一个仓,且现价越过盈亏平衡 + inpBreakevenPts*_Point(买篮)或反向(卖篮)才平。日志显示篮子2统一 TP 曾落在 0.68074,说明加权均价随网格加仓在动态漂移。 空篮子留壳会拖慢 EA,逆向扫 baskets 数组、CountBasketPositions() 为 0 就前移元素并 ArrayResize() 截断。这样只留活跃篮,回测前内存不爆。下一段该跑历史数据验证这套逻辑了。

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 multiple signals with grid strategy class="kw">using baskets"
class="macro">#class="kw">property strict
class="macro">#include <Trade/Trade.mqh> class=class="str">"cmt">//--- Includes the standard trading library for executing trades
CTrade obj_Trade; class=class="str">"cmt">//--- Instantiates the CTrade object used for managing trade operations
class=class="str">"cmt">//--- Closure Mode Enumeration and Inputs
enum ClosureMode {
   CLOSE_BY_PROFIT,      class=class="str">"cmt">//--- Use total profit(in currency) to close positions
   CLOSE_BY_POINTS       class=class="str">"cmt">//--- Use points threshold from breakeven to close positions
};
input group "General EA Settings"
input ClosureMode closureMode = CLOSE_BY_POINTS;
input class="type">class="kw">double inpLotSize = class="num">0.01;
input class="type">long inpMagicNo = class="num">1234567;
input class="type">int inpTp_Points = class="num">100;
input class="type">int inpGridSize = class="num">100;
input class="type">class="kw">double inpMultiplier = class="num">2.0;
input class="type">int inpBreakevenPts = class="num">50;
交给小布盯盘看网格层数
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到当前网格层级与浮盈分布,你专注决策就好。

常见问题

单层网格只在固定间距反复挂单,多层级把信号、执行、风控拆成模块,每一层都可独立调整止盈与盈亏平衡,适应波动更稳。
可以,小布盯盘的品种页能可视化网格层级与累计利润阈值,省去你手动数挂单。外汇贵金属波动剧烈,高杠杆策略务必先模拟。
它是程序退出模式之一,当账户货币计的总利润达到预设阈值就触发全部平仓,适合锁利优先的波动市。
网格加层后风险偏移,动态重算盈亏平衡点能在不平仓前提下把整体风险拉回可控区,避免单层止损过早。