跳到主要内容

订阅 / 取消订阅报价数据流

WSProductionwss://ws.btse.com/ws/otcTestnetwss://testws.btse.io/ws/otc

订阅连续 OTC 价格报价。价格会随市场变动推送。 需要 WebSocket 身份验证。

接受报价,请使用数据流中的 buyQuoteIdsellQuoteId 调用接受报价 REST 接口。

REST 与 WebSocket — 何时使用哪个:

  • REST POST /public-api/otc/v1/quotes — 请求一次性报价,TTL 为 5 秒。 这是标准的 RFQ(询价)工作流。
  • WebSocket quote 数据流(本 channel) — 为高频消费者订阅持续报价流, 与 REST RFQ 独立。

订阅 payload 与现货/期货不同。 OTC 使用 op: quote 加顶层 symbol (以及可选的 sidequantity);使用现货/期货的 {op: "subscribe", args: [...]} 形式。 若误用现货/期货格式,服务器会以 {event: "subscribe", channel: []} 静默确认,但不会推送任何数据。

// ✅ OTC 订阅
{ "op": "quote", "symbol": "BTC-USD", "quantity": { "quantity": 1, "currency": "BTC" } }

// ❌ 现货/期货格式 — OTC 不接受
{ "op": "subscribe", "args": ["quote"] }

操作类型:

  • quote:订阅报价数据流
  • unsubscribe-quote:取消订阅指定报价数据流
  • unsubscribe-quote-all:取消订阅所有报价数据流

请求参数

名称类型是否必填描述
opString订阅操作
symbolString市场交易对(来自 getMarket)
sideStringbuy · sell(区分大小写)。省略时返回双向报价
clOrderIdString自定义客户端订单 ID
quantityObject

响应内容

名称类型是否必填描述
topicString固定为 quote
buyQuoteIdString买方报价 ID。未订阅买方或未认证时为 null
sellQuoteIdString卖方报价 ID。未订阅卖方或未认证时为 null
clOrderIdString客户端订单 ID
buyQuantityDouble买入数量。未订阅买方时为 null
buyUnitPriceDouble买入单价。未订阅买方时为 null
buyTotalAmountDouble买入总金额。未订阅买方时为 null
sellQuantityDouble卖出数量。未订阅卖方时为 null
sellUnitPriceDouble卖出单价。未订阅卖方时为 null
sellTotalAmountDouble卖出总金额。未订阅卖方时为 null
statusString响应状态(正常更新时为 null
reasonString错误原因(如有)
example

Request

{
"op": "quote",
"symbol": "BTC-USD",
"side": "buy",
"clOrderId": "ClientOrder1",
"quantity": {
"quantity": 1,
"currency": "BTC"
}
}

Request

{
"op": "unsubscribe-quote",
"symbol": "BTC-USD",
"clOrderId": "ClientOrder1",
"quantity": {
"quantity": 1,
"currency": "BTC"
}
}

Request

{
"op": "unsubscribe-quote-all"
}

Response

{
"topic": "quote",
"buyQuoteId": "015f05ba-1d55-46d7-94d9-214229414ae7",
"sellQuoteId": "0683a41a-a2ad-467b-99b3-241f3ab0cec4",
"clOrderId": null,
"buyQuantity": 10,
"buyUnitPrice": 47865.580838,
"buyTotalAmount": 478655.80838,
"sellQuantity": 10,
"sellUnitPrice": 47649.40351972,
"sellTotalAmount": 476494.0352,
"status": null,
"reason": null
}