首页 / 交易学院 / EA 交易的限制与验证:开仓前的 7 道安全检查
EA 交易的限制与验证:开仓前的 7 道安全检查
🛡️

EA 交易的限制与验证:开仓前的 7 道安全检查

一个稳健 EA 在发单前必须自查什么——交易时段、保证金、止损风险、新 K 线、挂单与手数限制。

EA 开发实战 难度 · 进阶 2026-03-10 8 分钟阅读
EA验证保证金手数限制新K线交易时段OrderCalc

1) 检查交易时段与报价时段

用 SymbolInfoSessionTrade() 与 SymbolInfoSessionQuote() 查询品种当天的交易或报价时段。在休市或流动性极差时段发单,容易被拒或滑点巨大。

2) 检查所需保证金(OrderCalcMargin)

开仓前用 OrderCalcMargin(type, symbol, lots, price, margin) 预估保证金占用,确认账户净值足够。它同时支持市价单与挂单(挂单保证金率由 SYMBOL_MARGIN_LIMIT/STOP 等系数决定)。

外汇挂单的预付款率通常为 0,但部分品种或系统会收,务必动态计算而非硬编码。

3) 计算潜在盈亏与止损风险(OrderCalcProfit)

用 OrderCalcProfit() 在设定止损位后预估这笔交易的最大亏损,把它纳入资金管理判断,而不是盲目发单。

4) 只在新 K 线触发一次(isNewBar)

多数系统在每根 K 线只算一次信号。用 SeriesInfoInteger(Symbol, Period, SERIES_LASTBAR_DATE) 与静态变量比对,实现 isNewBar(),避免同一信号在单根 K 线内重复发单。

实盘里 OnTick 会被每个 tick 调用,若不控制新 K 线,一个信号会被执行几十次——这是 EA 最常见的 bug 之一。

5) 限制挂单数量与品种总手数

用 ACCOUNT_LIMIT_ORDERS 与 OrdersTotal() 限制账户挂单数;用 SYMBOL_VOLUME_LIMIT 与 PositionVolume()、PendingsVolume() 计算某品种还能开多少手,防止超规则被拒。

6) 校验手数合规性(SYMBOL_VOLUME_MIN/MAX/STEP)

手数必须落在最小到最大区间且是步长的整数倍。用 CheckVolumeValue() 做校验:volume 等于 round(volume/step) 乘 step,并在边界处报错提示。

7) 把它们串成开仓前清单

一个稳健 EA 的发单流程应是:时段检查到手数合规到保证金足够到潜在亏损可接受到是新 K 线到未超挂单或手数上限,才调用 OrderSend。任一项不通过就中止。

常见问题

前者算占用多少保证金,后者算这根 K 线到止损止盈能赚或亏多少。一个管占用,一个管风险。
SeriesInfoInteger 直接返回最后一根 K 线的开启时间,比自己拼时间字符串可靠,且天然适配任意周期。
手数不是任意小数。0.13 手若步长是 0.1 就不合法;必须取整到步长倍数,否则 OrderSend 直接报错 4751(手数无效)。
都是本地计算,微秒级,远快于网络发单。与其省这几行,不如省下被拒单和重复发单的麻烦。