Kraken API完全指南:Python交易实战,小白也能轻松上手!

分类:论坛 访问:30

Kraken交易所API使用方法

前言

Kraken交易所提供了一个功能全面的应用程序编程接口 (API),为开发者提供了通过编程方式与平台交互的强大能力。利用Kraken API,开发者能够自动化执行交易、实时获取精准的市场数据、高效管理账户以及构建自定义的交易策略和应用程序。本文将深入探讨如何有效利用Kraken的API,内容涵盖API密钥的生成和安全身份验证、各种常用API端点的详细说明、以及使用Python语言编写的实际代码示例,以便开发者快速上手。

身份验证

使用Kraken API的首要步骤是身份验证。这涉及到生成API密钥对,其中包括一个API Key(公共密钥)和一个Private Key(私有密钥)。API Key用于标识你的身份,而Private Key则用于对你的请求进行签名,确保请求的真实性和完整性。 你可以在Kraken官方网站的API管理页面安全地创建这些密钥对。创建密钥对后,请务必将其存储在安全的地方,并采取适当的安全措施,例如使用密码管理器或硬件钱包。 请务必妥善保管你的Private Key,切勿将其泄露给任何第三方,因为任何拥有你的Private Key的人都可以代表你执行API操作。 一旦泄露,立即撤销并重新生成密钥对。

生成API密钥对后,你需要使用它们来签署你的API请求。 Kraken API采用HMAC-SHA512算法进行签名,这是一种广泛使用的消息认证码算法,可以有效地防止篡改和重放攻击。签名过程包括将请求数据和你的Private Key组合在一起,然后通过HMAC-SHA512算法生成一个唯一的签名。服务器将使用你的API Key找到对应的Private Key,并使用相同的算法重新计算签名。如果两个签名匹配,则服务器会验证你的请求。 下面是一个Python示例,展示了如何使用 hashlib hmac base64 urllib.parse 库生成符合Kraken API要求的签名:

import hashlib import hmac import base64 import urllib.parse

def get_kraken_signature(urlpath, data, secret):
postdata = urllib.parse.urlencode(data)
encoded = (urlpath + postdata).encode()
message = hashlib.sha256(encoded).digest()
mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())
return sigdigest.decode()

urlpath 是API端点的路径,它指定了你要调用的API功能,例如 /0/private/Balance 用于获取账户余额。 data 是一个包含请求参数的字典,这些参数用于传递你的请求的具体信息,例如交易对、数量或其他相关设置。 secret 是你的Private Key,它是你身份验证的关键,必须安全存储。在调用此函数之前,请确保正确设置这些变量的值,并根据Kraken API文档的要求格式化 data 中的参数。

常用API接口

Kraken API 提供了一套全面的应用程序编程接口 (API),细分为两大类:公共数据 API 和私有数据 API。这些 API 允许开发者访问 Kraken 交易所的各种功能和数据。

公共数据 API :这类 API 允许用户在无需身份验证的情况下访问各种市场数据。常见的公共数据 API 包括:

  • 获取服务器时间 (Time) :返回 Kraken 服务器的当前时间戳。对于同步交易策略至关重要。
  • 获取资产信息 (Assets) :提供有关 Kraken 上可用加密货币资产的详细信息,包括资产名称、交易精度等。
  • 获取交易对信息 (Asset Pairs) :检索 Kraken 上支持的交易对信息,例如交易对的名称、价格精度、交易量精度等。
  • 获取市场数据 (Ticker) :获取指定交易对的实时市场数据,包括当前价格、最高价、最低价、成交量、成交笔数等。是构建实时行情显示和交易策略的基础。
  • 获取市场深度 (Depth) :获取指定交易对的订单簿深度信息,包括买单和卖单的价格和数量。有助于了解市场的供需状况。
  • 获取近期交易历史 (Trades) :获取指定交易对的近期交易历史记录,包括交易时间、价格和数量。可用于分析市场趋势。
  • 获取 K 线数据 (OHLC) :获取指定交易对的 OHLC (Open, High, Low, Close) K 线数据,用于技术分析和图表绘制。支持不同的时间周期,例如 1 分钟、5 分钟、1 小时等。

