Python玩转Kraken API?三步解锁交易自由!

2025-03-07 16:41:33 学习 阅读 87

利用Python访问Kraken API:一个实用指南

本文旨在提供一份实用的指南,指导读者如何使用Python与Kraken加密货币交易所的API进行交互。Kraken API提供了广泛的功能,包括获取市场数据、管理账户以及执行交易。我们将参照Kraken API接口文档Python示例,逐步讲解如何使用Python编程语言实现这些功能。

准备工作

在开始之前,你需要确保满足以下先决条件,以便顺利地与Kraken交易所的API进行交互:

  • Python环境: 确保你的系统已经安装了Python 3.6或更高版本。较新版本的Python通常包含安全性和性能方面的改进,建议使用最新稳定版本。你可以从Python官方网站下载并安装适合你操作系统的版本。安装完成后,建议配置环境变量,以便在命令行中直接使用 python pip 命令。可以通过运行 python --version 命令来验证Python是否成功安装。
  • API密钥: 你需要在Kraken加密货币交易所创建一个账户。注册并登录后,访问你的账户设置或API管理页面,创建一个新的API密钥对,其中包括公钥(API Key)和私钥(Secret Key)。 公钥用于标识你的账户,私钥用于对请求进行签名,验证你的身份。 请务必高度重视并妥善保管你的私钥,绝对不要以任何方式泄露给他人。 一旦泄露,他人可能能够访问和控制你的Kraken账户。启用API密钥时,请仔细配置权限,仅授予必要的访问权限,遵循最小权限原则,降低潜在的安全风险。例如,如果你的程序只需要读取市场数据,则不要授予提现权限。考虑启用双因素身份验证(2FA)以提高账户安全性。
  • 安装 requests 库: Python的 requests 库是与Web服务进行交互的强大工具,它可以简化发送HTTP请求的过程。使用以下命令通过pip(Python的包管理器)来安装 requests 库。在命令行或终端中执行以下命令:
    pip install requests

    如果你的系统同时安装了Python 2和Python 3,可能需要使用 pip3 命令来安装Python 3的 requests 库。安装完成后,可以使用 import requests 在Python脚本中导入并使用该库。如果遇到安装问题,请确保你已经正确配置了Python的环境变量,并且pip是最新的版本。可以使用 pip install --upgrade pip 命令来升级pip。

身份验证

与 Kraken API 进行安全交互,必须通过身份验证机制。这意味着你需要提供有效的凭证来证明你被授权执行相应的 API 调用。身份验证的核心在于使用你的私钥对每个请求进行签名,以确保请求的完整性和来源可靠性。

以下 Python 代码片段展示了如何使用你的 Kraken API 密钥和私钥生成符合要求的 API 请求签名,它是安全地与 Kraken 交易所进行交互的关键步骤:

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

以下函数 get_kraken_signature 接收 API 路径、请求数据和你的私钥作为输入,并返回计算出的签名:

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()

这段代码的运作流程如下:它使用 urllib.parse.urlencode 函数将请求数据 ( data ) 编码为 URL 格式的字符串。然后,将 API 路径 ( urlpath ) 与编码后的数据连接起来,并使用 UTF-8 编码将其转换为字节串。接着,使用 SHA-256 哈希算法计算连接后的字符串的哈希值,生成消息摘要。

为了保证安全性,该函数使用你的私钥和 HMAC-SHA512 算法对消息摘要进行签名。 hmac.new 函数创建一个新的 HMAC 对象,使用 Base64 解码后的私钥作为密钥,消息摘要作为消息。 hmac.digest() 计算 HMAC 值,然后使用 Base64 编码对签名进行编码,生成最终的签名字符串,该字符串将作为请求头的一部分发送给 Kraken API。此签名确保请求未被篡改,并且确实来自拥有相应私钥的账户。正确配置并使用此签名机制是安全调用 Kraken API 的先决条件。

获取账户余额

以下代码示例展示了如何使用Python和 requests 库通过Kraken API获取您的账户余额信息。本示例代码着重于展示API调用流程,务必妥善保管您的API密钥。

import requests

# 定义Kraken API的基础URL和版本号
API_URL = "https://api.kraken.com"
API_VERSION = "0"
API_PUBLIC = API_URL + "/" + API_VERSION + "/public"
API_PRIVATE = API_URL + "/" + API_VERSION + "/private"

