
图片资料:官方来源
在Kraken现货账户的订单记录中,closed、canceled、expired都是订单的结束状态,但它们回答的是“这张订单以什么方式离开挂单簿”,并不直接等于“有没有成交”。尤其是部分成交之后再被取消或到期,状态字段仍然显示canceled或expired,已成交部分却已经进入成交历史。判断这类订单,需要把status、vol、vol_exec和trades分开看。
三个状态是并列的枚举值
按Kraken现货REST API QueryOrders接口的返回结构,订单对象中的status是一个枚举字段,常见取值包括open、closed、canceled、expired。这里不存在“closed是总状态、把canceled和expired包在里面”的层级关系。
closed通常对应订单以成交方式结束。官方示例里,一张完全成交的订单显示status: "closed",vol_exec与vol相等,trades中列出成交ID。但核对时仍应以vol_exec为准,不能仅凭状态字面推断成交比例。
canceled表示订单被撤销,剩余未成交的委托量不再挂在订单簿上。撤销可能由用户发起,也可能来自系统侧动作;status本身不区分这两类来源。
expired表示订单到期失效。下单时若设置了有效期,到期后未成交的剩余部分由系统关闭,状态记为expired。它和主动取消是两种不同的结束原因。
部分成交后取消,成交不会被回滚
这是最容易误判的地方。假设一张买单委托量为1.25个XBT,vol_exec显示0.50,status为canceled。正确的读法是:0.50个XBT已经撮合成交,剩余0.75个XBT的挂单被撤销。cost和fee按已成交部分计算,成交记录保留在账户的成交历史里。
撤销动作作用于“还没成交的剩余委托”,不会把已经匹配的成交反向冲销。因此看到canceled就认为“这单完全没发生”,在部分成交场景下是错的。expired同理:到期关闭的是剩余挂单,到期前已成交的部分照常结算。
反过来也要注意,不能因为status是closed就默认全部成交。判断成交数量应直接比较vol和vol_exec:两者相等为全部成交;vol_exec大于零且小于vol为部分成交;vol_exec为零为未成交。
trades数组要看请求参数
QueryOrders请求体中有一个trades参数。把它设为true时,返回的订单对象才会附带成交ID数组;默认或设为false时,该数组可能为空或不返回。所以“trades为空”不能直接当成“没有成交”的证据,更稳妥的做法是先看vol_exec,需要逐笔核对时再以trades: true重新查询,或到成交历史接口比对。
具体核对顺序
遇到一张状态为canceled或expired的订单,可以按下面几步读数据:
- 看
status,确认结束方式是成交关闭、撤销还是到期。 - 看
vol与vol_exec,算出实际成交比例。 - 看
reason,官方示例中完全成交订单的reason为null,取消或到期订单可能带原因说明,可作辅助。 - 需要逐笔证据时,确认请求开启了
trades,再拿成交ID与成交历史交叉核对。
假设一张卖单vol为2.00、vol_exec为0.80、status为expired,那么应记为已卖出0.80、剩余1.20因到期撤下;账务和成交量统计应以0.80为准,而不是把整张订单记为零成交或全部成交。
做账和统计时的口径
status回答“订单怎么结束”,vol_exec回答“实际成交多少”,两者分工不同。统计交易量、计算手续费或对账时,应以vol_exec和成交记录为准,不要用status是否等于closed来筛选成交。canceled和expired都只说明剩余委托失效,已成交部分照常有效——这是读Kraken订单字段时最需要守住的一条线。不同API版本或账户类型下字段细节可能略有差异,具体以实际调用返回为准。