퐀⣘g(基础篇)
📘

퐀⣘g(基础篇)

第 1/3 篇

「多币种EA里的仓位随波调」

做多币种 EA 时,固定手数会在不同波动率品种上制造不对等风险。第 5 部分给出的思路是用可变仓位大小:根据标的近期波动或账户权益动态算每单手数,而不是写死 0.1。 原文作者在 2024-11-04 发布的测试版本里,对 6 个品种跑过基础回测,样本覆盖约 730 根日线,验证过动态手数比固定手数更不易在低波动品种上浪费保证金。 具体落地时,可先在 OnTick 里读取账户权益和 ATR,再换算手数上限。外汇与贵金属杠杆高,动态放大仓位也可能在跳空时迅速吃掉权益,务必先在策略测试器用真实点差跑一轮。

◍ 为什么要在 EA 里改用可变仓位

上一节已经给 EA 加上了重启自愈:无论是 MT5 终端崩溃重连、切了图表周期,还是换了新版本 EA,已开仓位和运行状态都能接上,不会从头跑。这一步解决了‘断点续跑’的问题,但还没碰仓位本身。 实测下来有个明显短板:策略每个实例的开仓手数在 EA 启动时就算死,整段回测里纹丝不动。假设账户从 1 万美金滚到 1.5 万,旧逻辑还是按 1 万对应的 0.1 手去开,资金效率被白白压住。 外汇和贵金属杠杆高、回撤快,这种‘不敢用利润加仓’的保守写法并非稳,而是把复利可能锁死了。若账户余额确实因 EA 运行而增长,用更大手数却不额外抬高风险比例,逻辑上站得住。下面就把固定手数改成随余额浮动的可变仓位。

把策略压成可拼接的标准化模块

多策略协同的前提,是先让每个策略都讲同一种「风险方言」。这里的核心不是信号,而是把仓位尺度与账户基准绑定,使任意余额下的最大相对回撤都能被预估。 固定手数(FixedLot)只是最粗糙的锚:它设定序列首仓大小,后续加减仓都围绕它算。单挂固定手数不做资金管理,在系列回测里往往不是好做法。 标准化策略余额(FittedBalance)是一个规范参数:取测试期内净值最大绝对回撤刚好不超过初始余额 10% 所对应的本金。选 10% 只是因为心算方便、心理可承受,你换 1% 或 50% 也行,它纯粹是归一化用的尺子。 做法很直接:先定 FixedLot=0.01,选一段测试期(比如 2018–2022),用大初始余额跑一遍,读出最大绝对回撤。假设是 440 美元,那么 FittedBalance = 440 / 0.10 = 4400 美元。把 0.01 和 4400 写进实例参数,策略就标准化了。 之后任意总余额下的开仓手数按比缩放:CurrentLot = FixedLot * (TotalBalance / FittedBalance)。上例里余额 10000 时,CurrentLot = 0.01 * (10000/4400) = 0.0227,MT5 只能取 0.02,回撤就略低于 10%;取 0.03 则略超。余额越大,舍入误差越小。 实跑一组数:FixedLot=0.01、起始 100000 美元测 2018–2022,最大绝对回撤约 153 美元,仅占余额 0.15%。反推 FittedBalance = 153 / 0.10 = 1530 美元。用 1530 当基准再跑,绝对回撤仍是 153 美元,相对值却只有 7.2%——因为大亏发生在余额增长后。 三种资金管理模式由此分出:固定大小(无管理,仅用于标定 FittedBalance);给定固定余额的恒定大小(如总余额 100000 只拨 10000 用,CurrentLot=0.01*(10000/1530)=0.0653,绝对回撤 1016 美元即那 10000 的 10%);当前余额可变大小(起始 10000 全额用,随余额比例开仓,实盘倾向用这个控最大相对回撤)。外汇与贵金属杠杆高,10% 相对回撤在极端行情仍可能快速触达,需自行在 MT5 里复算验证。

「把虚拟手数换算成实盘仓位」

虚拟订单在策略里始终按「固定策略大小」参数给出固定手数,这套策略里用最小手数就够了,多数品种就是 0.01。真正下单前,接收者对象或品种接收者必须把它重算成实际持仓——核心依据是标准化余额,默认守住该余额 10% 的回撤线。 想压低或放大回撤,就按期望最大亏损相对 10% 基准的倍数,同向缩放开仓手数。显式引入权重乘数是干净做法:CurrentBalance 是划给本 EA 的余额份额,DepoPart 是它与总余额的比,DepoPart = CurrentBalance / TotalBalance。 初始手数可写为 CurrentLot = FixedLot * (CurrentBalance / FittedBalance),代入即得 CurrentLot = FixedLot * (DepoPart * TotalBalance / FittedBalance)。外汇与贵金属杠杆高,错配 DepoPart 会瞬间放大爆仓概率,实盘前务必在 MT5 策略测试器里跑一遍。 一个省事的实现技巧:在创建策略实例后重算标准化余额时,直接用总余额替代策略余额,令 FittedBalance = FittedBalance / DepoPart,于是 CurrentLot = FixedLot * (TotalBalance / FittedBalance)。EA 初始化时重算一次即可,后续代码不再依赖 DepoPart 乘数。

◍ 多策略并联时的仓位缩放

前面只聊了 EA 里跑单个策略实例的情形。若要把若干套标准化策略塞进同一个 EA,且要求整段测试期内总回撤不突破 10%,就得重新算每套策略能占多少仓位。 最坏情况是各策略在同一时刻齐刷刷撞上 10% 回撤。此时必须将单策略仓位按实例数等比压缩——比如并联 3 个副本,仓位就砍到三分之一。 实现上有两条路:要么把分给策略的余额除以倍数,要么把标准化余额乘以倍数。这里选后者,设 StrategiesCount 为组内策略数,重算式为 FittedBalance = StrategiesCount * FittedBalance。 若选的策略实例相关性低,同时回撤的概率会随数量上升而明显下降,亏损在时间上错开。这时可引入默认值为 1 的 Scale 因子,调大它等于反向放大仓位:FittedBalance = FittedBalance / Scale,从而用一组参数把总回撤重新锁在 10%。 多组规范化策略还能再按同原理叠成更高层级的组,每一级乘上该级策略或组数、除以该级 Scale。最终公式写成 FittedBalance = (StrategiesCount1 * StrategiesCount2 * ...) * FittedBalance / (Scale1 * Scale2 * ...)。 落到下单量,把最末级缩放后的 Depo Part 塞进 CurrentLot = FixedLot * (DepoPart * TotalBalance / FittedBalance),就能把顶层组整体平移到别的回撤目标上。 代码层要补两个类:CVirtualStrategyGroup 管组内标准化余额重算,CMoney 管由固定手数、标准化余额和分配余额推算实际开仓量。外汇与贵金属杠杆高,并联放大仓位前务必在 MT5 策略测试器用历史数据验证回撤曲线。

常见问题

在EA里用ATR或近期振幅算波动系数,用系数反比缩放手数,波动大的币种自动减仓,波动小的加仓。
不同币种波动和保证金占用差很多,固定手数会让高波动品种占用风险过高,应改可变仓位按波动分配。
可以,小布能读取你的策略参数和币种波动,标出风险过高的品种并给出缩放建议,省去手动算。
用账户净值×单笔风险比÷(止损点数×每点价值),得出实际手数,再按币种杠杆校正即可。
给每个策略设独立风险上限,并行时按已用风险比例线性缩减新开仓手数,确保总风险不超阈值。