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 决定手数)。外部参数举例:
- UseAutoBalanceControl:是否启用。
- TradesNumberToCalcLR:参与回归的最后交易数(如 3)。
- LRKoeffForRejectLots / RestoreLots / IntermedLots:降量/恢复/中间模式的坡度阈值(如 -0.030 / 0.050 / -0.020)。
- RejectedLots / NormalLots:最小量与正常量(如 0.10 / 1.0)。
五、嵌入 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;
六、风险提示
七、斜率反馈控制的代码
控净值曲线斜率,本质是「赚快了就降速、亏了就收手」的反馈控制。用近 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 挂上即可,是风险管理的通用件。