私有数据 API :这类 API 需要用户进行身份验证才能访问,允许用户管理其 Kraken 账户并执行交易。常见的私有数据 API 包括:

  • 获取账户余额 (Balance) :获取用户账户中各种加密货币的余额信息。
  • 获取交易历史 (Trades History) :检索用户的历史交易记录。
  • 获取挂单信息 (Open Orders) :获取用户当前挂单的信息,例如订单类型、价格、数量等。
  • 下单 (Add Order) :允许用户在 Kraken 交易所下达买单或卖单。支持各种订单类型,例如市价单、限价单、止损单等。
  • 取消订单 (Cancel Order) :允许用户取消尚未成交的挂单。
  • 提币 (Withdraw Funds) :允许用户将加密货币从 Kraken 账户提取到外部钱包。
  • 充币 (Deposit Funds) :获取将加密货币存入 Kraken 账户的地址。

为了安全地使用私有数据 API,用户需要生成 API 密钥并妥善保管。 Kraken API 使用 HMAC-SHA512 签名进行身份验证,确保只有授权用户才能访问其账户。

公共数据接口

  • Ticker Information: 获取指定交易对的实时行情信息,包括但不限于最新成交价、24小时成交量、当日最高价、当日最低价、加权平均价等关键指标。Ticker数据对于快速了解市场动态至关重要。
    • 端点: /0/public/Ticker
    • 参数: pair (交易对,例如 XBTUSD 表示比特币对美元)
    • 示例:

使用Python的 requests 库可以轻松获取Ticker数据。

import requests

url = "https://api.kraken.com/0/public/Ticker?pair=XBTUSD"
response = requests.get(url)
data = response.()
print(data)

上述代码发送一个GET请求到Kraken API,并解析返回的JSON数据。 response.() 方法将响应内容转换为Python字典,便于访问其中的各个字段。 返回的数据结构包含了诸如 'a' (ask), 'b' (bid), 'c' (close), 'v' (volume), 'p' (vwap), 't' (trades), 'l' (low), 'h' (high), 'o' (open) 等关键指标。

  • OHLC Data: 获取指定交易对的OHLC(Open, High, Low, Close)数据,也称为K线数据。OHLC数据是技术分析的基础,用于识别价格趋势和形态。
    • 端点: /0/public/OHLC
    • 参数: pair (交易对,例如 XBTUSD ), interval (时间间隔,单位为分钟,例如 1 , 5 , 15 , 30 , 60 , 240 , 1440 , 10080 , 21600 分别代表1分钟、5分钟、15分钟、30分钟、1小时、4小时、1天、1周、15天)
    • 示例:

同样,使用 requests 库获取OHLC数据:

import requests

url = "https://api.kraken.com/0/public/OHLC?pair=XBTUSD&interval=60"
response = requests.get(url)
data = response.()
print(data)

此代码获取XBTUSD交易对的1小时OHLC数据。返回的数据通常是一个包含时间戳和OHLC价格的列表。这些数据可用于绘制K线图,并进行更深入的技术分析。

  • Depth: 获取指定交易对的订单簿深度信息。订单簿展示了当前市场上买单和卖单的挂单情况,有助于了解市场的供需关系和潜在的价格支撑/阻力位。
    • 端点: /0/public/Depth
    • 参数: pair (交易对,例如 XBTUSD ), count (订单簿条目数量,可选,指定返回的买单和卖单的数量。如果不指定,则返回全部订单)
    • 示例:

获取订单簿深度数据示例:

import requests

url = "https://api.kraken.com/0/public/Depth?pair=XBTUSD&count=10"
response = requests.get(url)
data = response.()
print(data)

这段代码获取XBTUSD交易对的订单簿深度信息,仅返回10个最佳买单和10个最佳卖单。订单簿数据对于高频交易和算法交易至关重要,可以帮助交易者更好地把握市场机会。

私有数据接口

注意:私有数据接口需要进行身份验证!

  • Balance: 获取账户余额。此端点允许经过身份验证的用户查询其Kraken交易所账户的余额信息。 调用此端点需要有效的API密钥和签名,以确保请求的合法性和安全性。
    • 端点: /0/private/Balance
    • 示例:以下Python代码展示了如何使用requests库,结合API密钥和签名,安全地访问余额信息。 请确保你的API密钥已配置相应的权限。

以下代码演示了如何使用Python和 requests 库向Kraken API发送经过身份验证的 Balance 请求。

import requests import os import hashlib import hmac import base64

api_key = os.environ.get('KRAKEN_API_KEY') api_secret = os.environ.get('KRAKEN_API_SECRET')

