跳到正文
币安开发者文档「如果订单尝试以超出允许价格区间的价格执行,会发生什么」一节:吃单以超出允许价格区间的价格执行时订单过期(状态为 EXPIRED),过期原因为 EXECUTION_RULE_PRICE_RANGE_EXCEEDED;下方表格列出非 FIX 接口 expiryReason、FIX 接口 ExpiryReason 25056、用户数据流 eR 三个参考字段
吃单若以超出允许区间的价格成交,按 2026 年 10 月的币安现货价格区间规则,订单状态变为 EXPIRED,过期原因为 EXECUTION_RULE_PRICE_RANGE_EXCEEDED,非 FIX 接口读 expiryReason 字段。

币安现货订单显示「过期」是怎么回事

订单没等你撤单就成了「过期」,要么是订单类型自己的规则结束了它,要么是价格区间规则或交易所一方关掉了它。每种原因的处理办法各不相同,下面按原因逐个对照。

币安把没有经过你手动撤单、却被关闭的订单标为 EXPIRED(过期)。这有两种来源:一种是订单类型自己的规则把它结束了,比如没有任何成交的 LIMIT FOK 订单、只部分成交的 LIMIT IOC 订单或市价单;另一种是交易所撤掉了它,比如在强平或交易所维护期间。

先看已成交数量。成交了的部分已经是你的,过期的只是剩下没成交的那部分;已成交数量为 0,就是什么都没成交。再看订单类型。市价单、IOC、FOK 订单过期,本来就是这几种订单的设计。普通限价单设成 GTC(成交为止),本意是一直挂在订单簿上直到被撤销,所以这类订单过期,原因就在别处:价格区间规则、OCO 的另一张单、自我交易预防,或者交易所一方撤单。

同一张单反复过期时

在同一个交易对上原样再发一张同样的市价单,可能因为同样的原因再次过期。重发之前先改一改数量,或者换成限价单。

过期、撤销和被拒绝,三种状态有什么不同

订单记录里有三个状态词看着差不多,来源却不一样。CANCELED 是你自己撤销了订单。REJECTED 按币安文档的说法是「订单没有被交易引擎接受,也没被处理。」EXPIRED 则是订单已经被接受,之后被它自身的类型规则或交易所关闭。还有第四种状态 EXPIRED_IN_MATCH,属于自我交易预防,后面会讲到。

被拒绝的订单根本没进订单簿,处理办法和过期订单不一样。币安学院讲现货交易规则的指南列了常见的触发情形:没通过过滤器检查的订单会被拒绝,返回的错误码会写明是哪个过滤器;低于交易对 minNotional 的订单会被拒绝;交易对的 MAX_NUM_ORDERS 过滤器限制了你在这个交易对上最多能同时挂几张单,超出的订单会被拒绝;价格或数量不符合交易对的价格精度(tick size)或数量步长(step size),同样会被拒绝。

其中 PERCENT_PRICE_BY_SIDE 这个过滤器,规定了委托价格相对之前成交均价的有效范围。所以限价填得离这个交易对近期的成交价太远,提交时就可能被拒。这属于拒绝。下文第三节的价格区间规则要到撮合过程中才起作用,结果是过期。

市价单、IOC 和 FOK 订单:不能马上成交的部分就过期

生效时间(timeInForce)决定一张订单可以等多久。GTC(成交为止)让订单一直挂在订单簿上,直到被撤销。IOC(无法立即成交的部分就撤销)会在失效前尽量多成交。FOK(无法全部立即成交就撤销)在执行时如果不能全部成交,整张订单就失效。在状态说明里,市价单和 IOC 归为一类:只成交一部分时,剩下的过期。

用一组虚构的数字来看。假设你在一个交易冷清的交易对上下了一张 1,000 USDT 的市价买单,成交到 640 USDT 时已经没有能匹配的卖单了。这张订单最后的状态是 EXPIRED,已成交 640 USDT,剩下的 1,000 − 640 = 360 USDT 没有成交。如果原因只是订单簿里的挂单不够,附带的过期原因是 INSUFFICIENT_LIQUIDITY,含义是「订单簿中没有足够的订单与该订单匹配。」

FOK 订单是要么全部成交、要么一点都不成交。没有任何成交的 LIMIT FOK 订单整张过期,什么都没有成交。如果你给一笔订单簿一次吃不下的数量选了 FOK,剩下的办法就是改小数量,或者改用普通限价单。

部分成交的市价单想补齐,就针对剩下的数量另下一张单。限价单把价格设在你愿意付的价位,每一笔成交都会落在这个价格或更优的价格上,只是可能要在订单簿上挂一阵,不会马上成交。

大额订单为什么会因币安的价格区间执行规则过期

币安的现货交易对适用一条执行规则,限制成交价能离参考价格多远。开发者文档的说法是,这条规则「确保交易只能在参考价格附近的价格区间内(包括区间边界)执行」。如果吃单尝试以超出这个区间的价格成交,订单就会过期,过期原因是 EXECUTION_RULE_PRICE_RANGE_EXCEEDED。

由撮合引擎计算的参考价格,是一段时间窗口内成交价格的简单移动平均。也有交易对的参考价格在撮合引擎之外计算,用的是几种编了号的计算方法之一。价格区间本身由参考价格上下两侧的乘数决定。文档自己的例子用的参考价格是 10.00,买入和卖出的乘数都是 2.0 和 0.5:

  • 允许的最高成交价:10.00 × 2.0 = 20.00
  • 允许的最低成交价:10.00 × 0.5 = 5.00

