
图片资料:官方来源
在Kraken现货WebSocket v2的AddOrder请求中,stp_type决定自成交保护触发时取消哪一笔订单。默认值cancel_newest取消刚刚到达撮合引擎的订单;cancel_oldest取消已经挂在订单簿上的旧订单;cancel_both则把到达单和挂单一起取消。看到“STP取消”就以为账户里所有挂单被清掉,是常见误解:它只处理本次可能形成自成交的那一对订单,不是全账户撤单,也不是止损指令。
自成交保护(Self Trade Prevention)针对的是同一用户用买单成交自己的卖单,或反过来的情形。这个开关的作用是防止用户无意中或刻意地与自己成交。它不禁止两位不同客户之间的正常交易,也不改变撮合价格口径。把它理解成“禁止所有对手方交易”或“风控强制平仓”,排障方向就会跑偏。
三种策略的差别可以用一个假设例子说明。假设某账户在订单簿上已有一笔卖出挂单,随后又通过WebSocket提交一笔价格可成交的买单。若stp_type为cancel_newest,被取消的是后来提交的买单,原卖单继续留在簿上;若为cancel_oldest,被取消的是原先的卖单,新买单继续处理;若为cancel_both,两笔都不再保留。这里的“新”与“旧”以到达撮合引擎的先后为准,而不是客户端点击时间或本地记录时间。网络延迟、重试和批量提交都可能让客户端感知的顺序与撮合顺序不一致,排障时应以订单回报中的状态和取消原因为准。
需要补充的是,“旧单保留”或“新单继续”只是就本次自成交防护策略而言。保留下来的订单仍可能与其他订单成交,也可能被其他规则拒绝或取消,不能被理解为该订单此后一定有效。
cancel_newest作为默认值,只表示AddOrder参数未显式传入时的取值,并不意味着平台对所有账户默认开启更严格的保护。若请求中省略stp_type,到达单触发自成交保护时按默认策略被取消;若显式指定cancel_oldest或cancel_both,行为随之改变。这个参数属于下单请求级别,不是账户级全局设置,也不会追溯修改此前已存在的挂单。取消动作发生时,相关订单是否已有部分成交,要看订单回报中的实际状态,不能仅凭“被STP取消”推定该订单从未成交。
机构账户还有一层资格差异。sender_sub_id用于增强型自成交保护,让STP在更细的子账户或交易员标识层面执行,支持长UUID、短UUID和最长18字符的自由文本格式。该参数面向具备增强STP资格的机构账户,在现货WebSocket v2的AddOrder中并非所有用户都能选择或生效的通用选项。普通账户不应把它当作必填字段,也不应假设填入后就能获得跨子账户的全局撤单效果。
本文讨论限于Kraken现货WebSocket v2的AddOrder接口,不涉及衍生品、保证金或其他订单类型;该接口参数与UI层面的可选设置也不等同。UI里能看到或选择的选项,不构成该接口对所有账户开放同一组参数的依据。
读者排障时可以按以下顺序判断:先确认取消回报指向的是到达单还是挂单;再核对请求中是否显式传入了stp_type;然后检查是否存在同一账户相反方向的未成交挂单;最后确认账户是否属于可使用sender_sub_id的机构增强STP范围。若取消的是新单而旧挂单仍在,通常就是默认cancel_newest在起作用,而不是账户被整体限制。理解这一点,才能把“订单被STP取消”与“挂单被全部撤销”“止损触发”“普通客户之间不能交易”区分开。