# 替换为您的实际API密钥和私钥
API_KEY = "YOUR_API_KEY" # 您的API公钥
API_SECRET = "YOUR_API_SECRET" # 您的API私钥

# 导入必要的库用于签名
import hashlib
import hmac
import base64

# 定义生成Kraken API签名的函数
def get_kraken_signature(url_path, data, secret):
postdata = urllib.parse.urlencode(data)
encoded = (url_path + postdata).encode()
message = hmac.new(base64.b64decode(secret), encoded, hashlib.sha512)
sigdigest = base64.b64encode(message.digest())
return sigdigest.decode()

import urllib.parse

def get_account_balance():
url_path = "/0/private/Balance"
data = {} # 请求参数,此处getBalance接口不需要参数
headers = {
"API-Key": API_KEY,
"API-Sign": get_kraken_signature(url_path, data, API_SECRET)
}
url = API_URL + url_path
response = requests.post(url, headers=headers, data=data)
response.raise_for_status() # 检查请求是否成功,若不成功抛出异常
return response.() # 返回JSON格式的响应数据

if __name__ == "__main__":
try:
balance = get_account_balance()
print(balance) # 打印账户余额信息
except requests.exceptions.HTTPError as e:
print(f"HTTP错误: {e}")
except Exception as e:
print(f"发生错误: {e}")

这段代码首先定义了Kraken API的URL、版本号以及您的API密钥和私钥。 强烈建议将您的API密钥存储在安全的环境变量中,而不是直接硬编码在脚本中。 get_account_balance() 函数构造了一个带有正确身份验证头的POST请求,并向Kraken API发送该请求。 get_kraken_signature 函数用于生成API签名,保证请求的安全性。 请务必将 YOUR_API_KEY YOUR_API_SECRET 替换为您在Kraken平台上生成的实际API密钥。该脚本包含了错误处理机制,以便在出现问题时能够提供有用的调试信息。

获取市场数据

Kraken API 提供了丰富的市场数据接口,涵盖了广泛的加密货币交易对,并提供详细的市场信息。这些数据包括但不限于:交易对的详细信息(如交易对名称、基础货币和报价货币)、实时价格更新(包括最新成交价、最高价、最低价)、24 小时交易量(反映市场活跃度)、以及其他关键的市场指标。利用这些数据,开发者和交易者可以构建各种应用,例如实时行情监控、价格预警系统、交易策略回测、以及市场趋势分析工具。

以下 Python 代码展示了如何通过 Kraken API 获取特定交易对的实时行情数据。该示例使用了 requests 库发送 HTTP 请求,并解析 API 返回的 JSON 数据。

def get_ticker_information(pair):
    url = API_PUBLIC + "/Ticker?pair=" + pair
    response = requests.get(url)
    return response.()

上述代码定义了一个名为 get_ticker_information() 的函数。该函数接受一个交易对的字符串作为参数 (例如 "XBTUSD" 代表比特币/美元交易对),然后构造一个包含交易对信息的 Kraken API 请求 URL。 requests.get(url) 函数发送一个 GET 请求到该 URL,并返回一个 response 对象。 response.() 方法解析 API 返回的 JSON 格式的数据,并将其转换为 Python 字典,便于后续处理。开发者需要预先定义 `API_PUBLIC` 常量,它代表Kraken公开API的根URL。

以下是使用 get_ticker_information() 函数的示例代码:

if __name__ == "__main__":
    ticker = get_ticker_information("XBTUSD")  # 获取比特币美元交易对的行情
    print(ticker)

这段代码首先检查脚本是否作为主程序运行。如果是,它将调用 get_ticker_information("XBTUSD") 函数来获取比特币/美元交易对的实时行情数据,并将返回的数据存储在 ticker 变量中。 print(ticker) 语句将行情数据打印到控制台。输出结果通常包含多个字段,例如 ask (卖出价)、 bid (买入价)、 last (最新成交价)、 volume (交易量) 等,这些字段提供了关于该交易对当前市场状况的详细信息。请注意,实际API返回数据的格式可能会根据Kraken API的版本更新而有所变化,建议参考Kraken API的官方文档进行解析。

下单交易

