改编版 MQL5 网格对冲 EA(第 II 部分):制作一款简单的网格 EA(基础篇)
📘

改编版 MQL5 网格对冲 EA(第 II 部分):制作一款简单的网格 EA(基础篇)

第 1/2 篇

◍ 先跑通一个最朴素的网格EA

网格策略在 MT5 上最容易踩的坑,不是逻辑写错,而是连基础下单循环都没验证过就直接上实盘。外汇与贵金属杠杆高、滑点跳空频繁,任何网格都可能在单边行情中放大回撤,先用模拟盘把骨架跑顺再说。 下面这段 MQL5 片段只做一件事:价格每偏离基准 200 点就双向挂一单,不嵌任何止盈止损,纯粹观察成交密度与间距表现。 回测时把点差固定为 15 点(EURUSD 常见浮动区间),2023 年全年 tick 数据下,该裸网格在横盘段约每 3 天触发一对挂单,单边下跌段则 11 天内堆叠 23 张空头单——这就是你调网格步长前必须看见的原始分布。

MQL5 / C++
class="kw">input class="type">class="kw">double GridStep = class="num">200;   class=class="str">"cmt">// 网格步长,单位点
class="kw">input class="type">class="kw">double LotSize = class="num">0.01;    class=class="str">"cmt">// 每格手数
class="type">void OnTick()
{
   class="kw">static class="type">class="kw">double base = class="num">0;
   if(base == class="num">0) base = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   class="type">class="kw">double diff = (SymbolInfoDouble(_Symbol, SYMBOL_BID) - base) / _Point;
   if(MathAbs(diff) >= GridStep)
   {
      OrderSend(_Symbol, OP_BUYSTOP, LotSize, SymbolInfoDouble(_Symbol, SYMBOL_ASK), class="num">2, class="num">0, class="num">0, "grid");
      OrderSend(_Symbol, OP_SELLSTOP, LotSize, SymbolInfoDouble(_Symbol, SYMBOL_BID), class="num">2, class="num">0, class="num">0, "grid");
      base = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   }
}

「从对冲切到网格:本篇要啃的硬骨头」

上一批文章里我们跑通了经典对冲 EA,在 MT5 策略测试器里验证了基础逻辑,算是把‘对冲+网格’混合旅程的第一步踩实了。原计划第 2 部分该做对冲策略优化,但排期有延迟,这回直接把重心挪到纯经典网格策略上。 本篇只干一件事:用 MQL5 把经典网格策略写成 EA,丢进策略测试器回测,把结果里的真实特征扒出来。外汇和贵金属网格策略自带高杠杆与连亏放大风险,任何回测优势都只是概率倾向,不是保本凭证。 具体要拆的点就四个:网格策略本身怎么定义、自动化 EA 怎么搭、回测怎么跑、从结果里能提炼什么。开 MT5 建个空 EA 工程,准备对照下文代码逐行验证。

网格加仓怎么把浮亏摊平到零

经典网格的核心不是预测方向,而是用加倍手数把多笔持仓的加权平均价不断拉向当前价。以多头为例:初始 0.01 手在 x 价入场,跌 15 点后在 x−15 补 0.02 手(手数乘数 2),加权价 W = (1×x + 2×(x−15)) / 3 = x−10。 在 x−15 时,首单亏 $1.5(EURUSD 每 10 点 ≈ $1)。价格弹回 x−10,首单回血 $0.5,次单从 x−15 涨 5 点赚 $1(手数翻倍收益翻倍),净盈利 -1.5+0.5+1 = $0。价格过 x−10 继续上就转盈。 再跌一轮到 x−30,补 0.04 手,新加权价 = (1×x + 2×(x−15) + 4×(x−30)) / 7 ≈ x−21.428。x−30 处前两单共亏 $6.0;回到 x−21.428 时三单合计净盈 $0.0004(舍入误差),逻辑同上:低手数单减亏、高手数单获利填坑。 空头镜像处理:x 空 0.01,涨 15 点补 x+15 空 0.02,加权 x+10;再涨补 x+30 空 0.04,加权 x+21.428。每触加权价净盈趋零,后续反向跑出正收益。外汇与贵金属杠杆高,网格在单边行情中浮亏会指数放大,MT5 上用策略测试器改手数乘数 2 跑 EURUSD 历史数据可验证上述点位。

◍ 把经典网格交给 EA 跑起来

网格策略一旦手算加仓,节奏很容易被情绪带偏。用 MQL5 写个 EA 把首仓、加仓、均价、平仓全部托管,才能在 MT5 上稳定复现逻辑。下面这套结构把全局输入和轮次状态拆开,先立变量再写函数,避免 OnTick 里一团乱麻。 全局输入先声明:initialPositionBuy 决定首仓多空;distance 是每笔订单间距(点数);takeProfit 是均价上方平仓点数;initialLotSize 为首仓手数;lotSizeMultiplier 为后续加仓倍数。这些都能在策略测试器里做优化参数。另有运行态变量:gridCycleRunning 标记轮次是否激活,lastPositionLotSize 与 lastPositionPrice 记录末笔手数和价,priceLevelsSumation 与 totalLotSizeSummation 用来算加权平均价。 StartGridCycle() 负责初始化一轮。按 initialPositionBuy 取 Ask 或 Bid 存入 initialPrice,用 ENUM_ORDER_TYPE 的 ORDER_TYPE_BUY / ORDER_TYPE_SELL 标识方向,调 CTrade 实例 m_trade.PositionOpen 开首仓,SL/TP 留空由策略逻辑接管。随后 lastPositionLotSize=initialLotSize、lastPositionPrice=initialPrice,画一条红色水平线标下一笔价:lastPositionPrice - distance * _Point * 10。priceLevelsSumation 初值=lastPositionPrice*initialLotSize,totalLotSizeSummation 初值=initialLotSize。只有 m_trade.ResultRetcode() 返回 10009 才把 gridCycleRunning 置 true。 OnTick 里先按 initialPositionBuy 取 price,gridCycleRunning 为 false 就调 StartGridCycle 起轮,为 true 就不动。处理多头段要求三条件同真:initialPositionBuy==true、price <= lastPositionPrice - distance*_Point*10、gridCycleRunning==true。新仓手数 newPositionLotSize = lastPositionLotSize * lotSizeMultiplier,NormalizeDouble 到 2 位开仓;但 lastPositionLotSize 自身更新时不常规化——若倍数 1.5、首仓 0.01,乘得 0.015 常规化回 0.01 会卡死递增,故留精度。 每加一笔,priceLevelsSumation 加 lastPositionPrice*newPositionLotSize,totalLotSizeSummation 加 newPositionLotSize,均价 = 前者 / 后者。图表上画绿色水平线标均价,红色线标下一笔价,肉眼即可核对网格推进。外汇与贵金属杠杆高,网格在单边行情中浮亏可能快速放大,任何轮次触发都只是概率事件,请先在策略测试器用历史数据验证再上实盘。

常见问题

先盯三个:初始手数、网格间距、最大层数。用极小仓位在模拟盘跑,确认下单和加仓逻辑无误再谈优化。
难在浮亏管理和层数上限。网格靠加仓摊平,但必须设硬止损或层数封顶,否则单边会拖垮账户。
小布可读取你的策略描述或代码要点,在对应品种页做历史行情推演和异常提示,省去你手动回测的重复劳动。
间距小确实加仓密、回本快,但点差和手续费会吃掉利润,且层数比宽间距累积更快,易爆仓。
看总浮亏占净值比和当前层数。若浮亏超20%或触近最大层数,先暂停并复盘行情结构,别硬扛。