把简单对冲网格改成可优化的版本
把简单对冲网格改成可优化的版本
原版简单对冲网格在单边行情里会无限加仓,回撤失控。把逻辑拆成「开首单—反向挂单—同距加层」三步后,每一层的手数和间距都能作为参数暴露给 MT5 优化器。
核心思路是:首单方向由信号决定,之后每跌破/涨破一个固定间距就补一单反向,形成网状持仓。这样持仓盈亏曲线不再是一条线,而是一张随价格往返收敛的网。
在 2024 年 12 月的一篇实盘测试中,该结构在 XAUUSD 的 M15 上跑 3 周,固定间距 150 点、每层 0.01 手,最大浮亏一度到 380 美元(账户 1000 美元基准),外汇与贵金属杠杆品种高风险,网格浮亏可能快速放大。
[CODE]
input double GridStep = 150; // 网格间距,单位点
input double LotSize = 0.01; // 每层手数
input int MaxLayers = 10; // 最大加层数量
void OnTick()
{
if(PositionsTotal()==0) // 无持仓则开首单
{
trade.Buy(LotSize, _Symbol);
return;
}
double lastOpen = PositionGetDouble(POSITION_PRICE_OPEN);
if(_Ask <= lastOpen - GridStep*_Point) // 跌够一个间距补卖
{
if(PositionsTotal() < MaxLayers)
trade.Sell(LotSize, _Symbol);
}
}
[/CODE]
上面这段只保留了买首单、跌距补卖的骨架。GridStep 直接决定网密不密:调成 50 点网更密、回本快但占用保证金陡增;调成 300 点则对抗单边能力稍强,但浮亏周期更长。打开 MT5 把这几个 input 拉进策略测试器跑一遍 EURUSD 或 XAUUSD,比看文字直观。
class="kw">input class="type">class="kw">double GridStep = class="num">150; class=class="str">"cmt">// 网格间距,单位点 class="kw">input class="type">class="kw">double LotSize = class="num">0.01; class=class="str">"cmt">// 每层手数 class="kw">input class="type">int MaxLayers = class="num">10; class=class="str">"cmt">// 最大加层数量 class="type">void OnTick() { if(PositionsTotal()==class="num">0) class=class="str">"cmt">// 无持仓则开首单 { trade.Buy(LotSize, _Symbol); class="kw">return; } class="type">class="kw">double lastOpen = PositionGetDouble(POSITION_PRICE_OPEN); if(_Ask <= lastOpen - GridStep*_Point) class=class="str">"cmt">// 跌够一个间距补卖 { if(PositionsTotal() < MaxLayers) trade.Sell(LotSize, _Symbol); } }
◍ 先把数学底盘打牢
这一节只做一件事:把简单对冲 EA 的数学优化底盘单独拎出来啃透。前面两篇已经落地的两个模块——简单对冲EA和简单网格EA——先搁一边,本文不碰代码层改造。 原因很直接:数学分析和暴力搜索要同时写进一篇,深度必然被切碎。所以本篇专注理论计算和推导,把最优参数空间用数学方式先框出来;后续文章再拿这套结论去动 MT5 里的源码。 你可以现在打开 MT5 的 EA 参数面板,对照自己跑过的对冲单手数比例,先记下当前值——下一篇代码优化会直接复用本节算出的边界。外汇与贵金属杠杆高,参数错配可能放大回撤,验证前先用模拟盘。
「数学优化先筛,蛮力穷举后验」
谈策略优化,很多人第一反应是调参数跑回测,但那只是蛮力穷举的冰山一角。严格说,优化是把系统有效性推进到资源约束下边界的行为,绝对完美只是理想,真实目标是用有限算力逼出最佳配置。 在经典对冲策略里,两条路最值得盯:一是数学优化,用盈利函数、回撤函数等量化结构先给参数空间建模,靠可验证数据缩小范围;二是蛮力方式,把每个输入组合都跑一遍回测,目标通常是最大化盈利或最小化回撤。后者的问题很实在——输入组合爆炸,时间和算力根本扛不住全量穷举。 实操上,先用数学优化把候选集砍掉一大半,再对剩余最有前景的配置做蛮力回测,能省下数量级的计算量。外汇与贵金属市场高杠杆、高波动,这种组合法不直接承诺收益,但能让你在 MT5 里把优化周期从几天压到几小时,概率上更稳地摸到策略边界。
把盈利拆成可验证的数学骨架
做数学优化前,先把影响结果的变量钉死:初始位置 IP(1 买 0 卖)、初始手数 IL、买卖止盈 BTP/STP、买卖间距 D、手数乘数 M、单轮订单数 N。盈利函数 p(x) 就是这些量的显式组合,核心目的不是算钱,而是以点数为单位看每轮净盈亏,这样跨微型/标准账户都通用。 单笔订单收尾时(N=1,IL=0.01,IP=1),g(x) 直接取 BTP,p(x)=100×0.01×BTP=BTP 点。这里乘 100 是把 0.01 手换算成准确点值,经纪商手数必须是 0.01 倍数,所以公式里嵌了 floor 函数截断小数——例如 IL=0.01、M=1.5 时 100×0.01×1.5=1.5,floor 后变 1,对应实际手数 0.01,下一笔 0.01×1.5×1.5=0.0225 实开 0.02,模型才不虚高。 N 往上加,亏损段按 -100×floor(IL)×D 累积,盈利段带 M 的次方。用 Desmos 跑默认参数(BTP=STP=15、D=15、M=1.5、N 到 10),整数域里能看到稳定 15 点利润。但同参数下最大回撤方程把 n 从 0 迭代到 x-1,第 10 笔亏时回撤约 $15,345,奖励才 $15,风险回报极度扭曲。 把 BTP/STP 拉到 50 点,回撤结构反转成持续收益;再试 100 点,c(x) 不随 x 变而 p(x) 升。陷阱在隐藏变量 p——轮次完成概率,BTP/STP 越高 p 越低,EURUSD 波动 100 点已很大,临时锁 50 点比较稳。点差 S 作为常数从 p(x)、c(x) 里减,x 增大时点差亏损可飙到约 32,000 点($3,200),直接吃掉风险回报。 最后一步是减蛮力:像 BTP=STP=D=15、M=1.5 这种组合实测无效,该在码优化前剔掉。系统筛次优参数留到下一期,当前先记住——开 MT5 把 IL、M、D 输进 Desmos 对照自己的点差,看回撤是不是比你想的厚得多。
◍ 从数学模型切到代码落地的下一步
前面几节把简单对冲策略的数学骨架拆完了,这一节该收尾的是思路而非结论:下一部分不会再泡在公式里,而是直接把那些原则和见解塞进 MQL5 代码,跑实际交易场景的实用优化。 对想跟下来的交易者来说,现在能做的只有一件事——打开 MT5 把前几节的对冲逻辑先手写一遍回测框架,等后续代码放出时能立刻对照差异。外汇和贵金属杠杆高、滑点狠,任何“最大回报”都只是概率倾向,别拿纸面推导当实盘保票。 作者留了个口子:系列里你跑不通的地方、觉得数学假设太理想化的点,直接丢反馈。续作方向基本锁定在蛮力优化,思路够直白,但计算量会先撞上 MT5 策略测试器的墙。