使用Kraken API可以进行买入或卖出操作,实现自动化交易策略。以下代码展示了如何通过Python脚本下单购买比特币,提供了一个基础的示例,你可以根据自身需求进行扩展。

place_order() 函数负责与Kraken API交互并提交订单请求。为了确保交易的安全性和准确性,需要正确设置API密钥、签名以及订单参数。以下是该函数的详细解释:


def place_order(pair, type, order_type, volume):
    """
    使用 Kraken API 下单购买或出售加密货币。

    Args:
        pair (str): 交易对,例如 "XBTUSD"(比特币/美元)。
        type (str): 交易类型,"buy"(买入)或 "sell"(卖出)。
        order_type (str): 订单类型,"market"(市价单)或 "limit"(限价单)。
        volume (str): 交易量,例如 "0.001" 表示 0.001 个比特币。

    Returns:
        dict: Kraken API 的响应,包含订单信息或错误信息。
    """
    url_path = "/0/private/AddOrder"
    data = {
        "pair": pair,
        "type": type,
        "ordertype": order_type,
        "volume": volume,
        "validate": "false"  # 设置为 "true" 时,只进行验证,不实际下单
    }
    headers = {
        "API-Key": API_KEY,
        "API-Sign": get_kraken_signature(url_path, data, API_SECRET)
    }
    url = API_URL + url_path
    response = requests.post(url, headers=headers, data=data)
    response.raise_for_status()  # 检查 HTTP 状态码,抛出异常如果不是 200
    return response.()

需要注意的是, get_kraken_signature() 函数用于生成API签名,保证请求的安全性。签名算法的细节可以参考Kraken API文档。确保你的API密钥和私钥安全存储,避免泄露。

下面是使用该函数的示例:


if __name__ == "__main__":
    # 以市价单购买 0.001 个比特币
    order = place_order("XBTUSD", "buy", "market", "0.001")
    print(order)

在实际下单之前,强烈建议将 validate 参数设置为 true 进行验证。这样可以模拟下单过程,检查订单参数是否正确,避免因参数错误导致交易失败或产生不必要的损失。验证模式下,API不会执行实际的交易,只会返回验证结果。

对于限价单,需要在 data 中添加 price 参数,指定期望的成交价格。例如:


data = {
    "pair": pair,
    "type": type,
    "ordertype": order_type,  # "limit"
    "price": price,
    "volume": volume,
    "validate": "false"
}

请务必仔细阅读Kraken API文档,了解各种订单类型和参数的含义,并根据实际需求进行调整。同时,注意风险管理,合理设置止损和止盈,避免过度交易。

查询订单状态

提交订单后,你可以使用API查询订单的实时状态。通过查询订单,你可以获取订单的执行情况、成交价格、成交数量等详细信息,以便更好地管理你的交易。以下代码展示了如何使用Python通过API查询特定订单的状态:

def query_orders(txid):
url_path = "/0/private/QueryOrders"
data = {
"txid": txid # 订单的交易ID,用于唯一标识要查询的订单
}
headers = {
"API-Key": API_KEY, # 你的API密钥,用于身份验证
"API-Sign": get_kraken_signature(url_path, data, API_SECRET) # 使用API密钥和私钥生成的签名,用于确保请求的安全性
}
url = API_URL + url_path # 完整的API请求URL,包括基础URL和API路径
response = requests.post(url, headers=headers, data=data) # 发送POST请求到Kraken API
return response.() # 将API响应解析为JSON格式并返回

代码解释:

  • txid : 这是要查询的订单的交易ID。每个订单在创建时都会被分配一个唯一的交易ID。
  • url_path : 这是API的端点,指定了要执行的操作,即查询订单。
  • data : 这是一个字典,包含了请求的参数,这里是 txid
  • headers : 这是一个字典,包含了请求的头部信息,包括API密钥和签名。 API-Key 用于标识你的账户, API-Sign 用于验证请求的真实性。
  • API_URL : 这是Kraken API的基础URL。
  • requests.post : 这是一个Python库函数,用于发送HTTP POST请求。
  • response.() : 这是一个Python方法,用于将API响应的JSON数据解析为Python字典。
  • get_kraken_signature() : 这是一个自定义函数,用于生成Kraken API的签名。签名算法的细节可以在Kraken的API文档中找到。
  • API_KEY : 请替换为你自己的API Key。
  • API_SECRET : 请替换为你自己的API Secret。