请确保将你的Kraken API密钥和私钥存储在环境变量 KRAKEN_API_KEY KRAKEN_API_SECRET 中。 这是避免在代码中硬编码敏感信息的最佳实践。

urlpath = '/0/private/Balance' data = {}

data 字典用于传递任何附加的请求参数。 在查询账户余额时,通常不需要额外的参数。 保留为空字典即可。

def get_kraken_signature(urlpath, data, secret): postdata = urllib.parse.urlencode(data) encoded = (urlpath + postdata).encode() message = base64.b64decode(secret) sig = hmac.new(message, encoded, hashlib.sha512) digest = base64.b64encode(sig.digest()) return digest.decode()

此函数生成必要的API签名。 它使用你的私钥对请求数据进行哈希处理,从而验证请求的真实性。 正确的签名对于访问任何私有端点至关重要。

url = "https://api.kraken.com" + urlpath headers = { 'API-Key': api_key, 'API-Sign': get_kraken_signature(urlpath, data, api_secret) }

url 变量定义了完整的API端点URL。 headers 字典包含 API-Key API-Sign , 这是Kraken API进行身份验证所必需的。

response = requests.post(url, headers=headers, data=data) data = response.() print(data)

此代码段使用 requests.post 方法向API发送POST请求。 response.() 方法将响应解析为JSON格式, 使你可以轻松访问返回的余额数据。

请确保将 KRAKEN_API_KEY KRAKEN_API_SECRET 设置为你的环境变量。

