首页 / 交易学院 / 小布知识库 / EA 平衡曲线斜率控制:用反馈自动调节交易量
EA 平衡曲线斜率控制:用反馈自动调节交易量
🤖

EA 平衡曲线斜率控制:用反馈自动调节交易量

EA 开发实战 难度 · 进阶 2013 12 分钟阅读
资金管理反馈控制EA

一、为什么要控制净值曲线斜率

固定手数的 EA 一旦进入不利周期,回撤会线性放大。本文的思路是:监控“余额/净值曲线”的斜率(即账户是在变好还是变坏),表现差就自动削减手数,恢复后再加回来。它本质是资金管理的反馈控制,不是盈利秘方——作者明确说它不能把亏损 EA 变盈利,只能平滑回撤、避免账户被一次不利周期打爆。

二、斜率的数学含义

把已平仓交易按时间连成余额曲线,对其做最小二乘线性回归得到直线 A·x + B,系数 A(文中 LR_koeff_A)就是曲线坡度,也就是斜率。斜率持续为正说明系统在赚钱,持续为负说明在亏钱。控制逻辑就是盯着这个 A:低于阈值就降手数,高于阈值就恢复正常量。

三、反馈控制的状态机

系统用一个 LotsState 枚举管理工作模式:LOTS_NORMAL(正常)、LOTS_REJECTED(拒绝/最小量)、LOTS_INTERMEDIATE(中间量)。控制类型有四种:STEP_WITH_HYSTERESIS(带迟滞步进,升/降在不同坡度触发,避免抖动)、STEP_WITHOUT_HYSTERESIS(无迟滞)、LINEAR(手数随坡度线性变化)、NON_LINEAR(未实现)。带迟滞的设计是为了防止在临界坡度附近频繁切换手数。

四、关键类与参数

实现上由一组类构成:TradeSymbol(品种信息与手数标准化)、TBalanceHistory(读历史平仓、按分钟分组求和)、TBalanceSlope(CalcLR 做回归得 LR_koeff_A)、TBalanceSlopeControl(根据 min_slope/max_slope/centr_slope 决定手数)。外部参数举例:

五、嵌入 EA 的方式

#include <BalanceSlopeControl.mqh>
TBalanceSlopeControl BalanceControl;

// OnInit
BalanceControl.SetTradeSymbol(Symbol());
BalanceControl.SetControlType(BalanceControlType);
BalanceControl.SetControlParams(LRKoeffForRejectLots, LRKoeffForRestoreLots, LRKoeffForIntermedLots);
BalanceControl.SetSlopePoints(TradesNumberToCalcLR);

// OnTick 开仓前
BalanceControl.RefreshSymbolInfo();
double lots = (UseAutoBalanceControl==Yes)
  ? BalanceControl.CalcTradeLots(RejectedLots, NormalLots)
  : NormalLots;

六、风险提示

⚠ 这不是万能药
1) 不能把亏损 EA 变盈利,只是控制回撤。2) 若原 EA 用马丁格尔(Martingale),未改原系统不能直接套,会放大风险。3) 过度优化 centr_slope 等参数易过拟合。4) 平衡变动周期必须远大于系统反应时间,否则调节失效。5) 利润会比不控制时略少,这是平滑回撤的代价。

七、斜率反馈控制的代码

控净值曲线斜率,本质是「赚快了就降速、亏了就收手」的反馈控制。用近 N 根权益柱算斜率(线性回归或简单差分),斜率为负就减仓甚至暂停,斜率为正且稳定才维持仓位。

double slope = (Equity(n)-Equity(n-k))/k;
if(slope < 0)        lot = lot * 0.5;     // 转负减仓
else if(slope > thr) lot = lot * 1.0;    // 稳定维持
else                 lot = lot * 0.8;
✦ 把曲线当被控对象
净值曲线斜率是「系统健康度」的仪表。负斜率就减仓,比等爆仓再慌强得多。

八、结合回撤硬上限

斜率控制是软调节,还要配硬上限:单日回撤或峰值回撤超 X% 直接熔断停交易。软硬结合——软调节平滑过渡,硬上限保命,避免斜率判断滞后时一夜归零。

硬上限的值要和历史最大回撤匹配,定太松没用、太紧则正常波动也被误杀。用样本外数据校准,而非拍脑袋。

九、实盘注意:平滑窗口

斜率对窗口长度极敏感:窗口太短被单笔盈亏晃得来回变,太长又反应迟钝。实务用「中等窗口加指数平滑」,让调节平缓;并且只对「已平仓实现的权益」算斜率,避免浮盈浮亏的噪音干扰。

把斜率调节做成独立模块,任何 EA 挂上即可,是风险管理的通用件。

十、小结

✦ 小结
控净值曲线斜率 = 反馈控制:近 N 柱算斜率,负则减仓、稳则维持,把曲线当被控对象。必须配回撤硬上限保命,窗口用中等加指数平滑、只算已平仓权益,避免噪音误调。做成独立模块多 EA 复用。

常见问题

不能原样一起用。马丁格尔本身依赖加仓翻本,而斜率控制会削减手数,二者逻辑冲突;若原 EA 是马丁格尔,必须先改造资金管理方式再接入,否则可能在不利周期里既加仓又被系统砍量,行为不可预期。
返回当前这一笔应该用的手数。内部先算当前斜率,若历史交易数不足则退回最小量(保守),再根据控制类型在 rejected_lots 与 normal_lots 之间给出最终值。如果你的 EA 自带资金管理,把 NormalLots 换成你算出的量再传入即可。
不带迟滞时,坡度在临界值附近反复横跳会导致手数频繁切换,既增加交易成本又让曲线抖动。带迟滞设为“降量触发坡度更低、恢复触发坡度更高”,形成死区,避免无谓切换。