EA 交易的限制与验证:开仓前的 7 道安全检查
一个稳健 EA 在发单前必须自查什么——交易时段、保证金、止损风险、新 K 线、挂单与手数限制。
一、为什么 EA 需要「限制」
EA 一旦自动运行,就可能因为逻辑漏洞在几秒内下几十单、或在单边行情里无限加仓,把账户打穿。所谓「限制」,就是给 EA 装上护栏:单日最大单数、最大持仓、最小下单间隔、最大回撤熔断。没有这些,回测再漂亮也只是纸面富贵。
限制的本质是承认「我会写错代码、市场会出意外」。护栏不是不信任策略,而是不信任自己和极端行情。职业 EA 的第一行代码往往不是信号,而是风控。
二、单日/单品种订单数上限
用 OrdersTotal() / PositionsTotal() 配合时间戳,限制单位时间内的下单次数。例如「距上一单至少 60 秒」「当日最多 20 单」。这能挡住因信号抖动导致的重复下单,也能在逻辑死循环时保命。
datetime lastOrder = 0;
bool CanOrderNow()
{
if(PositionsTotal() >= MaxPositions) return false;
if(TimeCurrent() - lastOrder < MinGapSec) return false;
return true;
}
三、保证金与可用资金护栏
下单前用 AccountInfoDouble(ACCOUNT_MARGIN_FREE) 或 AccountInfoDouble(ACCOUNT_EQUITY) 检查剩余保证金/权益是否够。结合「单笔风险不超过净值 1%~2%」反推手数,从源头避免保证金不足被拒或强平。
更稳妥的做法是动态手数:随净值增长放大、随回撤缩小。这样在连亏时自动降仓,而不是死扛固定手数直到爆仓。
四、最大回撤熔断
记录策略启动以来的权益高点,当当前权益低于高点一定百分比(如 15%)时,强制停止开新单甚至清仓。这是 EA 的「保险丝」,防止一次黑天鹅或一段持续亏损把账户打成负数。
五、验证:先在历史里拷问 EA
上线前用策略测试器的「每 tick」模式把 EA 跑穿:看它在极端行情(跳空、流动性枯竭、点差飙升)下是否还守得住限制。测试器里人为制造极端条件(如调大点差、选剧烈行情段),观察护栏是否真的工作。
六、验证:用日志与断言抓逻辑错误
在关键分支加 Print/Comment 输出状态,用 OnTrade 监听成交事件核对「该下的单是否真下了、该止的损是否真止了」。更复杂的,可在开发期用断言(ASSERT 风格日志)捕获不变量被打破的情况,比如「持仓数不应为负」。
- 每单前后打印 信号/手数/滑点/Retcode
- 用 OnTrade 核对实际成交与预期一致
- 对关键不变量加断言式日志
- 回测里制造极端行情验证护栏生效
七、常见验证盲区
很多人验证只看「盈利」,不看「限制是否真触发」。要专门测试:把 MaxPositions 设成 1,看 EA 会不会违反;把行情调成暴涨,看回撤熔断会不会停。只有这些边界被验证过,EA 才算可信。
八、限制参数的取值经验
单数上限、最小间隔、回撤熔断百分比没有标准答案,取决于策略频率与品种波动。建议从保守值起步,再用回测逐步放宽到「刚好不挡正常交易」。一组常见起点:最小下单间隔 MinGap=60 秒、最大同方向持仓 MaxPositions=3、回撤熔断 15%。重点是这些数字要来自你对自己策略的观察,而不是拍脑袋,且上线后要随实盘表现微调。
九、护栏也要被拷问
护栏上线前要在测试器里被『拷问』:把 MaxPositions 设成 1,看 EA 会不会违反;把行情调成暴涨暴跌,看回撤熔断会不会停、市价单会不会被滑点打穿。很多人只测『盈利多少』,不测『限制是否真触发』。没被测过的护栏等于没装——它只是在代码里安静地躺着,真出事时从不起作用。
十、限制的优先级
记住:限制的目标不是赚更多,而是保证 EA 不会自己把自己搞死——这条优先级高于任何收益优化。一个平庸但永不出格的 EA,远胜暴利但随时崩盘的 EA。