为了安全地与 Kraken API 交互,API 密钥和密钥是必不可少的。 你应当在操作系统级别的环境变量中安全存储这些凭据,而不是将它们硬编码到你的脚本中。 这有助于防止意外泄露你的密钥,例如,通过将其提交到版本控制系统。

  • Trade Balance: 获取交易余额。
    • 端点: /0/private/TradeBalance
    • 描述: 此端点允许你检索 Kraken 账户中各种资产的可用交易余额。
    • 参数:
      • asset (资产,可选,例如 ZUSD )。如果省略,则返回所有资产的余额。指定资产可以仅查询该资产的余额。
    • 示例:检索 ZUSD 的交易余额。
    
    import requests
    import os
    import hashlib
    import hmac
    import base64
    
    api_key = os.environ.get('KRAKEN_API_KEY')
    api_secret = os.environ.get('KRAKEN_API_SECRET')
    
    def get_kraken_signature(urlpath, data, secret):
        post_data = urllib.parse.urlencode(data)
        encoded = (urlpath + hashlib.sha256((post_data).encode()).hexdigest()).encode()
        b64 = base64.b64encode(hmac.new(base64.b64decode(secret), encoded, hashlib.sha512).digest())
        return b64.decode()
    
    urlpath = '/0/private/TradeBalance'
    data = {'asset': 'ZUSD'} # 可选参数,指定要查询的资产
    
    signature = get_kraken_signature(urlpath, data, api_secret)
    
    url = "https://api.kraken.com" + urlpath
    headers = {
        'API-Key': api_key,
        'API-Sign': signature
    }
    
    response = requests.post(url, headers=headers, data=data)
    response.raise_for_status() # 检查是否有 HTTP 错误
    data = response.()
    print(data)
    

    代码说明:

    1. 导入必要的库: requests 用于发送 HTTP 请求, os 用于访问环境变量。
    2. 从环境变量中检索 API 密钥和密钥。
    3. 定义 get_kraken_signature 函数,该函数创建 Kraken API 请求所需的签名。签名对于认证请求至关重要。
    4. 指定要调用的 API 端点 ( urlpath ) 和包含请求参数的 data 字典。
    5. 使用 API 密钥、端点路径和数据生成签名。
    6. 设置请求头,包括 API 密钥和签名。
    7. 使用指定的头和数据向 Kraken API 发送一个 POST 请求。
    8. 解析 JSON 响应并打印结果。
  • Add Order: 下单。
    • 端点: /0/private/AddOrder
    • 描述:此端点允许你向 Kraken 交易所提交新的订单。你可以指定各种订单参数,例如交易对、类型、数量和价格。
    • 参数:
      • pair (交易对,例如 XBTUSD )。指定交易对,例如比特币/美元。
      • type (订单类型,例如 buy , sell )。指定是购买还是出售交易对中的基础资产。
      • ordertype (订单种类,例如 market , limit , stop-loss , take-profit )。设置订单类型,例如市价单,限价单,止损单或止盈单。
      • price (价格,仅限限价单)。对于限价单,设置订单执行的价格。
      • volume (数量)。指定要交易的基础资产的数量。
      • leverage (杠杆,可选)。设置杠杆倍数。
      • close (条件平仓,可选)。设置条件平仓单。
    • 示例:提交一个比特币/美元的市价买单。
    
    import requests
    import os
    import hashlib
    import hmac
    import base64
    import urllib.parse
    
    api_key = os.environ.get('KRAKEN_API_KEY')
    api_secret = os.environ.get('KRAKEN_API_SECRET')
    
    def get_kraken_signature(urlpath, data, secret):
        post_data = urllib.parse.urlencode(data)
        encoded = (urlpath + hashlib.sha256((post_data).encode()).hexdigest()).encode()
        b64 = base64.b64encode(hmac.new(base64.b64decode(secret), encoded, hashlib.sha512).digest())
        return b64.decode()
    
    urlpath = '/0/private/AddOrder'
    data = {
        'pair': 'XBTUSD',
        'type': 'buy',
        'ordertype': 'market',
        'volume': '0.001'
    }
    
    signature = get_kraken_signature(urlpath, data, api_secret)
    
    url = "https://api.kraken.com" + urlpath
    headers = {
        'API-Key': api_key,
        'API-Sign': signature
    }
    
    response = requests.post(url, headers=headers, data=data)
    response.raise_for_status() # 检查是否有 HTTP 错误
    data = response.()
    print(data)
    

    代码说明:

    1. 导入必要的库: requests 用于发送 HTTP 请求, os 用于访问环境变量, hashlib , hmac , base64 用于生成签名, urllib.parse 用于 URL 编码。
    2. 从环境变量中检索 API 密钥和密钥。
    3. 定义 get_kraken_signature 函数,该函数创建 Kraken API 请求所需的签名。签名对于认证请求至关重要。
    4. 指定要调用的 API 端点 ( urlpath ) 和包含订单参数的 data 字典。
    5. 使用 API 密钥、端点路径和数据生成签名。
    6. 设置请求头,包括 API 密钥和签名。
    7. 使用指定的头和数据向 Kraken API 发送一个 POST 请求。
    8. 解析 JSON 响应并打印结果。
  • Cancel Order: 取消订单。
    • 端点: /0/private/CancelOrder
    • 描述:此端点允许你取消之前在 Kraken 交易所提交的挂单。
    • 参数: txid (订单ID)。指定要取消的订单的交易 ID。
    • 示例:取消一个具有指定交易 ID 的订单。
    
    import requests
    import os
    import hashlib
    import hmac
    import base64
    import urllib.parse
    
    api_key = os.environ.get('KRAKEN_API_KEY')
    api_secret = os.environ.get('KRAKEN_API_SECRET')
    
    def get_kraken_signature(urlpath, data, secret):
        post_data = urllib.parse.urlencode(data)
        encoded = (urlpath + hashlib.sha256((post_data).encode()).hexdigest()).encode()
        b64 = base64.b64encode(hmac.new(base64.b64decode(secret), encoded, hashlib.sha512).digest())
        return b64.decode()
    
    urlpath = '/0/private/CancelOrder'
    data = {
        'txid': 'YOUR_ORDER_ID'  # 用你的订单ID替换
    }
    
    signature = get_kraken_signature(urlpath, data, api_secret)
    
    url = "https://api.kraken.com" + urlpath
    headers = {
        'API-Key': api_key,
        'API-Sign': signature
    }
    
    response = requests.post(url, headers=headers, data=data)
    response.raise_for_status() # 检查是否有 HTTP 错误
    data = response.()
    print(data)
    

    代码说明:

    1. 导入必要的库: requests 用于发送 HTTP 请求, os 用于访问环境变量。
    2. 从环境变量中检索 API 密钥和密钥。
    3. 定义 get_kraken_signature 函数,该函数创建 Kraken API 请求所需的签名。签名对于认证请求至关重要。
    4. 指定要调用的 API 端点 ( urlpath ) 和包含要取消的订单的交易 ID 的 data 字典。
    5. 使用 API 密钥、端点路径和数据生成签名。
    6. 设置请求头,包括 API 密钥和签名。
    7. 使用指定的头和数据向 Kraken API 发送一个 POST 请求。
    8. 解析 JSON 响应并打印结果。
  • Open Orders: 获取当前未成交的订单。
    • 端点: /0/private/OpenOrders
    • 描述:此端点检索你的 Kraken 账户上所有当前未结订单的列表。
    • 示例: 获取所有未结订单。
    
    import requests
    import os
    import hashlib
    import hmac
    import base64
    import urllib.parse
    
    api_key = os.environ.get('KRAKEN_API_KEY')
    api_secret = os.environ.get('KRAKEN_API_SECRET')
    
    def get_kraken_signature(urlpath, data, secret):
        post_data = urllib.parse.urlencode(data)
        encoded = (urlpath + hashlib.sha256((post_data).encode()).hexdigest()).encode()
        b64 = base64.b64encode(hmac.new(base64.b64decode(secret), encoded, hashlib.sha512).digest())
        return b64.decode()
    
    urlpath = '/0/private/OpenOrders'
    data = {}
    
    signature = get_kraken_signature(urlpath, data, api_secret)
    
    url = "https://api.kraken.com" + urlpath
    headers = {
        'API-Key': api_key,
        'API-Sign': signature
    }
    
    response = requests.post(url, headers=headers, data=data)
    response.raise_for_status() # 检查是否有 HTTP 错误
    data = response.()
    print(data)
    

    代码说明:

    1. 导入必要的库: requests 用于发送 HTTP 请求, os 用于访问环境变量。
    2. 从环境变量中检索 API 密钥和密钥。
    3. 定义 get_kraken_signature 函数,该函数创建 Kraken API 请求所需的签名。签名对于认证请求至关重要。
    4. 指定要调用的 API 端点 ( urlpath )。 data 字典为空,因为此端点不需要额外的参数。
    5. 使用 API 密钥、端点路径和数据生成签名。
    6. 设置请求头,包括 API 密钥和签名。
    7. 使用指定的头和数据向 Kraken API 发送一个 POST 请求。
    8. 解析 JSON 响应并打印结果。

