Kraken WebSocket API入门:实时数据与交易

时间: 分类:编程 阅读:99

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 。数值越大,提供的订单簿信息越详细,但同时也会增加数据传输量。

订阅数据类型

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 循环中,脚本持续监听来自服务器的消息,并将其打印到控制台。异常处理机制用于捕获连接关闭或其他潜在错误,以确保程序的健壮性。

相关推荐: