网格和马丁格尔:它们是什么?如何使用它们?·综合运用
🕸️

网格和马丁格尔:它们是什么?如何使用它们?·综合运用

(3/3)·从EA开发到统一方程,拆解新手最易迷信的两种策略到底能走多远

含代码示例实战向 第 3/3 篇
很多交易者把网格和马丁格尔的回测曲线当成圣杯,却没算过爆仓前的仓位膨胀速度。这两种策略靠盈亏平衡假象吸人入场,实盘里点差和滑点会撕开数学童话。本篇用EA和方程把底牌翻给你看。

◍ 从零搭一个极简马丁格尔EA

马丁格尔和网格的思路不同,但底层仓位管理可以复用网格EA里那套库,所以代码反而更短。输入参数里我只挑几个不直观的说:SLE=100是止损点数,TPE=300是止盈点数,HistoryDaysLoadI=10限定只拉最近10天订单历史,纯粹为了优化时少读点盘后数据。 EA核心就两个函数。CalcLot()翻交易历史算下一单手数:从最近一笔平仓单往回找,只要连续亏损就把那些单的体积累加,一旦碰到盈利单就停止;如果没亏过就返回起始Lot 0.01。Trade()则在无持仓时随机双向挂单,买或卖各50%概率(MathRand()>32767/2),手数直接调CalcLot()。 回测现象和网格很像:在一段连续亏损把保证金吃掉之前,EA可能平稳跑出利润;但当亏损周期到来、保证金不够开下一手加倍仓时,账户倾向直接崩。外汇和贵金属杠杆高,这类马丁实盘属于高风险,任何历史表现都不代表未来能活过深撤。 下面这段是输入参数与两个函数的原始实现,逐行看能直接抄进MT5测: input int SLE=100;//止损点数 input int TPE=300;//止盈点数 input int SlippageMaxOpen=15;//开单滑点点数 input double Lot=0.01;//起始手数 input int MagicC=679034;//幻数 input int HistoryDaysLoadI=10;//历史加载天数 CalcLot()先用HistorySelect框定时间窗,倒序遍历平仓单,亏单体积累加、遇盈单break,返回累加值或起始手数。 Trade()用PositionSelect判空仓,MathRand决定买卖方向,Buy/Sell把SL/TP按SLE/TPE点数算出具体价位,手数来自CalcLot()。

MQL5 / C++
input class="type">int SLE=class="num">100;class=class="str">"cmt">//Stop Loss Points
input class="type">int TPE=class="num">300;class=class="str">"cmt">//Take Profit Points
input class="type">int SlippageMaxOpen=class="num">15; class=class="str">"cmt">//Slippage For Open In Points
input class="type">class="kw">double Lot=class="num">0.01;class=class="str">"cmt">//Start Lot
input class="type">int MagicC=class="num">679034;class=class="str">"cmt">//Magic
input class="type">int HistoryDaysLoadI=class="num">10;class=class="str">"cmt">//History Deals Window Days
class="type">class="kw">double CalcLot()class=class="str">"cmt">//calculate the lot
  {
  class="type">bool ord;
  class="type">class="kw">double TotalLot=class="num">0;
  HistorySelect(TimeCurrent()-HistoryDaysLoadI*class="num">86400,TimeCurrent());
  for ( class="type">int i=HistoryDealsTotal()-class="num">1; i>=class="num">0; i-- )
    {
    class="type">ulong ticket=HistoryDealGetTicket(i);
    ord=HistoryDealSelect(ticket);
    if ( ord && HistoryDealGetString(ticket,DEAL_SYMBOL) == _Symbol 
    && HistoryDealGetInteger(ticket,DEAL_MAGIC) == MagicC 
    && HistoryDealGetInteger(ticket,DEAL_ENTRY) == DEAL_ENTRY_OUT )
      {
      if ( HistoryDealGetDouble(ticket,DEAL_PROFIT) < class="num">0 )
        {
        TotalLot+=HistoryDealGetDouble(ticket,DEAL_VOLUME);
        }
      else
        {
        break;
        }
      }
    } 
  class="kw">return TotalLot == class="num">0 ? Lot: TotalLot;
  }
class="type">void Trade()class=class="str">"cmt">//the main function where all actions are performed
  {
  class="type">bool ord=PositionSelect(Symbol());
  SymbolInfoTick(Symbol(),LastTick);
  if ( !ord )
    {
    if ( MathRand() > class="num">32767.0/class="num">2.0 )
      {
      m_trade.Buy(CalcLot(),_Symbol,LastTick.ask,LastTick.bid-class="type">class="kw">double(SLE)*_Point,LastTick.ask+class="type">class="kw">double(TPE)*_Point);
      }
    else
      {
      m_trade.Sell(CalcLot(),_Symbol,LastTick.ask,LastTick.ask+class="type">class="kw">double(SLE)*_Point,LastTick.bid-class="type">class="kw">double(TPE)*_Point);
      }
    }
  }