注意: 在实际使用中,请务必妥善保管你的API密钥和私钥,避免泄露。泄露的密钥可能导致你的账户被盗用。

假设 order['result']['txid'] 中包含交易ID

if name == "main":

if 'result' in order and 'txid' in order['result']:

transaction_id = order['result']['txid']

orderstatus = queryorders(transaction_id)

print(order_status)

else:

print("交易ID不存在")

这段代码展示了一个简化的订单查询逻辑,其中核心部分是模拟的 query_orders() 函数。该函数接收交易ID ( txid ) 作为唯一的输入参数,其目标是检索并返回与该ID相关联的订单状态信息。在实际的加密货币交易环境中, txid 通常指的是交易哈希值,它是区块链上交易的唯一标识符。交易哈希确保了每一笔交易的可追溯性和不可篡改性。

使用时,务必将示例代码中的 txid 替换为你在发起交易后所获得的真实的订单交易ID。这个ID通常由交易所或钱包应用程序在订单成功提交后提供。 请注意,实际应用场景中,获取 txid 的方式不是手动设置,而是程序自动从下单操作返回的订单结果数据中提取。订单结果通常包含各种信息,包括订单ID、交易对、下单价格、数量、交易状态等等, txid 只是其中的一项关键属性。

在真实的区块链应用中, query_orders() 函数的内部实现会涉及与区块链节点的交互。这通常需要使用区块链客户端库,例如 Web3.js (对于以太坊) 或其他相应的库。 函数会向区块链节点发送请求,查询具有特定 txid 的交易信息。区块链节点会返回包含交易详细信息的数据,例如交易状态 (已确认、待处理、失败等)、交易时间戳、涉及的账户地址等。 在处理查询结果时,需要进行错误处理,例如当交易 ID 不存在于区块链上时,需要返回相应的错误信息。

错误处理

在使用Kraken API时,可能会遇到各种错误,例如网络连接问题、服务器故障、API调用频率限制、身份验证失败以及请求数据格式错误等。为了确保程序的健壮性和可靠性,你需要进行适当的错误处理,从而优雅地处理这些潜在问题,避免程序崩溃或产生不可预测的行为。以下代码展示了如何处理API返回的错误,包括HTTP状态码检查和API错误消息解析:

import requests

API URL = "https://api.kraken.com" API VERSION = "0" API PUBLIC = API URL + "/" + API VERSION + "/public" API PRIVATE = API URL + "/" + API VERSION + "/private"

API KEY = "YOUR API KEY" # 替换为你的公钥 API SECRET = "YOUR API SECRET" # 替换为你的私钥

def get account balance(): url path = "/0/private/Balance" data = {} headers = { "API-Key": API KEY, "API-Sign": get kraken signature(url path, data, API SECRET) } url = API URL + url path try: response = requests.post(url, headers=headers, data=data) response.raise for status() # 检查HTTP状态码,如果状态码不是200,则抛出HTTPError异常。例如,400表示客户端错误,403表示权限不足,500表示服务器内部错误 _response = response.() # 将响应内容解析为JSON格式 if 'error' in _response and _response['error']: print(f"API Error: {_response['error']}") return None # 或者抛出异常,例如raise KrakenAPIError(_response['error']) return _response except requests.exceptions.RequestException as e: print(f"Request Exception: {e}") return None # 或者抛出异常,例如raise NetworkError(e) except Exception as e: print(f"An unexpected error occurred: {e}") return None # 或者抛出异常,例如 raise UnexpectedError(e)

if name == " main ": balance = get account balance()

if balance:
    print(balance)
else:
    print("无法获取账户余额。")

这段代码使用了 try...except 块来捕获 requests 库可能抛出的异常,例如网络连接错误( requests.exceptions.ConnectionError )、HTTP错误( requests.exceptions.HTTPError ,通过 response.raise_for_status() 触发)或其他未预料的异常。它还检查API返回的JSON响应中是否包含错误信息,例如 {'error': ['EGeneral:Invalid arguments', 'EAPI:Rate limit exceeded']} ,并打印错误信息。更完善的错误处理应该根据具体的错误类型采取不同的处理方式,例如,对频率限制错误进行重试,对身份验证错误提示用户检查API密钥,并记录错误日志以便于调试。

相关推荐