独立交易读本 · 不提供投资建议
nalog.币安现货 · 下单与规则
SPOT TRADING JOURNAL看懂指令,再决定下一步
从这里开始限价单不成交最小下单金额撤单后发生什么

币安 OCO 订单止盈只成交一部分,止损单就没了:剩下的数量怎么办

币安现货卖出 OCO 的限价那一边只要成交了一点,止损那一边就会被系统结束,剩下没卖的数量只挂在止盈价上、没有止损。用一笔 0.5 ETH 的示例说明该看哪三处记录,以及剩余数量怎样重新挂上保护。

本文内容OCO 是两张数量相同的单,最后只留一张一笔 0.5 ETH 的卖出 OCO:成交 0.2 之后在当前委托、订单历史、成交历史里各看什么剩下的 0.3 ETH 想重新带上止损:先撤,再挂反过来:止损先触发,止盈那一边先被撤手动撤掉一边,整张 OCO 都撤

打开【当前委托】找到这张 OCO。止盈那一边显示部分成交,止损那一边却已经不在列表里——这不是页面没刷新,止损单已经被系统结束了。剩下没卖出去的数量,眼下只挂在止盈价上,价格往下走时没有任何一张单会替你卖。

依据在币安现货接口文档。OCO 上线时的更新日志写的执行顺序是:限价那一边(LIMIT_MAKER)一旦被触碰,先执行限价单,再撤掉止损那一边。“触碰”不要求整张成交,对面吃掉你一部分就算。接口术语表的说法是,两张中任何一张执行,另一张会“自动过期”(automatically expired)。

OCO 是两张数量相同的单,最后只留一张

一张 OCO 由两张订单组成:一张限价单,接口里的类型是 LIMIT_MAKER,只能作为挂单方进订单簿;一张止损单,类型是 STOP_LOSS 或 STOP_LOSS_LIMIT。更新日志写明两边“必须数量相同”。

价格也有顺序。卖出 OCO:限价 > 最新成交价 > 止损触发价;买入 OCO 反过来:限价 < 最新成交价 < 止损触发价。三个数要把当时的最新价夹在中间,否则下单就被拒。

这套设计默认的结局是“整笔止盈”或“整笔止损”。可限价单是挂在订单簿上排队的,对面来的买单可能只够吃掉一部分,规则照样把它算作“限价那一边先执行了”。部分成交本身怎么回事,见只买到一部分,剩下的订单去了哪里。

一笔 0.5 ETH 的卖出 OCO:成交 0.2 之后

示例 · 卖出 OCO(假设数据,非真实账户)

持有 0.5 ETH,最新成交价 2,450 USDT。挂一张卖出 OCO:止盈限价 2,600,止损触发价 2,300,止损限价 2,290,两边数量都是 0.5 ETH。2,600 > 2,450 > 2,300,价格顺序满足,下单通过。

后来价格涨到 2,600。你的卖单排在同价位已有挂单后面,轮到你时,对面的买单只剩 0.2 ETH。按文档的执行顺序,这一刻依次发生:

  1. 限价那一边成交 0.2 ETH,状态变成部分成交,剩下 0.3 ETH 继续挂在 2,600;
  2. 止损那一边被结束,接口里的状态是 EXPIRED;
  3. 整组 OCO 只剩这张部分成交的限价卖单。

再往后价格跌回 2,250。那 0.3 ETH 不会在 2,300 被触发卖出——触发它的那张单已经不存在。它仍挂在 2,600,等价格回去。按 2,450 算,这 0.3 ETH 约值 735 USDT;跌到 2,250 时约 675 USDT。这 60 USDT 的回落,全落在没有止损的那 0.3 ETH 上。

在当前委托、订单历史、成交历史里各看什么

当前委托:只应剩一张限价卖单。看它的已成交数量和剩余数量,示例里应是 0.2 和 0.3。如果这里还能看到止损单,说明限价那一边其实还没成交,前面的判断不成立。

订单历史:止损那张单在这里,结局不是成交。接口把它记作 EXPIRED,和你自己点撤单的结局分开记;两种状态在记录里怎么区分,见订单显示 EXPIRED,是没成交,还是已经结束。

成交历史:只有限价那一边的成交,可能一笔,也可能拆成好几笔,加起来应等于 0.2 ETH。对不上时,按订单历史和成交历史怎样核对同一张委托逐笔对。

剩下的 0.3 ETH 想重新带上止损:先撤,再挂

想让剩余数量重新回到“上面止盈、下面止损”,做法是撤掉那张剩余的限价卖单,等 0.3 ETH 回到可用余额,再按当时的价格挂一张 0.3 ETH 的新 OCO。顺序不能反:剩余挂单还占着这 0.3 ETH,不撤就挂,可用余额不够(原因见挂单占用余额)。

撤单和重挂之间有个空档。撤单发出后,先确认原单在订单历史里已经结束、成交数量停在 0.2 没再变,再按真正剩下的数量挂新单——撤单途中又成交一点的情况,见点了撤单,可以马上重新下一整笔吗。

新 OCO 的价格顺序按挂单那一刻的最新成交价重新判断。假设这时价格停在 2,590:止盈 2,600 仍高于 2,590,止损触发 2,300 仍低于它,可以照原价重挂。假设价格已经冲到 2,620:止盈再填 2,600 就不满足“限价高于最新价”,会被拒,接口错误代码文档里对应的原文是 “A limit order in a sell OCO must be above.”(-1166)。

剩得很少时另算。假设只剩 0.001 ETH,按 2,300 算约 2.3 USDT,低于交易对的最小下单金额(ETH/USDT 这里按 5 USDT 举例,以该交易对的交易规则为准),新 OCO 挂不上;撤掉之后,它就成了单独卖不掉的零头,去路见卖出后还剩一点币卖不掉。这种情况下,留着原来那张限价单别撤,反而少一步麻烦。

反过来:止损先触发,止盈那一边先被撤

价格先跌到止损触发价时,顺序反过来。更新日志写的是:先撤掉限价那一边,再执行止损单。示例里 2,290 的止损限价单被挂出后,如果价格直接跌穿、2,290 没人接,你手上剩下的是一张没成交的止损限价卖单,止盈单早就不在了。这和单独用止损限价单时碰到的是同一个问题,见止损触发了,为什么币还没有卖掉。

如果你要的是“触发后一定卖掉”,止损那一边可以用不带限价的止损单(接口里的 STOP_LOSS,触发后按市价成交),代价是成交价不受你控制,深度薄时可能离触发价很远,见市价下单前怎么判断可见深度够不够。

手动撤掉一边,整张 OCO 都撤

更新日志同样写明:撤掉任意一边,等于撤掉整张 OCO。所以“只撤止盈、留着止损”做不到,撤完两边都没了,0.5 ETH 全部回到可用余额。只想留一张止损,就整张撤掉后,单独挂一张止损限价单。

以上执行顺序和价格规则出自币安在 GitHub 上公开的现货接口文档(更新日志、REST 接口说明中 OCO 一节、错误代码)。网页和 App 里按钮、状态的中文叫法,以你屏幕上显示的为准。

接着读