这是一个 多空双向、动态间距、自定义手数序列的网格型 EA ,整体仍属"网格/马丁"家族,
但在入场质量、极端行情防护、深套救援和工程可靠性四个方面做了大量精细化设计。
一、入场机制:不追单的"回撤确认"首单
策略的首单不是价格突破就追,而是要求价格 从近两根 M1 K线的极值回撤 100 点 才触发( CanOpenInitialBuy / TryOpenInitialPositions ):
- 多单:ask ≤ 近两根 M1 最高点 − 100 点;空单反之。
- 这使得首单天然带有 均值回归、逢回调进场 的属性,避免在短线冲顶/砸底的最差位置开第一张单。
而网格策略的生死很大程度上取决于第一张单的位置——首单越好,需要加到的层数越浅,风险天然越小。
- 平仓后有 5 秒冷却( InpFirstOrderCooldownSec ),防止刚止盈就被一根毛刺重新拉进场。
更巧妙的是 虚拟首单机制:当价格已触及首单触发价、但此刻被斜率/风险K线/冷却拦截时,EA 不放弃信号,而是记录一个"虚拟首单价格";拦截解除后:
- 若价格继续朝不利方向走,按理论间距 批量补开被错过的层 (受 5 层上限约束);
- 若价格反转回去(虚拟多单的价格涨回触发价上方),则 取消虚拟单 ——说明行情转好,不再追空。
这个设计同时解决了两个矛盾:过滤器拦截期间"踏空导致网格错位"和"过滤器刚解除时行情已反转、不该追单"。
二、三层行情过滤:把"逆势加仓"关进笼子
普通网格马丁最大的死法是在单边急行情中不断接飞刀。本策略用 三道独立过滤器 压制这种场景:
1. EMA(1) 收盘斜率过滤(M1,150 点阈值) — OnM1CloseCheckFill 基于已收盘 K 线计算斜率,斜率过大时禁止逆势方向开新仓。
2. 实时动态斜率过滤(300 点阈值) — RefreshBlockedState 每个 tick 用未收盘的实时斜率再拦一道。收盘斜率是"定性",实时斜率是"应急",急涨急跌在 K 线收盘前就能被冻结。
3. 风险K线过滤(M1 实体 > 300 点) — 独立于均线、优先级最高,一根 300 点的大实体(无论阴阳) 全方向禁止开仓 ,连 EA 重启时都会先检测当前是否处于风险K线状态。
4. 阈值滞回(施密特触发)设计 风险K线 300 点触发、150 点才解除;斜率拦截 150、释放 150 的双阈值状态机。
这避免了价格在单一阈值附近抖动时"开仓—拦截—开仓"频繁切换造成的乱单,是工业控制里成熟的抗抖动思想。
5. 拦截不丢层 被拦截期间错过的网格间距,在斜率释放时由 TrySetBuyFillPending 计算理论层数、最多补 5 层,做到了"风险来了停手,风险过了网格结构依然完整"。
三、网格结构:动态加宽 + 温和手数序列,从结构上压低尾部风险
这是本策略相比"经典马丁"最本质的优势。
1. 深层动态加宽间距 — GetLayerSpread
- 第 1~32 层:固定 100 点;
- 第 33 层起:每层递增 10 点,直到 300 点封顶。
含义是:行情走得越深、越极端,网格布得越疏。等间距马丁在单边行情中会 匀速吃满所有层 ,而本策略越往后加仓越慢、给行情反转留的空间越大,直接降低了极端单边下的层数密度和资金消耗速度。
2. 自定义手数序列替代倍数翻仓 — ApplyStrategyPreset 手数表为:前 6 层全部 0.01、之后多档 0.02、0.05、0.06……中段 0.08→1.0 缓慢爬升,最后 2.0 封顶(共 51 档)。
经典马丁是 1→2→4→8→16 指数爆炸,十几层就要几十手;本策略前 11 层总敞口极小(试探成本很低),加仓曲线接近"线性+末端封顶",账户权益曲线会平缓得多,
且 2.0 手是 硬上限 ,不存在理论上无限翻倍的黑洞。
3. 多重硬性边界 :单方向 60 层参数上限、手数表长度上限、取两者更小值,每层下单前都校验。
四、停滞补单(方案D):深套救援的"精准制导"
这是整套策略最有技术含量的模块( CheckStallFill 与 TryStallBuyFill )。当行情深套到 25 层以上、价格又陷入停滞时,常规网格已很难自然回到均价,EA 启动一套带确认的救援机制:
1. 触发门槛高 :同方向 ≥25 层 + 最近 3 根 M1 价格停滞(极值不创新) + 组合 TP 距近期极值 ≥500 点,三个条件同时满足才进入"等待",只在真正需要救援时出手。
2. 反弹/回落确认后才补,且有超时取消 :进入等待后,要求价格再逆向走 200 点(多单等价格再跌出便宜价格)才实际补仓;5 根 K 线内没等到就取消( ProcessStallPending ),
避免在停滞区间的半山腰盲目加仓。
3. 手数由目标反推,而非拍脑袋加倍 :核心公式`x = totalVol × (avgPrice − K) / (K − ask)`
其中 K 是"补完后使新均价的 TP 恰好落在距极值 500 点处"的目标均价。也就是说,这单一共补多少手是
为了把回本距离精确拉到目标位而数学求解 出来的,资金利用效率最优;若当前价格已无法达成目标(K ≥ 原均价),直接放弃补仓。
4. 四重保护 :单笔 2.0 手封顶、手数按品种规则规范化、23 根 M1 冷却、达不到目标不开仓。
5. 账务隔离 :停滞单的 comment 带 "Stall" 标记, CountGridPositions 统计网格层时将其排除,救援单不会打乱原有网格的层序和手数索引。
五、止盈系统:组合统一 TP + 强一致性保障
- 同方向全部持仓共享一个 加权均价 ±80 点 的止盈价( SetDirectionTPImmediately ),实现"整篮仓位一个小反弹就整体盈利出场"的网格盈利逻辑。
- TP 越过市价立即平仓 :在跳空/急速行情中,如果理论 TP 已经优于当前市价,不再挂单等待,直接市价了结,防止盈利回吐。
- 增量改单 + 失败重试队列 :先比对每单当前 TP,只给不一致的票发改单请求,减轻服务器压力;改单失败的 ticket 进`failedTickets` 数组,由 RetryFailedTPs 持续重试。
这保证了极端情况下不会出现"某一单 TP 没改成功、组合出场时残留裸单"的网格常见事故。
- OnTrade 事件、5 秒定时同步、每 tick 兜底三重校验,状态机还会比对持仓数/总手数/加权价决定是否需要重算,健壮性很高。
六、工程与运维层面的优势
1. 意图计数器防重复下单 :发出委托即`g_pendingBuyOrders++` ,并以"实际层数 + 在途意图"作为下一层判断依据( TryAddPositions ),
下单后 2 秒内还有专门的核对窗口,根治网格 EA 在单个 tick 内重复加仓的经典 bug。
2. 重启自恢复 :启停状态、暂停标志、累计盈亏、最后平仓时间存入 GlobalVariable( SaveRuntimeState );重启后从最后一张网格单成交价重建网格锚点,
且 V4.21 修复了补开时锚点必须取实际成交价的问题,避免重启/补单后每个 tick 都误触发而密集加仓。
3. 交易时段与经纪商适配 :通过`SymbolInfoSessionTrade` 读取品种真实交易时段( IsBuyTradeAllowedNow );
收到"市场关闭"返回码后自动冷却至下一交易时段,不空转报错;成交模式(FOK/IOC/RETURN)自动探测;手数按品种 step/min/max 规范化。
4. 可观测与人工干预 :图表面板实时显示多空手数、均价、今日与累计盈亏,并提供"停止/恢复运行""全部平仓"按钮,暂停状态持久化——自动化之外保留了人工熔断通道。
5. 多空完全独立 :各自的持仓、锚点、TP、止损、冷却互不干扰,并预留了 单向美元止损 InpDirectionLossLimit (默认关闭,建议实盘按需开启)。
6. 回测友好 :授权与到期检查在策略测试器中自动放行,状态持久化在测试器中跳过,不影响历史验证。
总结与必要提醒
这套 EA 的优势可以概括为一句话: 它没有改变网格策略"高胜率、靠组合小止盈积累利润"的盈利本质,但系统性地堵住了传统马丁的三个主要出血点 ——
- 用 回撤首单 + 虚拟首单 提高进场质量、解决拦截踏空;
- 用 三层过滤器 + 滞回阈值 回避急行情接飞刀;
用 深层加宽间距 + 温和封顶手数 + 目标反推的停滞补单 ,把深套区间的资金消耗曲线从"指数爆炸"压成"可控的线性增长",同时保留救援能力;
- 再用 TP 一致性管理、意图计数、重启恢复、时段适配 把工程事故风险降到很低。
|