Kraken API接口使用详解:交易、数据与账户管理

时间:2025-02-26 阅读数:75人阅读

d " - ] e 1 [ G a %

Kraken API 接口使用教程

Kraken 交易所提供了一套强大的 API 接口,允许开发者自动化交易、获取市场数据以及管理账户。 本文将详细介绍如何使用 Kraken API,包括认证、常用接口调用以及一些注意事项。

1. 准备工作

在使用 Kraken API 之前,需要进行以下准备,以确保顺利且安全地集成:

  • Kraken 账户: 必须拥有一个经验证的 Kraken 账户。没有账户则无法进行任何 API 调用。验证等级越高,API 的使用权限可能也会随之增加。
  • API 密钥: 在 Kraken 官方网站的安全设置中生成 API 密钥。生成密钥时,务必采取最小权限原则,即只赋予密钥执行特定任务所需的最小权限集。这能显著降低密钥泄露可能造成的风险。请特别注意,除非绝对必要, 强烈建议不要赋予提现权限 。考虑使用不同的密钥分别管理交易和查询操作。在生成 API 密钥后,妥善保管密钥信息,切勿将其存储在公共代码仓库或不安全的位置。
  • 编程环境: 选择你熟悉的编程语言和相应的 HTTP 客户端库。考虑到易用性、性能和社区支持,常见的选择包括:
    • Python: 广泛使用的 requests 库,或者更高级的异步库 aiohttp
    • JavaScript: axios 库适用于浏览器端和 Node.js 环境, node-fetch 也是一个不错的选择。
    • Java: HttpClient 库(来自 Apache Commons HttpClient 或 Java 11+ 内置的 HttpClient),或者更现代的 OkHttp 库。
    • 其他语言: 几乎所有主流编程语言都有成熟的 HTTP 客户端库可用。
    安装并配置所选语言的开发环境以及相应的 HTTP 客户端库。
  • API 文档: 仔细阅读 Kraken 的官方 API 文档 (https://www.kraken.com/features/api)。API 文档是理解 API 接口、请求参数、响应格式以及错误代码的关键。务必关注 API 的版本更新,并根据文档中的示例代码进行实践。熟悉 Kraken 提供的公共和私有 API 端点,了解不同端点的使用限制和速率限制。尤其要重点关注身份验证、交易、市场数据等核心 API 接口。

2. 认证

Kraken API采用API密钥进行认证,确保只有授权用户才能访问受保护的资源。为了成功通过认证,你的每个API请求都必须在HTTP请求头中包含特定的认证信息,具体来说,你需要提供 API-Key API-Sign 两个关键字段。

  • API-Key : 这是你的公开API密钥,类似于用户名,用于识别你的身份。它允许Kraken服务器识别哪个账户正在发起API请求。 你可以在Kraken账户的安全设置中找到并管理你的API密钥。请妥善保管你的API密钥,避免泄露。
  • API-Sign : 这是一个使用你的私钥生成的数字签名,用于验证请求的真实性和完整性。 签名过程涉及使用你的私钥对请求的特定部分(例如请求路径、查询参数和请求体)进行哈希运算。Kraken服务器会使用你的公钥验证此签名,确保请求确实来自你,并且在传输过程中没有被篡改。 生成 API-Sign 的具体步骤和算法取决于你使用的编程语言和加密库。通常,你需要使用HMAC-SHA512算法,并仔细遵循Kraken API文档中关于签名生成的说明。

正确配置 API-Key API-Sign 至关重要。 错误的签名或缺失的密钥将导致API请求失败,并返回认证错误。 务必仔细检查你的代码,确保签名生成过程正确无误,并且API密钥有效。 为了提高安全性,建议定期更换你的API密钥,并限制API密钥的权限,只授予其执行所需操作的权限。

2.1 生成 API-Sign

生成 API-Sign 的步骤如下,此签名用于验证 API 请求的完整性和真实性,防止中间人攻击和数据篡改:

  1. 构建 POST 数据字符串: 为了确保签名的一致性,必须将所有通过 POST 请求发送的数据(例如 nonce pair type ordertype volume ,以及任何其他自定义参数)按照字母顺序进行排序。 排序后,将所有键值对以“key=value”的形式连接成一个字符串。如果某个值是数组,则需要将其序列化成字符串。连接时确保没有额外的空格或分隔符。例如,如果POST数据包含`nonce=12345`, `pair=ETHUSD`, `volume=1.5`,排序连接后的字符串应为 `nonce=12345pair=ETHUSDvolume=1.5`。
  2. 计算 SHA256 哈希: 对上一步骤中生成的 POST 数据字符串计算 SHA256 哈希值。 SHA256 是一种单向加密算法,能够将任意长度的数据生成固定长度的哈希值。 使用标准的 SHA256 算法库进行计算,确保输出结果为十六进制字符串。 这个哈希值是构建最终签名的重要组成部分。
  3. 对请求 URI 进行编码: 请求的相对 URI (例如 /0/private/AddOrder ) 必须进行 URL 编码,以确保特殊字符(如空格、斜杠等)不会干扰签名过程。 URL 编码会将这些字符转换为百分号编码的形式(例如,空格变为 `%20`,斜杠变为 `%2F`)。 务必使用符合 RFC 3986 标准的 URL 编码方式。
  4. 构建消息: 将上一步骤中编码后的 URI 与 SHA256 哈希值连接在一起,形成最终用于签名的消息。 连接顺序为:先是编码后的 URI,然后是 SHA256 哈希值。 中间没有分隔符。 此消息将被用作 HMAC-SHA512 算法的输入。
  5. 使用私钥进行 HMAC-SHA512 签名: 使用你的私钥对消息进行 HMAC-SHA512 签名。HMAC-SHA512 是一种消息认证码算法,它使用密钥和哈希函数来生成消息的摘要。 使用你的私钥作为密钥,并对构建的消息进行 HMAC-SHA512 运算。 签名过程完成后,将签名结果进行 Base64 编码。 Base64 编码将二进制数据转换为 ASCII 字符串,以便在 HTTP 头部中传输。 生成的 Base64 编码字符串即为最终的 API-Sign 值,需要将其添加到 API 请求的头部中。

示例 (Python):

本示例展示如何使用 Python 与 Kraken 交易所的 API 进行交互,包括生成必要的签名以进行身份验证。 请确保已安装必要的 Python 库,例如 hashlib , hmac , base64 urllib.parse


import hashlib
import hmac
import base64
import urllib.parse
import requests

定义您的 API 密钥和密钥,以及 Kraken API 的基本 URL。 请务必替换 "YOUR_API_KEY" "YOUR_API_SECRET" 为您从 Kraken 交易所获得的实际密钥。


api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
api_url = "https://api.kraken.com"

get_kraken_signature 函数用于生成请求所需的签名。 此函数接受 API 路径 ( urlpath ),请求数据 ( data ),以及 API 密钥 ( secret ) 作为输入。 签名过程包括以下步骤:

  1. 将请求数据编码为 URL 编码格式。
  2. 将 API 路径编码为字节串。
  3. 将编码后的请求数据编码为字节串。
  4. 使用 SHA256 算法对编码后的请求数据进行哈希处理。
  5. 使用 HMAC-SHA512 算法,以 API 密钥对 API 路径和 SHA256 哈希值的组合进行签名。
  6. 将生成的 HMAC 摘要进行 Base64 编码,得到最终的签名。

def get_kraken_signature(urlpath, data, secret):
    post_data = urllib.parse.urlencode(data)
    encoded = (urlpath).encode()
    message = post_data.encode()
    sha256_hash = hashlib.sha256(message).digest()
    hmac_digest = hmac.new(base64.b64decode(secret), encoded + sha256_hash, hashlib.sha512).digest()
    signature = base64.b64encode(hmac_digest)
    return signature

kraken_request 函数用于向 Kraken API 发送 POST 请求。 它接收 API 路径 ( uri_path ),请求数据 ( data ),API 密钥 ( api_key ),以及 API 密钥 ( api_secret ) 作为输入。 此函数首先构建包含 API 密钥和签名的 HTTP 头部,然后将请求发送到 Kraken API,并返回响应。


def kraken_request(uri_path, data, api_key, api_secret):
    headers = {
        'API-Key': api_key,
        'API-Sign': get_kraken_signature(uri_path, data, api_secret)
    }
    url = api_url + uri_path
    response = requests.post(url, headers=headers, data=data)
    return response

示例用法:获取账户余额

为了查询您的 Kraken 账户余额,您需要构造一个包含必要参数的数据字典,并使用您的 API 密钥和密钥来发送经过身份验证的请求。

以下是一个 Python 代码示例,展示了如何执行此操作:


import time
import krakenex # 假设您已安装 krakenex 库

# 请确保替换为您的真实 API 密钥和密钥
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"

# 创建 Kraken API 请求对象 (如果你没有使用krakenex库,请替换为你使用的库或者自定义方法)
k = krakenex.API()
k.load_key('kraken.key') #可选,如果你将api_key和api_secret保存在文件中

def kraken_request(uri_path, data, api_key, api_secret):
    """
    发送经过身份验证的 Kraken API 请求。
    :param uri_path: API 端点路径。例如:"/0/private/Balance"。
    :param data: 包含请求参数的字典。
    :param api_key: 您的 API 密钥。
    :param api_secret: 您的 API 密钥。
    :return: API 响应。
    """
    # 在实际应用中,您需要使用 hmac 签名请求
    # 这里只是一个占位符,您需要根据 Kraken API 文档实现签名逻辑
    # 并将 'sign' 添加到 data 字典中。
    import hashlib
    import hmac
    import base64
    data['nonce'] = str(int(time.time() * 1000)) # 创建 nonce
    post_data = urllib.parse.urlencode(data).encode('utf-8') # 编码数据
    message = uri_path.encode() + hashlib.sha256(post_data).digest() # 创建消息
    signature = hmac.new(base64.b64decode(api_secret), message, hashlib.sha512) # 创建签名
    sigdigest = base64.b64encode(signature.digest()) # 编码签名
    headers = {
        'API-Key': api_key,
        'API-Sign': sigdigest.decode()
    }
    url = "https://api.kraken.com" + uri_path
    req = urllib.request.Request(url, data=post_data, headers=headers)
    response = urllib.request.urlopen(req)
    return .loads(response.read().decode('utf-8'))

    #请注意:上面的代码需要引入urllib和库,并且您需要替换为正确的签名算法

data = {
    "nonce": str(int(time.time() * 1000))  # 时间戳作为 nonce,防止重放攻击
}

try:
    response = k.query_private('Balance', data) # 使用 krakenex 库发送请求
    #response = kraken_request("/0/private/Balance", data, api_key, api_secret) #如果你没有使用krakenex库
    print(response)
    # 解析 response 字典并打印账户余额
    if response and response['result']:
        for asset, balance in response['result'].items():
            print(f"资产: {asset}, 余额: {balance}")
    else:
        print("获取账户余额失败.")
        if response and response['error']:
            print(f"错误信息: {response['error']}")


except Exception as e:
    print(f"发生错误: {e}")



代码解释:

  • nonce :一个唯一的数字,用于防止重放攻击。通常使用当前时间戳的毫秒数。每次请求必须使用不同的 nonce 值。
  • api_key :您的 Kraken API 密钥。
  • api_secret :您的 Kraken API 密钥。
  • kraken_request :一个函数,负责向 Kraken API 发送经过身份验证的请求。 注意: 在实际生产环境中,您必须实现正确的 HMAC-SHA512 签名机制来保证请求的安全性。本示例代码仅提供基本框架。
  • /0/private/Balance :Kraken API 的余额查询端点。
  • 返回的 response 是一个 JSON 字典,其中包含您的账户余额信息。您需要解析该字典以提取所需的数据。

重要提示:

  • 请务必妥善保管您的 API 密钥和密钥,不要将其泄露给任何人。
  • 在生产环境中,请使用更安全的 nonce 生成方法。
  • 请仔细阅读 Kraken API 文档,了解所有可用参数和响应格式。
  • 上面代码示例依赖 `krakenex` 库,如果未使用该库,需要自己实现发送 HTTPS 请求和签名过程。
  • 上述代码示例中包含错误处理机制,用于捕获可能发生的异常情况,并提供更详细的错误信息。

依赖: 此示例代码依赖于 `krakenex` 库,您可以使用 `pip install krakenex` 命令进行安装。 如果没有使用krakenex库,需要自行引入urllib, , hmac, hashlib, base64等库,并参考Kraken API文档实现签名认证。

注意:

  • nonce (随机数) 必须是一个严格递增且唯一的整数,以防止重放攻击。 建议使用高精度的时间戳(例如,Unix 时间戳乘以 1000 或更高精度)来生成 nonce ,确保每次API请求都具有不同的 nonce 值。 具体实现时,需要考虑系统时钟的精度和并发请求的可能性,避免出现重复的 nonce 。 在某些交易所,如果 nonce 值小于上次成功请求的 nonce 值,请求会被直接拒绝。
  • 务必安全存储你的 API 密钥(API Key)和私钥(Secret Key)。 API密钥用于标识您的身份,私钥用于对您的请求进行签名,以证明请求的合法性。 绝对不要将它们泄露给任何第三方,包括通过电子邮件、公开代码仓库或任何其他不安全的渠道。 一旦泄露,他人可以冒用您的身份进行交易或其他操作,造成资产损失。 建议采用硬件安全模块 (HSM)、密钥管理系统 (KMS) 或其他安全的密钥存储方案,并定期轮换密钥。 同时,开启双因素认证 (2FA) 可以进一步提高账户安全性。

3. 常用 API 接口

Kraken 提供了一系列功能强大的 API 接口,允许开发者以编程方式访问其交易平台的功能。这些接口分为公共接口和私有接口,分别用于获取公开信息和执行账户操作。以下是一些常用的 Kraken API 接口,并附带更详细的说明:

  • 公共接口:
    • /0/public/Time : 获取 Kraken 服务器的当前时间。这对于同步客户端应用程序非常有用。返回的 Unix 时间戳可以用于验证数据的时间有效性。
    • /0/public/Assets : 获取 Kraken 上可用数字资产的详细信息。这包括资产名称、资产 ID (例如: XXBT 代表比特币)、小数精度以及其他相关属性。此接口是构建资产选择器和动态界面所必需的。
    • /0/public/AssetPairs : 获取 Kraken 交易平台支持的交易对信息。返回数据包括交易对名称、交易对 ID (例如: XXBTZUSD 代表比特币/美元)、基础资产、报价资产、价格精度、交易量精度以及交易费用。此接口是程序化交易和数据分析的基础。
    • /0/public/Ticker : 获取指定交易对的实时行情数据。重要的指标包括:
      • last : 最新成交价。
      • bid : 最高买入价。
      • ask : 最低卖出价。
      • volume : 24 小时成交量。
      • open : 24小时开盘价。
      • high : 24小时最高价。
      • low : 24小时最低价。
      使用此接口可以监控市场动态和制定交易策略。
    • /0/public/Depth : 获取指定交易对的订单簿信息,包含买单 (bid) 和卖单 (ask) 列表。订单簿数据是理解市场深度和流动性的关键,可以用于高频交易和算法交易。 可以指定返回的订单簿深度 (数量)。
    • /0/public/Trades : 获取指定交易对的最新成交历史记录。返回的数据包括成交价格、成交数量、成交时间和买卖方向。此接口可用于历史数据分析和市场趋势判断。
    • /0/public/OHLC : 获取指定交易对的 K 线数据 (也称为蜡烛图数据)。K 线数据是技术分析的基础,用于识别价格模式和预测未来走势。可以指定 K 线的时间周期 (例如:1 分钟、5 分钟、1 小时、1 天)。
  • 私有接口 (需要 API 密钥认证):
    • /0/private/Balance : 获取已认证账户的可用余额。返回各种资产的余额信息,包括可用余额和总余额。 这是监控账户状态的基础。
    • /0/private/TradeBalance : 获取账户的交易余额,提供更详细的交易相关余额信息,例如已用保证金、未用保证金等。 这对于管理杠杆交易至关重要。
    • /0/private/OpenOrders : 获取账户当前未成交的订单列表。返回数据包括订单 ID、交易对、订单类型 (买/卖)、订单价格、订单数量和下单时间。此接口可用于监控和管理活动订单。
    • /0/private/ClosedOrders : 获取账户已成交或已取消的订单历史记录。此接口提供已完成交易的详细信息,用于交易记录和绩效分析。
    • /0/private/AddOrder : 在 Kraken 交易平台上提交新的交易订单。此接口允许指定交易对、订单类型 (市价单、限价单等)、买卖方向和订单数量。 使用此接口需要谨慎,务必仔细检查订单参数。
    • /0/private/CancelOrder : 取消指定 ID 的未成交订单。在市场变化或交易策略调整时,可以使用此接口取消挂单。
    • /0/private/DepositAddresses : 获取用于向 Kraken 账户充值数字资产的地址。每个资产通常都有一个唯一的充值地址。 请务必使用正确的地址进行充值,否则可能导致资金丢失。
    • /0/private/Withdraw : 从 Kraken 账户提取数字资产。 请务必谨慎使用此接口,并仔细核对提现地址和提现金额,避免资金损失。 建议启用双重验证 (2FA) 以增强安全性。

4. 下单 (AddOrder)

下单是使用 Kraken API 的核心功能之一,允许用户在交易所中执行买入或卖出操作。 AddOrder 接口是实现此功能的关键,通过配置不同的参数,用户可以创建各种类型的订单。下面详细说明 AddOrder 接口的各项参数:

  • pair : 交易对,指定要交易的两种资产。例如, XXBTZUSD 代表比特币 (BTC) 兑美元 (USD) 的交易对。需要注意的是,不同的交易所对交易对的命名规则可能有所不同,请参考 Kraken 的官方文档确认准确的交易对名称。
  • type : 订单类型,决定了订单的交易方向。可以是 buy (买入) 或 sell (卖出)。买入订单表示希望以指定价格或更低的价格购买指定数量的资产,而卖出订单则表示希望以指定价格或更高的价格出售指定数量的资产。
  • ordertype : 订单子类型,定义了订单的执行方式和触发条件。Kraken 提供了多种订单子类型以满足不同的交易策略:
    • market : 市价单,以当前市场最优价格立即执行。市价单的优点是成交速度快,但缺点是成交价格可能不如预期,尤其是在市场波动剧烈时。
    • limit : 限价单,只有当市场价格达到或超过指定价格时才会执行。限价单的优点是可以控制成交价格,但缺点是可能无法立即成交,甚至可能无法成交。
    • stop-loss : 止损单,当市场价格达到指定的止损价格时,订单会被激活并以市价单的形式执行。止损单通常用于限制潜在的损失。
    • take-profit : 止盈单,当市场价格达到指定的止盈价格时,订单会被激活并以市价单的形式执行。止盈单通常用于锁定利润。
    • stop-loss-limit : 止损限价单,与止损单类似,但当市场价格达到指定的止损价格时,订单会被激活并以限价单的形式执行。
    • take-profit-limit : 止盈限价单,与止盈单类似,但当市场价格达到指定的止盈价格时,订单会被激活并以限价单的形式执行。
    • settle-position : 结算仓位,用于平仓。
  • price : 价格,仅适用于 limit , stop-loss , take-profit , stop-loss-limit , take-profit-limit 等订单类型。指定订单执行的价格。 对于限价单,这是希望成交的价格;对于止损单和止盈单,这是触发订单的价格。
  • volume : 数量,指定要交易的资产数量。数量的单位取决于交易对中资产的最小交易单位。
  • leverage : 杠杆倍数 (可选),用于放大交易的收益和损失。杠杆交易存在较高的风险,请谨慎使用。杠杆倍数越高,风险也越高。
  • starttm : 计划开始时间 (可选),指定订单生效的起始时间。 使用 Unix 时间戳格式。如果未指定,订单将立即生效。
  • expiretm : 计划结束时间 (可选),指定订单失效的时间。 使用 Unix 时间戳格式。如果未指定,订单将一直有效,直到成交或被取消。
  • userref : 用户自定义 ID (可选),允许用户为订单分配一个自定义的标识符,方便跟踪和管理订单。
  • close[ordertype] : 平仓订单类型 (可选),用于创建与现有仓位相关的平仓订单。可以指定平仓订单的类型,如 market limit
  • close[price] : 平仓价格 (可选),指定平仓订单的价格。 仅当 close[ordertype] limit , stop-loss , take-profit , stop-loss-limit , take-profit-limit 时需要。
  • close[price2] : 平仓价格 2 (可选),一些订单类型可能需要第二个价格参数。请参考 Kraken 的官方文档了解具体用法。

示例 (Python): 使用 Kraken API 进行身份验证的请求

以下 Python 代码展示了如何使用 Kraken API 进行身份验证,并发送经过签名的 POST 请求。此示例使用了标准库,易于理解和实现。请确保已安装 requests 库: pip install requests


import time
import hashlib
import hmac
import base64
import urllib.parse
import requests

# 替换为你的 Kraken API 密钥和私钥
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
api_url = "https://api.kraken.com"

def get_kraken_signature(urlpath, data, secret):
    """
    生成 Kraken API 请求的数字签名。

    参数:
        urlpath (str): API 端点路径。
        data (dict): 请求的 POST 数据。
        secret (str): 你的 API 私钥。

    返回:
        bytes: Base64 编码的签名。
    """
    post_data = urllib.parse.urlencode(data)
    encoded = (urlpath).encode()
    message = post_data.encode()
    sha256_hash = hashlib.sha256(message).digest()
    hmac_digest = hmac.new(base64.b64decode(secret), encoded + sha256_hash, hashlib.sha512).digest()
    signature = base64.b64encode(hmac_digest)
    return signature

def kraken_request(uri_path, data, api_key, api_secret):
    """
    向 Kraken API 发送经过身份验证的请求。

    参数:
        uri_path (str): API 端点路径。
        data (dict): 请求的 POST 数据。
        api_key (str): 你的 API 密钥。
        api_secret (str): 你的 API 私钥。

    返回:
        requests.Response: API 响应对象。
    """
    headers = {
        'API-Key': api_key,
        'API-Sign': get_kraken_signature(uri_path, data, api_secret)
    }
    url = api_url + uri_path
    response = requests.post(url, headers=headers, data=data)
    return response

# 示例用法:获取账户余额
if __name__ == '__main__':
    uri_path = "/0/private/Balance"
    data = {
        "nonce": str(int(time.time() * 1000))  # 确保 nonce 是唯一的,通常使用时间戳
    }
    response = kraken_request(uri_path, data, api_key, api_secret)

    if response.status_code == 200:
        print("请求成功:")
        print(response.())
    else:
        print(f"请求失败,状态码: {response.status_code}")
        print(response.text)

代码详解:

  • get_kraken_signature(urlpath, data, secret) 函数: 此函数负责生成 Kraken API 请求所需的签名。它首先将 POST 数据进行 URL 编码,然后将 URL 路径和编码后的数据进行编码。接着,它使用 SHA256 算法对编码后的数据进行哈希处理。使用 HMAC-SHA512 算法,将 API 私钥、URL 路径和 SHA256 哈希值进行哈希处理,并进行 Base64 编码,生成最终的签名。
  • kraken_request(uri_path, data, api_key, api_secret) 函数: 此函数使用签名后的请求头向 Kraken API 发送 POST 请求。它将 API 密钥和签名添加到请求头中,然后使用 requests 库发送请求。
  • Nonce: nonce 是一个唯一的数字,用于防止重放攻击。通常,使用当前时间戳(毫秒级)作为 nonce 的值。每次发送请求时,nonce 的值都必须不同。
  • 错误处理: 示例代码包含基本的错误处理,检查响应状态码。在生产环境中,应该添加更完善的错误处理机制,例如处理 API 返回的错误消息。
  • 安全性: 请务必妥善保管你的 API 密钥和私钥。不要将它们存储在代码中,或者提交到公共代码仓库中。可以使用环境变量或其他安全的方式来存储密钥。

注意: 在运行代码之前,请务必将 YOUR_API_KEY YOUR_API_SECRET 替换为你自己的 Kraken API 密钥和私钥。 Kraken API 文档提供了可用的端点和数据格式的详细信息。确保你理解每个端点的要求,并正确构造请求数据。

设置限价买单:以 30,000 美元的价格购买 0.01 BTC

为了在 Kraken 交易所设置限价买单,我们将使用其 API。以下是一个 Python 示例,展示了如何构造并发送一个“AddOrder”请求,以便以指定的价格购买一定数量的比特币。

构建请求数据字典:

data = {
    "nonce": str(int(time.time() * 1000)),
    "pair": "XXBTZUSD",
    "type": "buy",
    "ordertype": "limit",
    "price": "30000",
    "volume": "0.01"
}

字段解释:

  • nonce: 一个唯一的时间戳(毫秒级),用于防止重放攻击。每次 API 调用都需要一个唯一的 nonce 值。
  • pair: 交易对。 "XXBTZUSD" 代表比特币 (BTC) 兑美元 (USD)。 具体交易对的代码可能因交易所而异,请参考Kraken的官方文档。
  • type: 订单类型,此处为 "buy",表示买入。
  • ordertype: 更具体的订单类型,此处为 "limit",表示限价单。限价单只有在达到或低于指定价格时才会执行。
  • price: 限价单的价格,此处为 "30000" 美元。
  • volume: 购买的数量,此处为 "0.01" BTC。

发送 API 请求并处理响应:

response = kraken_request("/0/private/AddOrder", data, api_key, api_secret)
print(response.())

代码解释:

  • kraken_request() : 这是一个自定义函数,用于处理与 Kraken API 的通信。它接收 API 端点("/0/private/AddOrder")、数据、API 密钥和 API 密钥秘密作为参数。你需要根据 Kraken 官方 API 文档的要求,实现该函数,包括请求签名、错误处理等逻辑。
  • "/0/private/AddOrder" : Kraken API 中用于下单的私有端点。
  • api_key : 你的 Kraken API 密钥。
  • api_secret : 你的 Kraken API 密钥秘密。 这两个密钥需要从你的 Kraken 账户生成,并妥善保管。
  • response.() : 将 API 响应解析为 JSON 格式,以便进一步处理。

重要提示:

  • 在实际使用中,请务必替换 api_key api_secret 为你自己的 API 密钥。
  • 你需要安装必要的 Python 库,例如 requests ,用于发送 HTTP 请求。
  • 你需要仔细阅读 Kraken API 文档,了解更多关于请求参数、响应格式、错误代码等方面的信息。
  • 务必进行充分的测试,并在小额交易中验证代码的正确性,再进行更大金额的交易。
  • 请注意资金安全,妥善保管你的 API 密钥和密钥秘密,避免泄露。

5. 错误处理

Kraken API 使用标准的 HTTP 状态码来指示请求是否成功。例如,200 OK 表示请求成功,而 400 Bad Request 则表示客户端发送的请求存在问题。如果请求失败,API 会返回一个 JSON 对象,该对象包含详细的错误信息,以便开发者进行调试和问题排查。

JSON 错误对象通常包含一个名为 "error" 的字段,该字段是一个字符串数组,包含了具体的错误描述。这些错误描述提供了关于请求失败原因的详细信息,例如参数错误、权限不足或者服务器内部错误。开发者应该仔细分析这些错误信息,以便确定问题的根源并采取相应的措施。

常见的 HTTP 状态码及其含义包括:

  • 200 OK: 请求成功。
  • 400 Bad Request: 客户端请求错误,例如参数缺失或格式错误。
  • 403 Forbidden: 请求被服务器拒绝,通常是由于权限不足。
  • 404 Not Found: 请求的资源不存在。
  • 429 Too Many Requests: 请求频率过高,触发了速率限制。
  • 500 Internal Server Error: 服务器内部错误。
  • 503 Service Unavailable: 服务暂时不可用。

开发者应该编写代码来处理这些错误情况,例如,可以使用 try-except 块来捕获异常,并根据错误信息采取适当的措施,例如重试请求、记录错误日志或者向用户显示错误信息。还应该注意处理速率限制,避免因为请求频率过高而被 API 屏蔽。

常见的错误代码:

  • EAPI:Invalid key : API 密钥无效。此错误表明您提供的 API 密钥无法通过验证。请检查您的 API 密钥是否正确输入,是否已过期,或者是否具有执行所需操作的权限。确保密钥与您尝试访问的特定 API 端点关联,并已正确配置。
  • EOrder:Insufficient funds : 资金不足。您的账户余额不足以完成订单。交易可能需要额外费用,例如交易手续费或滑点。请检查您的可用余额,并考虑减少订单数量或增加可用资金,然后再重试交易。
  • EOrder:Order minimum not met : 订单数量低于最低限制。交易所或交易平台对每个交易对都设置了最小订单数量限制。您的订单数量低于此限制。请增加订单数量,使其达到或超过最低要求,然后重试。查看交易所的API文档或用户界面以确定具体交易对的最低订单量。
  • EOrder:Invalid price : 价格无效。您提供的价格不符合交易所或交易平台的规则。这可能是因为价格超出了允许的波动范围,或者价格格式不正确。验证您输入的价格是否在合理范围内,并符合交易所接受的精度和格式要求。检查是否有超出市场价格的异常高或低价格,并根据当前市场状况调整价格。

你应该始终检查 API 响应的 error 字段,并根据错误信息进行相应的处理。通过仔细分析错误代码,您可以诊断问题并采取适当的措施来解决它们,例如更正 API 密钥、增加资金、调整订单数量或修改价格。实现完善的错误处理机制对于构建可靠的自动化交易系统至关重要。

6. 安全建议

  • 保管好你的 API 密钥和私钥: 切勿将 API 密钥和私钥存储在不安全的位置,例如:
    • 版本控制系统(如 GitHub)中的代码仓库。
    • 未受保护的公共服务器或云存储服务。
    • 纯文本文件中。
    建议采用以下安全措施:
    • 环境变量: 将密钥存储在服务器或本地开发环境的环境变量中。
    • 加密文件: 使用加密算法(如 AES)对包含密钥的文件进行加密,并安全地存储加密后的文件。
    • 密钥管理系统 (KMS): 考虑使用专门的 KMS 服务,例如 AWS KMS、Google Cloud KMS 或 Azure Key Vault,以安全地管理和控制对密钥的访问。
    • 硬件安全模块 (HSM): 对于高安全要求的应用,可以使用 HSM 来安全地生成和存储密钥。
    定期轮换你的 API 密钥,降低密钥泄露带来的风险。
  • 限制 API 密钥的权限: API 密钥应仅被授予执行其预期功能所需的最低权限。
    • 避免赋予提现权限: 除非绝对必要,否则不要授予 API 密钥提现权限。即使需要提现权限,也应设置严格的提现额度限制。
    • 细化权限控制: Kraken API 可能提供细粒度的权限控制,例如只允许查询市场数据、下单或取消订单。根据你的应用场景,配置最合适的权限组合。
    • 审计权限变更: 记录所有 API 密钥权限的变更,以便追踪潜在的安全问题。
  • 使用 HTTPS: 始终使用 HTTPS (HTTP Secure) 协议与 Kraken API 进行通信,确保数据在传输过程中的加密和安全。 不要使用 HTTP,因为它不提供加密,容易受到中间人攻击。
    • 验证 SSL/TLS 证书: 在你的代码中验证 Kraken API 服务器的 SSL/TLS 证书,确保连接到的是真正的 Kraken 服务器,而不是恶意仿冒站点。
  • 实施速率限制: 避免过于频繁地调用 Kraken API,尊重 Kraken 的速率限制政策。
    • 了解速率限制: 仔细阅读 Kraken API 的文档,了解不同 API 端点的速率限制。
    • 实施客户端速率限制: 在你的客户端代码中实施速率限制,防止超出 Kraken 的限制。
    • 处理速率限制错误: 当收到速率限制错误时,采取适当的措施,例如暂停一段时间后重试,或者降低 API 调用频率。
    • 使用批量请求: 如果 Kraken API 支持批量请求,尽可能使用批量请求来减少 API 调用次数。
  • 监控你的账户活动: 定期监控你的 Kraken 账户活动,包括:
    • 交易历史: 检查是否有未经授权的交易。
    • API 密钥活动: 监控 API 密钥的使用情况,例如 API 调用次数和类型。
    • 登录历史: 检查是否有异常的登录尝试。
    设置警报,以便在检测到可疑活动时立即收到通知。
  • 使用双因素认证 (2FA): 启用双因素认证 (2FA) 可以为你的 Kraken 账户增加一层额外的安全保护。
    • 选择安全的 2FA 方法: 推荐使用基于时间的一次性密码 (TOTP) 应用程序,例如 Google Authenticator、Authy 或 Duo Mobile。 避免使用短信 2FA,因为它容易受到 SIM 卡交换攻击。
    • 备份 2FA 恢复代码: 在启用 2FA 后,务必备份你的 2FA 恢复代码,以便在丢失 2FA 设备时恢复对账户的访问。

7. API 版本

Kraken API 并非静态不变,而是会不定期进行更新,以便引入新的功能、修复已知问题以及提升整体性能。因此,务必确保您所使用的 API 版本与您的代码逻辑和依赖项保持完全兼容。不兼容的版本可能会导致意外的错误、数据解析失败,甚至导致您的应用程序无法正常运行。

在 Kraken 提供的众多 API 版本中,本文档将主要聚焦于 Kraken API v0 版本。虽然其他版本可能在特定场景下适用,但 v0 版本是目前最稳定、最广泛使用的版本之一。我们建议开发者优先考虑使用 v0 版本,除非有明确的需求或理由选择其他版本。

为了确保您的应用程序始终能够与 Kraken API 无缝集成,强烈建议您定期查阅 Kraken API 官方文档。文档中会详细记录最新的 API 更新、新增功能、废弃的端点以及任何可能影响您代码的变更。通过及时了解这些信息,您可以主动调整您的代码,避免因 API 升级而导致的问题。同时,请关注 Kraken 官方渠道发布的公告,以便获取关于 API 版本更新的重要通知。