Kraken交易API深度指南:密钥管理与安全交易实践
Kraken 交易 API 使用指南
Kraken 交易 API 提供了一套强大的工具,允许开发者以编程方式访问 Kraken 交易平台,进行交易、获取市场数据以及管理账户。 本指南将深入探讨 Kraken 交易 API 的各个方面,帮助你快速上手并构建自己的自动化交易策略或集成应用程序。
API 认证与密钥管理
在使用 Kraken API 之前,必须拥有一个有效的 Kraken 账户,并生成专用的 API 密钥对。每个 API 密钥对包含一个公钥(API Key)和一个私钥(API Secret)。 公钥作为账户的唯一标识符,用于在 API 请求中声明请求的来源账户。 私钥则用于对 API 请求进行数字签名,验证请求的真实性和完整性,防止恶意篡改,保障交易安全。
- 创建 API 密钥: 登录您的 Kraken 账户。 导航至 "安全" 菜单,然后选择 "API" 选项,进入 API 密钥管理页面。 点击 "生成新密钥" 按钮,开始创建新的 API 密钥对。 在创建过程中,您需要详细配置密钥的权限。 Kraken 提供了精细化的权限控制机制,您可以根据应用程序的具体需求,设置密钥可以访问的功能模块,例如交易、查询余额、提款等。务必根据最小权限原则,只授予密钥执行任务所需的最低权限集,降低潜在的安全风险,避免不必要的损失。
- 存储密钥: 在 API 密钥生成后,系统会立即显示私钥。 **请务必立即将私钥安全地存储在本地环境中,例如使用加密的密钥管理工具或硬件安全模块 (HSM)。** 私钥只会显示一次,并且无法恢复。 如果私钥丢失,您将需要重新生成新的 API 密钥对。 永远不要将私钥以明文形式存储在代码库、配置文件或任何公共可访问的位置。 避免通过电子邮件、即时通讯工具或任何不安全的渠道传输私钥。
- API 密钥权限: 深入理解 Kraken API 提供的各种权限至关重要,这将直接影响您的应用程序的安全性和功能。 例如,“交易” 权限允许您的应用程序执行下单、修改订单和取消订单等交易操作。 “查询余额” 权限允许您的应用程序获取账户的可用余额、持仓信息和交易历史记录。 “提款” 权限允许您的应用程序发起提款请求,将资金从 Kraken 账户转移到指定的外部地址。 请谨慎评估每种权限的潜在风险,并仅授予应用程序所需的最低权限。 Kraken 还提供了一些高级权限,例如访问杠杆交易功能或订阅实时市场数据。 在授予这些高级权限之前,请确保您充分了解其含义和潜在影响。 定期审查和更新 API 密钥的权限也是一项重要的安全措施,以确保密钥始终符合应用程序的当前需求,并防止未经授权的访问。
API 调用基础
Kraken API 的交互核心基于安全的 HTTPS 请求。为了保障账户安全和数据完整性,所有涉及用户资产或个人信息的请求,都需要进行严格的身份验证,并附加根据请求内容生成的数字签名。
-
API 端点:
Kraken API 按照功能和权限划分为多个端点,每个端点负责处理特定的请求类型。 具体如下:
- 公共端点: 此类端点提供实时的市场数据访问,包括但不限于最新的交易价格、成交量、订单簿深度、以及历史交易数据。访问公共端点无需任何形式的身份验证,任何人都可以直接调用。
- 私有端点: 私有端点用于执行用户的个性化操作,例如创建新的交易订单、查询账户余额、管理资金划转、以及获取交易历史记录等。 为了确保只有授权用户才能执行这些操作,访问私有端点必须提供有效的身份验证信息。
-
请求方法:
根据操作的安全级别和数据传输需求,Kraken API 对不同类型的端点采用不同的 HTTP 请求方法。
-
POST
方法: 用于调用需要身份验证的私有端点。POST
方法允许在请求体中包含敏感数据,并能更好地支持复杂参数的传递。 -
GET
方法: 用于调用公开的公共端点。GET
方法将参数附加在 URL 中,适用于获取无需身份验证的只读数据。
-
-
请求头:
请求头包含了 API 调用的关键元数据,用于身份验证和请求路由。
-
API-Key
头: 必须包含您的 API 公钥。API 公钥用于标识您的账户,并作为生成数字签名的基础。 -
API-Sign
头: 必须包含根据请求参数和您的 API 私钥生成的数字签名。 该签名用于验证请求的完整性和真实性,防止请求被篡改或伪造。
-
-
请求体:
POST
请求的请求体承载着请求的具体参数。-
application/x-www-form-urlencoded
格式: 请求体的数据必须采用application/x-www-form-urlencoded
格式进行编码。 该格式将参数名和参数值进行 URL 编码,并以name=value
的形式组合,多个参数之间用&
符号分隔。 这种格式被广泛支持,并且易于解析。
-
生成 API 签名
生成 API 签名对于保障 API 请求的安全性至关重要。Kraken 交易所采用 HMAC-SHA512 算法来创建数字签名,以此验证请求的来源和完整性,防止未经授权的访问和数据篡改。
-
步骤 1: 构建签名字符串:
需要将 API 请求的相对路径(例如
/0/private/Balance
,指示请求访问账户余额信息)与经过 URL 编码的请求参数字符串连接起来。 参数字符串应包含所有请求参数,并按照字母顺序排列。 - 步骤 2: 计算 SHA256 哈希: 使用 SHA256 安全散列算法,对请求参数字符串计算哈希值。 SHA256 是一种单向加密函数,能够将任意长度的数据转换为固定长度的哈希值,常用于数据完整性校验。
- 步骤 3: 使用私钥进行 HMAC-SHA512 加密: 使用你的 Kraken API 私钥作为密钥,对步骤 2 中计算得到的 SHA256 哈希值进行 HMAC-SHA512 加密。 HMAC (Hash-based Message Authentication Code) 是一种消息认证码算法,结合了密钥和哈希函数,提供更强的安全性。 SHA512 是 SHA-2 系列中的一种哈希算法,产生 512 位的哈希值。
- 步骤 4: 对 HMAC-SHA512 结果进行 Base64 编码: 将 HMAC-SHA512 加密的结果进行 Base64 编码。 Base64 是一种常用的编码方式,将二进制数据转换为 ASCII 字符串,便于在网络上传输和存储。最终得到的 Base64 编码字符串即为 API 签名。
可以使用各种编程语言提供的加密库来实现签名过程。正确的签名生成依赖于精确的步骤执行和数据格式。例如,以下 Python 代码演示了如何使用
hashlib
、
hmac
和
base64
库生成 API 签名:
import hashlib
import hmac
import base64
api_secret = "YOUR_API_SECRET".encode() # 替换为你的 API 私钥
api_path = "/0/private/Balance".encode() # API 请求路径
post_data = "nonce=1678886400".encode() # 请求参数,nonce 是一个时间戳,用于防止重放攻击
sha256_hash = hashlib.sha256(post_data).digest() # 计算请求参数的 SHA256 哈希值
hmac_digest = hmac.new(api_secret, api_path + sha256_hash, hashlib.sha512).digest() # 使用私钥对哈希值进行 HMAC-SHA512 加密
api_sign = base64.b64encode(hmac_digest).decode() # 对加密结果进行 Base64 编码
print(api_sign) # 打印生成的 API 签名
重要提示: 请务必保管好您的 API 私钥,切勿泄露给他人。 私钥泄露可能导致您的账户被盗用。
Nonce (随机数): 在 API 请求中包含一个唯一的 nonce 值非常重要。 Nonce 通常是一个时间戳或一个递增的数字,用于防止重放攻击。 每次发送 API 请求时,都应生成一个新的 nonce 值。
时间戳同步: 为了确保 API 请求的有效性,请确保您的系统时钟与 Kraken 服务器的时间同步。 时间偏差过大可能导致签名验证失败。
常用 API 端点
以下是一些常用的 Kraken API 端点,用于访问市场数据、管理账户和执行交易:
-
公共数据 API:
用于获取实时的市场数据,无需身份验证。
-
/public/Ticker
: 获取指定交易对的最新行情信息,包括最高价、最低价、成交量等。 示例:获取 BTC/USD 交易对的行情。 -
/public/OHLC
: 获取指定交易对的K线数据(Open, High, Low, Close)。可以指定时间周期,如1分钟、5分钟、1小时等。 示例:获取 ETH/EUR 交易对的 5 分钟 K 线数据。 -
/public/Depth
: 获取指定交易对的订单簿深度信息,包括买单和卖单的价格和数量。 示例:获取 ADA/USD 交易对的订单簿。 -
/public/Trades
: 获取指定交易对的最新成交记录。 示例:获取 DOT/USD 交易对的最新成交记录。 -
/public/Assets
: 获取 Kraken 上所有可用资产的信息,例如资产名称、精度等。 示例:查询所有可用资产的信息。 -
/public/AssetPairs
: 获取 Kraken 上所有可用交易对的信息,例如交易对名称、精度等。 示例:查询所有可用交易对的信息。 -
/public/Time
: 获取 Kraken 服务器的当前时间。用于同步客户端时间。
-
-
私有数据 API:
用于管理账户和执行交易,需要身份验证,通常使用 API 密钥和签名进行身份验证。
-
/private/Balance
: 获取账户的资金余额信息。 -
/private/TradeBalance
: 获取账户的交易余额信息,例如挂单占用资金等。 -
/private/OpenOrders
: 获取账户当前未成交的订单信息。 -
/private/ClosedOrders
: 获取账户已成交的订单信息。 -
/private/AddOrder
: 创建新的订单,可以指定交易对、订单类型(市价单、限价单等)、价格和数量。 -
/private/CancelOrder
: 取消指定的订单。 -
/private/DepositAddresses
: 获取充值地址,用于将加密货币充值到 Kraken 账户。需要指定资产类型。 -
/private/Withdraw
: 发起提现请求,将加密货币从 Kraken 账户提现到外部地址。需要指定资产类型、目标地址和数量。 -
/private/QueryLedgers
: 查询账户的账本记录,例如充值、提现、交易等。
-
公共端点:
-
GET /0/public/Ticker
: 获取指定交易对的实时行情快照,包括但不限于:最新成交价格、最高价、最低价、成交量、成交额、以及时间加权平均价 (VWAP)。此接口适用于快速查询市场价格,监控价格变动。 -
GET /0/public/Depth
: 获取指定交易对的订单簿深度信息,即买单和卖单的挂单价格及数量分布。订单簿深度通常分为多个层级,可以指定返回的层级数量。利用订单簿数据,可以分析市场买卖力量对比,判断支撑位和阻力位。 -
GET /0/public/Trades
: 获取指定交易对的最近成交历史记录。每条成交记录包含成交时间、成交价格、成交数量、以及买卖方向等信息。该接口可以用于追踪市场交易活动,分析成交价格分布。 -
GET /0/public/OHLC
: 获取指定交易对的 Open (开盘价)、High (最高价)、Low (最低价)、Close (收盘价) 的 K 线数据。可以指定K线的时间周期,例如:1分钟、5分钟、1小时、1天等。K线数据是技术分析的基础,可用于识别价格趋势、形态,以及计算各种技术指标。
私有端点:
-
账户信息类接口:
-
POST /0/private/Balance
: 获取账户余额信息。此接口提供用户账户中各种加密货币和法币的可用余额、总余额以及挂单冻结金额等详细信息。返回数据包括不同资产的余额,有助于用户了解其整体资产状况。 -
POST /0/private/TradeBalance
: 获取交易余额信息。用于查询特定交易对的可用余额、已用余额和总余额。返回数据通常包含交易保证金、未结算盈亏等信息,方便用户进行风险管理。
-
-
订单管理类接口:
-
POST /0/private/AddOrder
: 下单。允许用户提交新的买入或卖出订单,包括市价单、限价单等多种订单类型。请求参数包括交易对、订单类型、价格、数量等。成功下单后,服务器会返回订单ID。 -
POST /0/private/CancelOrder
: 取消订单。通过订单ID取消尚未成交的订单。用户可以通过此接口及时调整交易策略,避免不必要的损失。 -
POST /0/private/OpenOrders
: 获取当前未成交订单列表。返回用户所有未成交的订单信息,包括订单ID、交易对、订单类型、价格、数量、下单时间等。 -
POST /0/private/ClosedOrders
: 获取已成交订单列表。返回用户已成交的订单信息,包括成交价格、成交数量、手续费等。可以通过时间范围筛选已成交订单。 -
POST /0/private/QueryOrders
: 查询指定订单的详细信息。根据提供的订单ID,返回该订单的详细状态信息,包括订单类型、价格、数量、成交情况、手续费等。
-
下单参数详解
AddOrder
端点用于在加密货币交易所提交交易订单。正确配置订单参数对于成功执行交易至关重要。以下详细说明了常用的下单参数,并提供相关解释和使用注意事项:
-
pair
: 交易对。指定要交易的加密货币对,例如XBTUSD
(比特币/美元)、ETHUSD
(以太坊/美元)或LTCBTC
(莱特币/比特币)。交易对的选择决定了交易的基础资产和计价资产。务必仔细检查交易对代码的准确性。 -
type
: 订单类型。指示交易的方向,可以是buy
(买入)或sell
(卖出)。买入订单用于在市场上购买指定数量的加密货币,而卖出订单用于出售持有的加密货币。 -
ordertype
: 订单子类型。定义订单的执行方式和触发条件。常见的订单子类型包括:-
market
: 市价单。以当前市场最优价格立即执行。通常用于快速成交,但成交价格可能略有波动。 -
limit
: 限价单。只有当市场价格达到或超过指定价格时才执行。允许交易者以期望的价格买入或卖出,但不能保证立即成交。 -
stop-loss
: 止损单。当市场价格达到预设的止损价格时,订单自动以市价单的形式执行。用于限制潜在亏损。 -
take-profit
: 止盈单。当市场价格达到预设的止盈价格时,订单自动以市价单的形式执行。用于锁定利润。 -
stop-loss-limit
: 止损限价单。当市场价格达到预设的止损价格时,订单变为限价单,只有当市场价格达到或超过指定的限价时才执行。 -
take-profit-limit
: 止盈限价单。当市场价格达到预设的止盈价格时,订单变为限价单,只有当市场价格达到或超过指定的限价时才执行。 -
trailing-stop
: 追踪止损单。止损价格会随着市场价格的上涨而自动调整,保持一定的距离。 -
trailing-stop-limit
: 追踪止损限价单。止损价格会随着市场价格的上涨而自动调整,保持一定的距离,并在触发后作为限价单执行。 -
stop-loss-and-limit
: 止损和限价单。同时设置止损价格和限价,当市场价格达到止损价格时,订单将以限价单的形式挂出。 -
settle-position
: 平仓订单。用于平掉当前持有的仓位。
-
-
price
: 订单价格。仅适用于限价单和带限价的止损/止盈单。指定希望买入或卖出的价格。设置合理的价格对于确保订单成交至关重要。 -
volume
: 订单数量。指定要交易的加密货币数量。数量的单位通常是交易对中基础货币的单位。 -
leverage
: 杠杆倍数。可选参数,允许交易者使用杠杆来放大交易头寸。例如,如果杠杆倍数为 10,则交易者只需投入实际价值的 1/10 即可进行交易。杠杆可以放大收益,但也可能放大损失。谨慎使用杠杆。 -
starttm
: 订单生效时间。可选参数,允许交易者指定订单生效的起始时间。订单将在指定时间之后才会提交到市场。 -
expiretm
: 订单过期时间。可选参数,允许交易者指定订单的有效期限。如果订单在指定时间之前未成交,则会自动取消。
错误处理
Kraken API 采用标准 HTTP 状态码与 JSON 格式的错误信息相结合的方式,清晰地指示请求处理过程中出现的各种错误。这种双重机制为开发者提供了多维度的错误诊断信息。
-
HTTP 状态码:
服务器返回的 HTTP 状态码能够快速反映请求的总体结果。例如,
200 OK
表示请求成功,400 Bad Request
指示请求格式错误,403 Forbidden
表明权限不足,404 Not Found
说明请求的资源不存在,而500 Internal Server Error
则代表服务器内部发生错误。开发者应根据不同的状态码采取相应的处理措施。 -
JSON 格式错误信息:
当请求失败时,Kraken API 会在响应体中返回 JSON 格式的错误信息。该 JSON 对象通常包含一个
error
字段,其值是一个包含错误代码和错误描述的数组。错误代码是预定义的字符串,用于标识特定类型的错误,而错误描述则提供更详细的错误信息,有助于开发者理解错误的具体原因。通过解析 JSON 格式的错误信息,开发者可以更精确地定位问题,并采取适当的解决策略。例如,常见的错误包括:无效的 API 密钥、请求参数缺失或格式错误、账户余额不足、交易量超出限制等。
HTTP 状态码:
-
200 OK
: 请求成功。服务器已成功处理请求并返回了请求的内容。这通常表示API调用成功,并且客户端收到了期望的数据。 -
400 Bad Request
: 错误的请求。服务器未能理解请求,通常是由于客户端发送的请求参数不符合API的要求。这可能包括缺少必要的参数、参数格式错误或参数值超出范围。客户端应该检查请求参数并进行更正后重试。 -
403 Forbidden
: 禁止访问。服务器理解了请求,但是拒绝执行。这通常表示客户端没有足够的权限访问请求的资源。可能是由于未授权的IP地址、API密钥无效或缺少必要的角色权限。 -
429 Too Many Requests
: 请求过多。客户端在短时间内发送了过多的请求,超过了服务器的限制。为了保护服务器免受滥用,API通常会限制每个客户端的请求频率。客户端应该降低请求频率,并可以尝试实现重试机制,例如使用指数退避算法。一些API可能会在响应头中包含Retry-After
字段,指示客户端应该在多少秒后重试。 -
500 Internal Server Error
: 服务器内部错误。服务器在尝试处理请求时遇到了意外错误。这通常是服务器端的问题,而不是客户端的问题。客户端可以稍后重试请求。如果问题仍然存在,应该联系API提供商寻求支持。服务器错误日志可能包含关于错误的更多信息。
error
字段包含错误信息数组。 每个错误信息都包含一个错误代码和错误描述。
例如:
{ "error": [ "EOrder:Insufficient funds" ], "result": null }
在编写 API 客户端时,务必处理各种可能的错误情况,并采取适当的措施。
速率限制
Kraken API实施了请求频率限制机制,旨在保障系统稳定性,防止恶意滥用行为,确保所有用户的服务质量。
具体的速率限制策略取决于多个关键因素:用户的账户等级以及所调用的特定API端点。不同账户等级的用户享有不同的请求配额,高级账户通常拥有更高的速率限制。同时,不同的API端点由于其资源消耗和重要性不同,也可能具有不同的速率限制。
当用户的请求频率超过API设定的限制阈值时,API服务器将返回一个HTTP
429 Too Many Requests
错误响应代码。这个错误表明客户端在指定的时间段内发送了过多的请求。错误响应中可能包含
Retry-After
头部,指示客户端应该在多久之后重试请求。
为了避免触发速率限制,开发者应采取以下措施:仔细阅读Kraken API的官方文档,充分理解并遵守适用于其账户等级和所使用端点的速率限制规则;在客户端实现请求队列和重试机制,当遇到
429
错误时,暂停发送请求,并在
Retry-After
指定的时间后自动重试;优化API调用逻辑,减少不必要的请求,例如,批量获取数据而不是进行多次单独请求;考虑升级账户等级,以获得更高的速率限制,满足更高的业务需求。 如果持续遇到速率限制问题,建议查阅官方文档或联系Kraken的技术支持团队获取帮助。
代码示例 (Python)
以下是一个使用 Python 调用 Kraken API 获取账户余额的示例代码,该代码段展示了如何构造API请求,包括必要的身份验证步骤。务必妥善保管您的API密钥和密钥,避免泄露。
为了确保代码能够正常运行,请先安装必要的Python库,例如
requests
,用于发送HTTP请求,可以通过以下命令安装:
pip install requests
。
import requests # 用于发送 HTTP 请求
import hashlib # 用于创建哈希值
import hmac # 用于创建加密签名
import base64 # 用于 Base64 编码
import urllib.parse # 用于编码 URL 参数
import time # 用于生成 nonce 值
请将
YOUR_API_KEY
和
YOUR_API_SECRET
替换为您从 Kraken 交易所获得的真实 API 密钥和私钥。API 密钥和私钥是访问您的 Kraken 账户所必需的凭证。API密钥用于标识您的应用程序,API私钥用于对请求进行签名,确保请求的安全性。
api_key = "YOUR_API_KEY" # 替换为你的 API 密钥
api_secret = "YOUR_API_SECRET" # 替换为你的 API 私钥
api_url = "https://api.kraken.com" # Kraken API 的基本 URL
kraken_request
函数负责构建并发送经过身份验证的 API 请求。该函数接受 URI 路径(例如,'/0/private/Balance')和可选的数据参数。该函数使用您的 API 密钥和私钥生成一个数字签名,并将其包含在请求头中。Kraken 使用此签名来验证请求的完整性和真实性。
def kraken_request(uri_path, data=None, api_key=None, api_sec=None):
headers = {} # 初始化请求头
if api_key and api_sec: # 仅当提供了 API 密钥和私钥时才进行身份验证
headers['API-Key'] = api_key # 添加 API 密钥到请求头
data = data or {} # 如果没有提供数据,则初始化为空字典
data['nonce'] = str(int(1000*time.time())) # 生成一个 nonce 值,用于防止重放攻击
post_data = urllib.parse.urlencode(data) # 将数据编码为 URL 格式
encoded = (uri_path).encode() + hashlib.sha256(post_data.encode()).digest() # 创建用于签名的消息
signature = hmac.new(base64.b64decode(api_sec), encoded, hashlib.sha512) # 使用 HMAC-SHA512 算法创建签名
headers['API-Sign'] = base64.b64encode(signature.digest()).decode() # 将签名添加到请求头
req = requests.post(api_url + uri_path, headers=headers, data=data) # 发送 POST 请求
return req # 返回响应对象
以下是如何调用
kraken_request
函数来获取账户余额的示例:
# 调用 API 获取账户余额
response = kraken_request('/0/private/Balance', api_key=api_key, api_sec=api_secret)
# 检查响应状态码
if response.status_code == 200:
# 将响应内容解析为 JSON 格式
_response = response.()
# 打印账户余额信息
print(_response)
else:
# 打印错误信息
print(f"Error: {response.status_code}, {response.text}")
Example usage: Get account balance
要获取账户余额,您需要构造一个API请求。以下示例展示了如何使用Python发送请求到Kraken API的
/0/private/Balance
端点。
api_path = '/0/private/Balance'
定义API路径,该路径指向Kraken的私有余额查询接口。
data = {}
创建一个空的数据字典。对于余额查询,通常不需要额外的请求参数。
response = kraken_request(api_path, data, api_key, api_secret)
使用
kraken_request
函数发送API请求。该函数需要API路径、数据字典、API密钥和API私钥作为参数。确保您已定义并实现了
kraken_request
函数,该函数负责处理API认证并发送实际的HTTP请求。
if response.status_code == 200:
检查HTTP响应状态码。状态码200表示请求成功。
result = response.()
将响应内容解析为JSON格式,以便进一步处理。
if result['error']:
检查响应中是否包含错误信息。Kraken API使用
error
字段来报告错误。
print("Error:", result['error'])
如果存在错误,则打印错误信息。
else:
如果没有错误,则从响应中提取余额信息。
print("Balance:", result['result'])
打印账户余额。余额信息通常包含在
result
字段中。
else:
如果HTTP响应状态码不是200,则表示请求失败。
print("Request failed:", response.status_code, response.text)
打印请求失败的状态码和响应文本,以便调试。
请务必将
YOUR_API_KEY
和
YOUR_API_SECRET
替换为您的真实API密钥。API密钥用于身份验证,切勿泄露。
为了安全地访问您的Kraken账户信息,您必须理解API密钥管理、请求签名过程以及数据加密的重要性。仔细阅读Kraken API文档,可以帮助您构建安全可靠的交易应用程序,并了解更高级的功能,例如WebSockets流数据、杠杆交易以及订单管理。