这些数值标明是虚构的,别以为哪个真实交易对允许价格翻倍或者腰斩。每张订单的价格限制,在它开始吃单的那一刻就定下来:订单进入吃单阶段时会重新计算参考价格,这组限制在整个吃单阶段都有效,哪怕一张吃单在这个过程中会和很多张挂单成交。

把这两点连起来看,有一种情况最突出:在挂单稀少的交易对上下一张大额市价单。它会一档一档往下吃,一旦下一张挂单的价格落在区间之外,剩下没成交的部分就会以这个原因过期。这种情形是把这两条规则套到挂单稀薄的订单簿上得出的。

交易对如果没有 PRICE_RANGE 规则、没有参考价格,或者参考价格为 null,就不执行这条规则。在执行这条规则的交易对上,实际的解决办法是把订单改小,或者改用价格贴近当前市价的限价单,让订单没法把价格追得太远。用 API 的,可以通过 GET /api/v3/executionRules 和 GET /api/v3/referencePrice 读取实时数值;参考价格一直在变,建议通过 WebSocket 数据流跟踪。

是 OCO 的另一张单,还是你自己的挂单导致了过期?

OCO 订单里有一张单过期,通常就是设计本来的样子。OCO_TRIGGER 这个原因说的是:「OCO(One-Cancels-the-Other)订单对中的一个订单被取消,因为其另一个订单开始生效或整个OCO订单对过期。」先看是哪一张成交了,再去管另一张。两张单怎么联动,见在币安现货用一张 OCO 订单同时挂好止盈和止损。OTO 类型的订单列表也有类似的原因 OTO_PHASE_ONE_EXPIRED:订单列表中的生效订单过期,整个列表随之过期。

EXPIRED_IN_MATCH 指向自我交易预防(STP),这项检查防止同一个账户自己和自己成交。文档举的例子是:设置了 EXPIRE_TAKER 的订单,与订单簿上同一账户或同一 tradeGroupId 已有的订单匹配。实际排查时,看看同一个交易对的另一侧,有没有你自己更早挂的、价格正好会被新订单打到的单。如果你确实想让新单打到那个价位,先把那张旧单撤掉或者改价。

EXCHANGE_CANCELED 的情况最简单:订单被币安取消。文档给的交易所撤单例子是强平和维护。如果一张你从没动过的限价单过期了,上面几种原因又都对不上,就去查交易所公告,看过期前后那个交易对有没有维护;什么也没查到,就把订单号发给客服。

按过期原因代码,对上发生了什么

通过 API 查询订单时,结果里可能带一个 expiryReason 字段,只有过期的订单才返回,出现在 GET /api/v3/order、GET /api/v3/allOrders 以及 WebSocket API 的 order.status 和 allOrders 里。用户数据流里对应的字段是 eR。就算你只用 App,每个代码也都对应上面的某一种情况,拿这张表来缩小范围很快。

过期原因代码的含义接下来查什么
UNFILLED_IOC_QUANTITY_EXPIREDIOC 订单没有完全成交已成交数量;剩下的另下一张单
UNFILLED_FOK_ORDER_EXPIREDFOK 订单没有完全成交数量和订单簿深度对比;改小或换限价单
INSUFFICIENT_LIQUIDITY订单簿里没有足够的订单可以匹配交易对太冷清;改用可以挂着等的限价单
EXECUTION_RULE_PRICE_RANGE_EXCEEDED订单尝试以不符合价格区间规则的价格成交订单大小,以及价格离参考价格走了多远
OCO_TRIGGEROCO 的另一张单开始生效,或整个 OCO 过期哪一张成交了
OTO_PHASE_ONE_EXPIRED订单列表中的生效订单过期,整个列表随之过期第一张单为什么过期
REJECTED条件单或 OTO 订单放入订单簿时被拒绝,常见原因是资金不足和过滤器余额和交易对的过滤器
EXCHANGE_CANCELED订单被币安取消维护公告;带上订单号找客服

过期原因列表里没有自我交易预防对应的代码,EXPIRED_IN_MATCH 这个状态本身就是信号。

币安现货订单还会因为什么成交不了

币安的 GTC(成交为止)订单会过期吗?

不会因为时间到了而过期。GTC 订单在被撤销之前一直挂在订单簿上。不过它仍可能因为和时间无关的原因变成过期:交易所在维护或强平期间撤单、OCO 的另一张单开始生效、自我交易预防,或者一笔吃单成交会突破价格区间规则。

在哪里查币安交易对的价格区间?

币安通过现货 API 公布。GET /api/v3/executionRules 返回允许的价格区间,GET /api/v3/referencePrice 返回当前的参考价格。参考价格一直在变,建议通过 WebSocket 跟踪。开发者文档里参考价格 10.00、乘数 2.0 和 0.5 的例子,用的是虚构的数值。

会立即成交的限价做市单(Limit Maker)会怎样?

会被拒绝,根本挂不出去。限价做市单是一种只有作为挂单(maker)放进订单簿时才会被接受的限价单,如果它会作为吃单和已有订单立即成交,就会被拒绝。把价格调到不再穿过对手方的最优价,再重新提交。

Theo Marsh
在 Onbit 编辑部撰写新手指南。Theo 是我们编辑团队的笔名。Onbit 独立运营,你通过我们的链接注册时,我们可能会拿到一笔推广佣金——你不会因此多花一分钱。这里的内容都不是投资建议。