Kraken WebSocket API 入门指南
简介
Kraken 提供强大的 WebSocket API,为用户提供实时数据订阅、账户管理和交易执行能力。相较于传统的 REST API,WebSocket API 具备显著优势,尤其体现在低延迟和高效率的数据传输方面。这种高效性使得 WebSocket 成为对市场变化响应速度有极高要求的应用场景的理想选择,例如:
- 高频交易机器人: WebSocket 提供的实时市场数据流能使交易机器人快速捕捉市场机会,并以极低的延迟执行交易指令。
- 实时行情监控系统: 金融数据提供商和交易平台可利用 WebSocket API 向用户推送实时价格、交易量和订单簿更新等关键信息,保证数据的及时性和准确性。
- 自动化交易策略: 交易者可以利用 WebSocket API 构建复杂的自动化交易策略,根据预设的条件自动执行买卖操作,提高交易效率。
- 个性化交易界面: 开发者可基于 WebSocket API 构建个性化的交易界面,为用户提供定制化的数据展示和交易工具,提升用户体验。
Kraken 的 WebSocket API 提供了多种订阅频道,涵盖了广泛的市场数据和账户信息。这些频道包括:
- 市场数据频道: 提供实时交易行情、订单簿深度、成交历史等信息。
- 账户数据频道: 允许用户监控账户余额、订单状态和交易历史。
- 订单管理频道: 提供创建、修改和取消订单的功能。
Kraken WebSocket API 采用 JSON 格式进行数据传输,易于解析和处理。API 采用身份验证机制,确保用户账户和数据的安全。详细的 API 文档和示例代码可帮助开发者快速上手并构建自己的应用。本文旨在介绍 Kraken WebSocket API 的基本概念和使用方法,为开发者提供一个入门指南。
连接到 Kraken WebSocket API
Kraken WebSocket API 提供了实时访问市场数据的途径。生产环境的接入点为
wss://ws.kraken.com
,测试环境(用于实验和开发)的接入点为
wss://beta-ws.kraken.com
。为了确保稳定可靠的连接,建议使用支持 WebSocket 协议(RFC 6455)的客户端库。流行的选择包括:
-
Python:
websockets
,asyncio
(结合websockets
使用) -
JavaScript:
ws
,socket.io
(尽管socket.io
并非纯 WebSocket 实现,但也可以使用) -
Go:
gorilla/websocket
-
Java:
Tyrus
,Jetty WebSocket Client
成功建立 WebSocket 连接后,必须发送一个格式正确的 JSON 消息来订阅所需的数据流。订阅消息遵循以下结构:
{
"event": "subscribe",
"pair": ["XBT/USD", "ETH/USD"],
"subscription": {
"name": "ticker"
}
}
上述 JSON 结构包含以下关键字段:
-
event:
核心字段,定义操作类型。设置为
"subscribe"
表示请求订阅特定数据流。其他可能的事件包括"unsubscribe"
。 -
pair:
一个字符串数组,指定需要订阅的交易对。每个交易对代表一种资产相对于另一种资产的价格。例如,
"XBT/USD"
表示比特币 (XBT) 对美元 (USD) 的交易对,而"ETH/USD"
表示以太坊 (ETH) 对美元 (USD) 的交易对。可以同时订阅多个交易对,以接收多个市场的实时数据。 -
subscription:
一个对象,包含更详细的订阅配置选项。
-
name:
指定订阅的数据类型。不同的数据类型对应不同的市场信息:
-
"ticker"
: 提供高层级的市场行情数据,例如当前成交价、最高价、最低价、成交量等。这是最常用的订阅类型之一,适用于快速了解市场概况。 -
"trade"
: 提供实时成交数据,包括成交价格、成交数量和成交时间。 适用于追踪市场微观交易活动。 -
"book"
: 提供订单簿数据,包括买单和卖单的价格和数量。可以进一步指定订单簿的深度,例如"book-10"
表示订阅深度为 10 的订单簿。不同的深度级别提供不同精度的订单簿信息。 -
"ohlc"
: 提供开盘价、最高价、最低价和收盘价 (OHLC) 数据,可以指定时间周期,例如 "ohlc-1m"(1 分钟 OHLC 数据)或 "ohlc-1h"(1 小时 OHLC 数据)。 -
"spread"
: 提供买卖价差数据。
-
-
interval:
(可选) 仅适用于
"ohlc"
数据类型,指定时间间隔,例如1
(分钟),5
(分钟),15
(分钟),30
(分钟),60
(小时),240
(小时),1440
(天),10080
(周),21600
(POSIX 月)。 -
depth:
(可选) 仅适用于
"book"
数据类型,指定订单簿深度。可选项包括10
,25
,100
,500
,1000
。数值越大,提供的订单簿信息越详细,但同时也会增加数据传输量。
-
name:
指定订阅的数据类型。不同的数据类型对应不同的市场信息:
订阅数据类型
Kraken WebSocket API 允许用户订阅多种实时数据流,从而获得市场动态和账户信息的即时更新。以下是一些常用的数据类型,每种数据类型都提供了不同层面的信息,满足不同交易策略的需求:
- ticker :提供指定交易对的实时价格快照,包含最高价、最低价、成交量、成交笔数、当前买一价、卖一价等关键指标。适用于高频交易和短线交易者,可以迅速捕捉市场波动。
- ohlc :代表开盘价 (Open)、最高价 (High)、最低价 (Low) 和收盘价 (Close) 的蜡烛图数据,以及成交量 (Volume)。通过指定时间间隔,可以获取不同时间周期的价格变化趋势,是技术分析的重要工具。例如,可以订阅1分钟、5分钟、1小时等不同时间周期的OHLC数据。
- trade :提供指定交易对的实时成交信息,包括成交价格、成交量、成交时间和买卖方向。适用于观察市场微观结构,了解成交细节。
- spread :提供指定交易对的买一价和卖一价信息,以及对应的深度(即买入和卖出量)。适用于做市商和套利交易者,可以监控市场流动性。
- book :提供指定交易对的订单簿快照,包括买单和卖单的价格和数量。订单簿深度可以指定,例如可以选择提供前10个或前100个价格级别的订单。适用于高频交易和算法交易,可以根据订单簿的变化调整交易策略。
- ownTrades :提供用户自身账户的成交记录,包括成交价格、成交量、成交时间、交易对、手续费等信息。需要进行身份验证才能订阅。
- openOrders :提供用户自身账户的当前挂单信息,包括挂单价格、挂单数量、挂单类型、交易对等信息。需要进行身份验证才能订阅。
通过灵活订阅这些数据类型,开发者可以构建各种交易应用和数据分析工具,满足不同的需求。
Ticker
“Ticker”提供实时加密货币交易对的行情数据快照,包含关键市场指标,帮助用户快速了解市场动态。它提供以下详细信息:
-
a:
卖出最优价数组:
[price, wholeLotVolume, lotVolume]
。price
代表当前最优卖出价格,wholeLotVolume
指的是该价格下的总挂单量,lotVolume
指的是最小交易单位的挂单量。这组数据反映了市场的即时卖压情况。 -
b:
买入最优价数组:
[price, wholeLotVolume, lotVolume]
。price
代表当前最优买入价格,wholeLotVolume
指的是该价格下的总挂单量,lotVolume
指的是最小交易单位的挂单量。这组数据反映了市场的即时买盘支撑。 -
c:
最近成交价数组:
[price, lotVolume]
。price
代表最近一次成交的价格,lotVolume
代表成交量。通过跟踪最近成交价,可以了解市场最新的交易活动和价格趋势。 -
v:
最近 24 小时成交量数组:
[today, last24Hours]
。today
代表当日成交量,last24Hours
代表过去 24 小时的总成交量。成交量是衡量市场活跃度的重要指标。 -
p:
最近 24 小时成交均价数组:
[today, last24Hours]
。today
代表当日成交均价,last24Hours
代表过去 24 小时的成交均价。成交均价可以反映市场整体的价格水平。 -
t:
成交笔数数组:
[today, last24Hours]
。today
代表当日成交笔数,last24Hours
代表过去 24 小时的总成交笔数。成交笔数也反映了市场的活跃程度,高成交笔数通常伴随着较高的波动性。 -
l:
最近 24 小时最低价数组:
[today, last24Hours]
。today
代表当日最低价,last24Hours
代表过去 24 小时的最低价。 -
h:
最近 24 小时最高价数组:
[today, last24Hours]
。today
代表当日最高价,last24Hours
代表过去 24 小时的最高价。最高价和最低价提供了价格波动的范围。 - o: 今日开盘价。代表当日开盘时市场的价格,可以作为当日价格走势的参考基准。
示例数据:
[ 0, [ "a", [ "43000.00", "1", "1.000" ], [ "42999.00", "1", "1.000" ], [ "43000.00", "0.01" ], [ "100", "1000" ], [ "42000.00", "42500.00" ], [ "100", "1000" ], [ "41000.00", "43000.00" ], "42000.00", "XBT/USD" ] ]
Trade
"Trade" 数据流提供关于交易所发生的实际交易的实时信息,是对市场动态的直接反映。每个交易事件包含以下关键要素:
- Price (价格): 成交价格,即买方和卖方达成协议的价格。以指定货币单位表示,例如美元或比特币。
- Volume (成交量): 成交量,表示在此次交易中交换的资产数量。交易量是衡量市场流动性的重要指标。
- Time (时间): 成交时间,以 Unix 时间戳格式表示。Unix 时间戳是从协调世界时(UTC)1970 年 1 月 1 日 0 时 0 分 0 秒起经过的秒数。精确到毫秒级(毫秒),有助于进行高精度的时间序列分析。
- Buy/Sell (买/卖方向): 交易方向,指示该交易是买入(Buy)还是卖出(Sell)。"b" 代表买入,表示有人以市场价格购买资产;"s" 代表卖出,表示有人以市场价格出售资产。通过分析买卖方向的比例,可以了解市场情绪。
- Market/Limit (订单类型): 订单类型,指示该交易执行所使用的订单类型。"m" 代表市价单(Market Order),市价单以当前最佳可用价格立即执行;"l" 代表限价单(Limit Order),限价单只有在达到或超过指定价格时才会执行。订单类型反映了交易者的策略。
- Misc (其他信息): 其他信息,可能包含交易所特定的附加数据,例如交易手续费或特殊交易标识。如果无特殊信息,则为空字符串。
示例数据(JSON 格式):
[ 0, [ [ "43000.00", "0.001", "1678886400.000", "b", "m", "" ], [ "43001.00", "0.002", "1678886401.000", "s", "l", "" ] ], "trade", "XBT/USD" ]
数据解释:
在示例数据中,最外层数组的第一个元素通常是频道 ID (此处为 0,仅为占位符,实际应用中会有变化)。第二个元素是一个包含交易记录的数组。第三个元素 "trade" 表明这是一个交易数据流。第四个元素 "XBT/USD" 表示交易对,即比特币(XBT)与美元(USD)。内部的交易记录数组包含两个交易事件:
- 第一个交易事件: 价格为 43000.00,交易量为 0.001 个比特币,时间戳为 1678886400.000,是买入("b")市价单("m")。
- 第二个交易事件: 价格为 43001.00,交易量为 0.002 个比特币,时间戳为 1678886401.000,是卖出("s")限价单("l")。
重要提示: 实际应用中,需要注意交易所API文档,确保正确解析数据。时间戳精度,不同交易所可能有所不同,需要根据实际情况进行处理。
Book (订单簿)
"Book"频道提供指定交易对的实时订单簿数据快照,包含当前市场上所有未成交的买单( bids)和卖单(asks)的价格和数量。 订单簿是市场深度的关键指标,允许交易者评估特定价格水平的流动性,并据此制定交易策略。 Kraken交易所允许用户选择不同的深度级别 ("depth"),以此控制接收到的订单簿数据量,从而优化数据流量和处理性能。 可用的订阅选项包括 "book-10" (显示最佳的10个买单和卖单),"book-25" (显示最佳的25个),以及 "book-100" (显示最佳的100个)。深度数值越大,接收到的订单簿信息越完整,但数据量也越大。
订单簿数据更新包含一个时间戳,指示订单簿状态的最后更新时间。 理解订单簿的结构对于解析和利用这些数据至关重要。 订单簿的变化反映了市场上买卖力量的动态变化,是价格发现过程的核心。
订单簿数据结构详解:
订单簿数据通常以包含买单和卖单数组的JSON格式呈现。 每个买单或卖单条目都包含价格、数量和时间戳信息。 价格表示愿意购买或出售资产的价格,数量表示在该价格水平可供交易的资产单位数量,时间戳指示订单添加到订单簿的时间。
示例数据 (book-10):
以下是一个 "book-10" 频道的示例数据,展示了比特币/美元 (XBT/USD) 交易对的订单簿信息。请注意,实际数据会随市场变化而实时更新。
[
0,
{
"as": [
[
"43000.00",
"1.000",
"1678886400.000"
],
[
"43001.00",
"0.500",
"1678886401.000"
]
],
"bs": [
[
"42999.00",
"1.500",
"1678886402.000"
],
[
"42998.00",
"0.750",
"1678886403.000"
]
]
},
"book-10",
"XBT/USD"
]
数据解释:
-
0
: 频道 ID (用于消息路由)。 -
as
: 卖单 (asks) 数组,按价格升序排列。 -
"43000.00"
: 卖单价格。 -
"1.000"
: 在该价格上的可用数量。 -
"1678886400.000"
: 时间戳 (Unix 时间戳,毫秒)。 -
bs
: 买单 (bids) 数组,按价格降序排列。 -
"42999.00"
: 买单价格。 -
"1.500"
: 在该价格上的可用数量。 -
"1678886402.000"
: 时间戳 (Unix 时间戳,毫秒)。 -
"book-10"
: 订单簿深度级别。 -
"XBT/USD"
: 交易对。
订单簿数据的使用:
订单簿数据可用于各种目的,包括:
- 市场深度分析: 评估特定价格水平的买卖压力。
- 套利: 识别不同交易所之间的价格差异。
- 算法交易: 构建基于订单簿数据的自动化交易策略。
- 风险管理: 评估市场流动性和潜在的价格滑点。
私有订阅 (账户数据)
Kraken WebSocket API 不仅提供实时的市场数据,还允许用户订阅高度敏感的账户信息,例如可用余额、挂单状态、交易执行报告等。访问这些私有数据流需要身份验证。为此,用户必须首先通过 Kraken REST API 生成一个专门用于 WebSocket 连接的短期令牌。
获得有效令牌后,您需要通过 WebSocket 连接发送一个订阅消息,该消息包含您的令牌。此令牌用于验证您的身份并授权您访问请求的账户数据。
以下是一个示例订阅消息的结构:
{
"event": "subscribe",
"subscription": {
"name": "balance",
"token": "YOUR_WEBSOCKET_TOKEN"
}
}
在上述JSON结构中,
event
字段设置为 "subscribe",表示这是一个订阅请求。
subscription
对象包含订阅的具体信息,其中
name
字段指定要订阅的数据类型(例如 "balance"),而
token
字段则包含您通过 REST API 获取的 WebSocket 令牌。请务必将 "YOUR_WEBSOCKET_TOKEN" 替换为您的实际令牌。
通过私有订阅,您可以访问以下账户数据流:
- balance: 账户中各种加密货币和法币的实时余额信息,包括可用余额、总余额和已占用余额。这使您能够实时监控您的资金状况。
- ownTrades: 详细的交易记录,包括交易对、交易类型(买/卖)、成交价格、成交数量、手续费等信息。通过此数据流,您可以跟踪您的交易活动并进行盈亏分析。
- openOrders: 当前未成交的订单信息,包括订单ID、订单类型(限价单、市价单等)、订单状态(已挂单、部分成交等)、挂单价格、挂单数量等。 监控此数据流,您可以实时了解您的挂单情况并及时调整策略。
请注意,WebSocket 令牌具有时效性,过期后需要重新生成。建议定期刷新令牌,以确保您的订阅能够持续接收数据。 为了安全起见,请勿在客户端代码中硬编码令牌,并采取适当的安全措施来保护您的令牌免受未经授权的访问。
取消订阅
要停止接收特定加密货币交易对的数据更新,你需要向服务器发送一个取消订阅的请求。这个请求以JSON格式组织,包含明确的指令,告知服务器你希望停止接收哪个频道的数据。
以下是一个用于取消订阅的JSON消息示例,它指示服务器停止发送XBT/USD交易对的ticker数据:
{
"event": "unsubscribe",
"pair": ["XBT/USD"],
"subscription": {
"name": "ticker"
}
}
字段解释:
-
event
:这是一个字符串字段,其值为 "unsubscribe",明确指明这是一个取消订阅的请求。 -
pair
:这是一个字符串数组,包含了你想要取消订阅的交易对。在这个例子中,我们取消订阅的是XBT/USD,即比特币兑美元的交易对。可以包含多个交易对,一次性取消订阅多个数据源。 -
subscription
:这是一个对象,包含了订阅的详细信息。 -
name
:这是一个字符串字段,指定了要取消订阅的数据类型。在这个例子中,我们取消订阅的是 "ticker" 数据,它通常包含交易对的最新价格、交易量等信息。其他可能的值包括 "ohlc" (开盘价、最高价、最低价、收盘价) 以及 "depth" (市场深度) 等。
重要提示:
-
确保
pair
数组和subscription.name
的值与你之前订阅时使用的值完全一致,否则服务器可能无法正确识别你要取消订阅的内容。 - 服务器可能会返回确认消息,表明取消订阅操作已成功执行。
- 取消订阅后,你将不再收到指定交易对和数据类型的更新。
心跳机制
Kraken WebSocket API 通过周期性地发送心跳消息("heartbeat")来维持客户端与服务器之间的持续连接。这些心跳消息本质上是小的信号,表明连接仍然活跃且双方都在监听。如果客户端在设定的时间内没有收到心跳消息,这意味着连接可能已经中断或不稳定。为了确保数据流的连续性和可靠性,客户端应立即采取行动,例如主动关闭当前WebSocket连接并建立新的连接。重新连接WebSocket对于防止数据丢失和维护应用程序的响应性至关重要,特别是在交易或实时数据馈送等对延迟敏感的应用中。心跳机制是WebSocket协议中一种常见的实践,用于解决网络环境中可能出现的连接超时或中断问题。
错误处理
API交互过程中,错误处理至关重要。当发生错误时,API会立即发送一个 "error" 事件至客户端。该事件负载包含关键的错误信息,包括具体的错误代码和详细的错误描述,以便开发者快速定位问题。
以下是一个 "error" 事件的JSON格式示例:
{
"event": "error",
"errorCode": "1001",
"errorMessage": "无效的交易对 (Invalid pair)。请检查交易对名称是否正确,例如 BTC/USD。"
}
在上述示例中,
event
字段标识事件类型为"error",
errorCode
提供了一个唯一的错误代码,
errorMessage
字段则包含了对错误的详细描述,说明了交易对无效的原因。
errorCode
的存在使得程序可以针对不同类型的错误进行自动化处理。
开发者必须实现完善的错误处理机制,以便能够捕获并妥善处理这些错误事件。当接收到 "error" 事件时,应根据
errorCode
和
errorMessage
中的信息,采取适当的措施。例如,如果错误信息指示交易对无效,则应检查并更正交易对参数,然后尝试重新订阅。如果错误信息指示API密钥无效,则应更新API密钥并重新进行身份验证。 另外,记录错误日志也是一个良好的实践,有助于问题追踪和调试。 确保应用程序具有足够的容错能力,可以优雅地处理各种潜在的错误情况,避免程序崩溃,并为用户提供清晰的错误提示。
代码示例 (Python)
以下Python代码展示了如何利用
websockets
库建立与Kraken交易所WebSocket API的连接,并实时订阅比特币(XBT/USD)的交易行情数据。 该脚本旨在提供一个基础框架,以便开发者能够构建更复杂的应用程序,例如实时数据分析、自动化交易机器人等。
import asyncio
import websockets
import
async def kraken_websocket():
uri = "wss://ws.kraken.com"
async with websockets.connect(uri) as websocket:
subscribe_message = {
"event": "subscribe",
"pair": ["XBT/USD"],
"subscription": {
"name": "ticker"
}
}
await websocket.send(.dumps(subscribe_message))
while True:
try:
message = await websocket.recv()
print(f"Received: {message}")
except websockets.exceptions.ConnectionClosed as e:
print(f"Connection closed: {e}")
break
except Exception as e:
print(f"Error: {e}")
break
if __name__ == "__main__":
asyncio.run(kraken_websocket())
该代码段使用
asyncio
库进行异步编程,这对于处理实时数据流至关重要。它定义了Kraken WebSocket API的统一资源标识符(URI)。然后,它通过
websockets.connect()
函数建立连接,并发送一个JSON格式的订阅消息,指定要订阅XBT/USD的ticker数据。ticker数据包括但不限于:最新成交价、成交量、最高价、最低价等信息。
.dumps()
函数用于将Python字典转换为JSON字符串,以便通过WebSocket发送。在
while True
循环中,脚本持续监听来自服务器的消息,并将其打印到控制台。异常处理机制用于捕获连接关闭或其他潜在错误,以确保程序的健壮性。