多EA组合运行架构实战:资金分配策略与订单冲突处理方案
多EA组合运行架构实战:资金分配策略与订单冲突处理方案
去年整理一份跟单账户的成交记录时发现一个反直觉的数字:同一套逻辑拆成三个EA并行跑,单EA各自回测的最大回撤都在12%上下,但组合运行三个月后账户的实际回撤只有7.4%。相关性低是一方面,更关键的是三个EA的入场时点天然错开,等于给彼此做了个粗糙的资金缓冲。这个现象让我重新审视多EA组合的架构问题——很多人把精力全花在单个策略的优化上,却忽略了多实例共存时资金怎么切、订单怎么不打架,这两件事做不好,再好的策略也会互相拖累。

资金分配不是简单除以N
最常见的做法是把账户净值平均切成几份,每个EA配一份。这个思路在策略相关性接近零时勉强成立,但实际运行中会出问题。假设账户10000美元,三个EA各配3300美元,其中两个同时触发信号,各自按0.5手开仓,保证金占用瞬间翻倍,第三个EA的信号来了反而因为可用保证金不足被拒单。这不是策略的问题,是分配机制太粗糙。
我后来改用动态权重分配,核心逻辑是按每个EA的历史波动率倒数来切分资金,再叠加一个保证金占用上限的硬约束。伪代码大致是这样:
- 计算每个EA近60个交易日的日收益率标准差 sigma_i
- 原始权重 w_i = (1/sigma_i) / sum(1/sigma_j)
- 加入保证金约束:若某EA单笔最大保证金占用 > 账户净值 × 15%,则压缩该EA权重至满足约束
- 每20个交易日重新计算一次权重,单次调整幅度不超过原权重的30%,避免频繁切换
这个做法的好处是把资金分配和风险预算绑在一起。波动大的EA自动拿少钱,波动小的拿多钱,组合层面的波动率反而更平稳。我在一组三个EA的测试里对比过,等权分配下组合年化波动率约18.6%,动态权重下降到14.2%,收益只少了不到两个百分点。这就是关键——用可控的收益让步换回撤的收敛。
注意一个坑:波动率窗口别设太短。用20日窗口时,某个EA因为连续几笔小止损导致波动率骤降,权重被瞬间拉高,结果下一波行情来了它仓位过重。60日是个比较稳的折中,实测下来权重切换的平滑度明显好于短窗口。
订单冲突的三种典型场景
多EA跑在同一账户上,订单冲突不是「会不会」的问题,是「什么时候」的问题。我遇到过三类,每一类都吃过亏。
第一类是净持仓冲突。两个EA一个做多一个做空同一品种,MT4/MT5的净持仓模式下会互相抵消,表面看仓位是零,但两个EA各自认为自己持仓中,后续的止损止盈逻辑全乱。解决办法是给每个EA分配独立的magic number,并在EA内部维护自己的虚拟持仓表,所有平仓判断只认自己的magic。别依赖平台的总持仓数据。
第二类是止损价覆盖。同一品种两个多单,一个设了止损在某个位置,另一个没设或者设得更远,某些经纪商的服务器逻辑会以最新提交的为准。我在一个测试账户上就见过止损被意外放宽的情况。规避方式很简单:每个EA的止损必须用独立的订单号挂单,或者干脆用EA内部逻辑监控价格触发平仓,不依赖服务器端止损。
第三类是保证金挤兑。这个最隐蔽。三个EA里两个同时加仓,第三个的信号来了,OrderSend返回错误码134(资金不足)。很多人只处理了返回值没做重试,信号就丢了。我的做法是在下单函数里加一层保证金预检:
- 调用OrderCalcMargin计算本单预计占用
- 与AccountInfoDouble(ACCOUNT_MARGIN_FREE)对比,预留20%缓冲
- 不足则按可用保证金的70%反推最大手数,向下取整到0.01
- 仍不足最小手数则记录日志并跳过,不强行下单
这层预检加上之后,因保证金不足导致的丢单率从测试期的约6%降到了0.3%以下。代价是偶尔会缩小手数,但比丢信号强。
品种命名差异带来的隐性冲突
多EA跨经纪商部署时,品种名称不统一是个容易被忽略的雷。同一个黄金,有的服务器叫XAUUSD,有的带后缀。合约大小也不一样,标准账户和微型账户的1手代表的盎司数可能差十倍。如果你的EA里手数计算是写死的,换个服务器跑出来的风险敞口完全不同。
我习惯在EA初始化时做一次品种参数探测:读取SYMBOL_TRADE_CONTRACT_SIZE和SYMBOL_VOLUME_MIN/MAX,把手数计算全部改成基于「目标风险金额 ÷ (止损点数 × 每点价值)」的动态公式,而不是固定手数。这样换服务器、换账户类型都不用改代码。部署前用脚本打印一遍关键参数核对,比事后排查省事得多。
一个可复用的部署检查清单
说个实操中的小插曲。有次上线第四个EA,前三个跑得好好的,第四个一挂上去,原本稳定的那个EA开始频繁出现无效止损的错误。查了半天发现是第四个EA用了相同的magic number段,订单归属判断串了。改magic之后一切正常。这种低级错误在赶进度的时候特别容易犯。
所以我现在固定用一份检查清单,每次加EA之前过一遍:
- magic number全局唯一,建议按EA编号 × 1000 起跳
- 每个EA的手数计算基于动态风险公式,不写死
- 止损止盈由EA内部逻辑管理,不依赖服务器端挂单
- 下单前做保证金预检,预留至少20%缓冲
- 品种参数在初始化时探测,不硬编码合约大小
- 组合权重每20个交易日复核一次,调整幅度设上限
回测数据上,这套架构跑三个中等相关性的趋势类EA,两年周期内组合胜率约54%,盈利因子1.42,最大回撤7.8%,单EA最大回撤均值11.3%。组合的回撤收敛是实打实的,但别指望它能把亏损策略变成盈利策略——架构解决的是共存问题,不是策略本身的问题。
最核心的一条建议:先把magic number隔离和保证金预检这两件事做扎实,再去谈资金分配的精细化,顺序反了会白走很多弯路。
免责声明:本文仅代表作者观点,不构成任何投资建议。市场有风险,交易需谨慎。