网格与马丁格尔为何在数学上注定归零

把任意交易策略拆成无限多个最小子策略:每个子策略开仓即激活,固定止盈止损平仓,手数 Lot[i] 各不相同,触发概率 PC[i] 满足 Sum(0,n)(PC[i])=1。子策略结果分亏损空间 S[i] 与利润空间 T[i],对应条件概率 PS[i]、PT[i] 也构成完备组。 单子策略预期收益写为 M[i]=(PT[i]*TP - PS[i]*SL)*Lot[i]*TickSize。若开仓时不知价格方向,则 PT[i]=PS[i],M[i]=0。当策略数 n 趋近无穷,所有 M[i] 趋零,总体期望 M0=Sum(0,n)(PC[i]*M[i]) 也为 0。 网格是 Lot[i] 处处相等,马丁格尔是 Lot[i] 逐级翻倍,差异只改手数数组、不动概率结构,套进同一方程结果不变。有限策略集也好、有限集的无限重复也罢,全是零相加。 由此可证:任何靠调交易量、堆订单开关规则,却不对开盘/收盘方向或辅助市场参数做有效预测的系统,期望恒为零。外汇与贵金属杠杆极高,这类策略实盘放大的是回撤风险而非胜率,开 MT5 用下方代码算一组 M[i] 就能自己看到归零过程。

MQL5 / C++
class="type">class="kw">double M[]; class=class="str">"cmt">// 预期收益数组
class="type">class="kw">double PC[]; class=class="str">"cmt">// 触发概率数组
class="type">class="kw">double PT[]; class=class="str">"cmt">// 盈利条件概率
class="type">class="kw">double PS[]; class=class="str">"cmt">// 亏损条件概率
class="type">class="kw">double Lot[]; class=class="str">"cmt">// 手数数组
class="type">class="kw">double TP, SL, TickSize;
class=class="str">"cmt">// 计算第 i 个子策略期望
M[i] = (PT[i]*TP - PS[i]*SL) * Lot[i] * TickSize;
class=class="str">"cmt">// 总体期望
class="type">class="kw">double M0 = class="num">0; 
for(class="type">int i=class="num">0; i<n; i++) M0 += PC[i] * M[i];

「网格与马丁格尔的实战边界」

网格策略只有在你预判市场将出现一波近似幅度的移动、且缺口风险较低时才值得挂。缺口和网格天然冲突:订单按固定步长铺设,下一跳报价可能直接越过整层挂单,把价格甩到网格之外。这种情况虽罕见,但会不可逆地拉低系统效率。 网格步长建议设为等于或略小于你预测的波动幅度,方向不需要提前知道,只要幅度近似就行。在趋势检测算法命中时,余额曲线会呈现阶梯式爬升,但事先锁定趋势本就困难,实盘中常出现周期性回撤(原文图中红色标段),下探深度往往不小。 马丁格尔的逻辑前提是:信号长期期望收益为 0,但连亏到某一数量后,下一笔盈利概率逼近 1。满足这种条件才能用加倍仓。但我个人判断马丁格尔在任何情形下都高危——要精确凑出前述概率结构几乎不可能。相比之下网格至少规则透明、幅度可算,外汇与贵金属杠杆市场里这两者皆属高风险,开 MT5 前先想清楚最大回撤承受线。

◍ 画得少,看得清

这两套策略的相似与差异写到这里就收住了。网格和马丁的核心都不是预测方向,而是用仓位结构去接价格的来回摆动,新手容易把它们当成赚钱机器,实际上只是把时间换成了暴露风险。 作者给出的数学结论本身没给市场物理添新东西,但能帮你在写自己的 EA 时少绕路:先想清楚限价堆在哪里、半衰期多长,而不是凭一条倾斜线编故事。 附带的 Easy_Grid.mq5(14.27 KB)和 Uncle_Martin.mq5(6.47 KB)是直接能跑的参照,开 MT5 拖进去回测一轮,比看十篇抒情复盘有用。外汇和贵金属杠杆高,回测顺不代表真金白银能活下来。

把回测诊断交给小布盯盘
这些策略的历史表现与风险剖面,小布盯盘的 AIGC 已内置对照模型,打开对应品种页即可看到实盘边界提示,你只需判断要不要碰。

常见问题

通常是加仓步长和最大层数,点差扩大时保证金占用会非线性跳升,回测里平滑的曲线在实盘可能直接断崖。
概率上更危险,跳空会绕过挂单触发价,造成预期外亏损,外汇贵金属本身高风险,需额外过滤时段。
可以,品种页的 AIGC 模块会基于波动和点差给出策略适用性倾向,省去你手算方程的时间。
指策略在有限样本内必然回本的错误直觉,忽略资金上限后,任何连续不利行情都会击穿账户而非自然平衡。