错误处理

在使用Kraken API时,可能会遇到各种错误。Kraken API以JSON格式返回错误信息,便于解析和处理。开发者应当建立完善的错误处理机制,提高应用程序的健壮性。

错误响应通常包含一个 error 字段。你需要检查此字段是否存在。如果 error 字段存在,则表示API调用过程中发生了错误,需要根据错误信息进行相应的处理。

以下是一个错误响应的示例:

{
  "error": [
     "EGeneral:Invalid arguments"
   ]
}

上述示例表明传递给API的参数存在问题。 EGeneral 通常表示常规错误,而 Invalid arguments 则指明参数无效。

常见的错误类型包括:

  • Invalid arguments: 提交的参数错误或缺失。可能是参数格式不正确、缺少必填参数或参数值超出允许范围。请仔细检查API文档中对参数的要求。
  • API key invalid: 提供的API密钥无效。请确认API密钥是否正确配置,并且拥有访问所需API的权限。也可能是API密钥已被禁用或过期。
  • Insufficient funds: 账户余额不足以完成请求的操作,例如下单。需要检查账户余额,并确保有足够的资金进行交易。
  • Rate limit exceeded: 超过了API调用频率限制。Kraken为了防止滥用,对API的调用频率进行了限制。你需要减少请求的频率。
  • Order minimum: 订单金额低于最小允许金额。
  • Order not found: 尝试取消或查询不存在的订单。
  • Invalid nonce: nonce值无效,通常是因为nonce值过小或重复使用。

开发者需要根据具体的错误信息进行相应的处理。例如,对于 Invalid arguments 错误,需要检查请求参数;对于 API key invalid 错误,需要检查API密钥的配置。详细的错误代码和解释通常可以在Kraken的官方API文档中找到。

请注意,Kraken对API调用频率有限制。如果你的请求过于频繁,将会收到 Rate limit exceeded 错误。为了避免达到频率限制,你可以采用以下策略:

  • 增加请求间隔: 降低API调用的频率,例如在两次请求之间增加延迟。
  • 批量处理: 将多个请求合并为一个请求,减少API调用的次数。
  • 使用WebSocket API: 对于需要实时数据更新的场景,可以使用WebSocket API,它比REST API的效率更高,可以减少请求的次数。
  • 监控API使用情况: 密切监控API的使用情况,及时发现并解决频率限制问题。

合理管理API调用频率,确保应用程序的稳定运行。

(此处故意留空,遵循不总结的指令)