Kraken交易所API教程
1. 简介
Kraken 交易所提供功能强大的应用程序编程接口 (API),使开发者能够以编程方式与 Kraken 的交易平台进行交互。通过 Kraken API,开发者可以实时访问市场数据、执行各种交易操作,并构建自动化交易策略。本文档作为一份详尽的 Kraken API 教程,旨在为开发者提供一个全面的指南,帮助他们迅速掌握 Kraken API 的使用方法,并充分利用其提供的各项功能。
Kraken API 提供了多种功能,包括但不限于:获取实时市场行情(如交易对的价格、交易量)、查询账户余额、下单/取消订单、获取历史交易数据、以及订阅实时推送的市场数据更新。开发者可以利用这些功能创建自定义的交易工具、机器人,或者将 Kraken 集成到现有的交易系统中。
本教程将涵盖 Kraken API 的基本概念、认证机制、常用 API 端点的使用方法,以及一些最佳实践。我们还将提供代码示例,以便开发者能够更轻松地理解和使用 Kraken API。在使用 Kraken API 之前,建议开发者熟悉基本的 HTTP 请求和 JSON 数据格式。
2. API认证
在使用Kraken API进行任何操作之前,必须完成API认证。这是一个关键的安全步骤,确保只有授权的用户才能访问和控制其账户及交易活动。API认证的核心在于生成并妥善保管API密钥对,其中包括一个公共密钥(API Key)和一个私有密钥(API Secret)。
生成API密钥对的过程通常在Kraken平台的账户设置中进行。用户需要登录其Kraken账户,导航至API设置或安全设置,然后创建新的API密钥对。在创建过程中,用户需要仔细配置与该密钥对关联的权限。这些权限决定了该密钥对可以执行哪些操作,例如查看账户余额、下单交易、提取资金等。出于安全考虑,建议为每个应用程序或服务分配独立的API密钥对,并仅授予其所需的最低权限。例如,一个只用于读取市场数据的应用程序不应被授予交易或提款权限。
API密钥对生成后,公共密钥(API Key)将被用于标识您的请求。私有密钥(API Secret)则用于对请求进行签名,以证明请求的真实性和完整性。私有密钥必须严格保密,切勿泄露给任何第三方。一旦私有密钥泄露,您的账户可能面临安全风险,包括未经授权的交易和资金损失。建议将私有密钥存储在安全的地方,例如使用硬件钱包或加密的配置文件。
在实际使用API时,您需要将API Key包含在请求的头部或参数中。同时,您还需要使用私有密钥对请求进行签名。签名的过程涉及到使用特定的哈希算法(例如SHA-512)和加密算法(例如HMAC)对请求的内容进行加密。具体的签名算法和格式可能因不同的API端点而异,请务必参考Kraken API的官方文档。
成功完成API认证后,您就可以安全地使用Kraken API进行各种操作了。请务必定期审查和更新您的API密钥对,并密切关注Kraken的安全公告,以了解最新的安全最佳实践。
2.1 获取API密钥对
- 登录您的Kraken账户。如果您还没有账户,需要先进行注册和身份验证流程。确保您的账户已经启用双因素认证(2FA),以增加安全性。
- 导航到“安全” -> “API”。这个路径可能在Kraken用户界面的不同版本中略有差异,但通常可以在账户设置或安全设置中找到API相关的选项。
- 点击“生成新密钥”或类似的按钮。这将启动API密钥生成流程。请注意,Kraken可能会要求您再次进行身份验证,以确保是账户所有者本人在操作。
-
配置密钥权限。务必谨慎选择权限,只授予密钥必要的权限,遵循最小权限原则。过度授权的API密钥可能会增加账户风险。Kraken的API权限控制非常精细,允许您对密钥可以执行的操作进行细粒度控制。常见的权限包括:
- 查询公开信息 :允许密钥访问Kraken交易所的公开数据,例如交易对信息(交易代码、价格精度)、市场深度(买单和卖单的订单簿)、最新交易记录、以及其他公开可用的市场数据。此权限通常不需要身份验证。
- 查询账户余额 :允许密钥查询您的账户余额,包括各种加密货币和法币的持有量。此权限对于监控账户状态和自动化交易策略至关重要。
- 交易 :允许密钥执行交易操作,包括下单(市价单、限价单、止损单等)、撤单、修改订单等。请务必谨慎授予此权限,并仔细检查您的交易策略代码,以避免意外交易。
- 资金转移 :允许密钥进行加密货币的充值地址生成。
- 提现 :允许密钥发起加密货币提现操作。这是最敏感的权限之一,强烈建议仅在绝对必要时才授予,并且严格限制提现地址和额度。启用此权限前,请务必了解相关的安全风险。请务必开启提币白名单。
- 生成API密钥。系统会生成一个公钥(API Key)和一个私钥(API Secret)。 务必妥善保管私钥,切勿泄露给他人。 私钥相当于您的账户密码,泄露后可能导致资金损失。建议将私钥存储在安全的地方,例如加密的数据库或硬件钱包。同时,启用API密钥的IP地址限制,只允许特定的IP地址访问API。即使密钥泄露,未经授权的IP地址也无法使用。Kraken强烈建议定期更换API密钥,以降低安全风险。删除不再使用的旧密钥。
2.2 API密钥配置
成功生成API密钥后,至关重要的是将其安全且正确地配置到应用程序或脚本中,以便进行身份验证和授权。 不当的密钥管理可能导致未经授权的访问,威胁系统安全。
常见的配置方法包括以下几种,选择哪种方法取决于应用场景、安全需求以及开发环境:
-
环境变量:
环境变量是一种在操作系统级别定义的全局变量。将API密钥和私钥存储为环境变量的优点是,它们不会直接暴露在代码中,从而降低了泄露风险。在不同的操作系统和编程语言中,获取环境变量的方式略有不同。例如,在Python中可以使用
os.environ
来访问。环境变量通常用于生产环境,因为它们易于配置且与代码分离。但需要注意环境变量本身的安全,避免被恶意程序读取。 - 配置文件: 配置文件是包含应用程序配置信息的文本文件。常见的配置文件格式包括JSON、YAML和INI。将API密钥存储在配置文件中,可以方便地进行管理和维护。但是,需要特别注意配置文件的访问权限,确保只有授权的用户才能读取。应避免将配置文件直接提交到公共代码仓库,以防止密钥泄露。可以使用加密技术对配置文件中的密钥进行加密,进一步增强安全性。
- 密钥管理服务(KMS): 对于高安全要求的应用,建议使用专门的密钥管理服务(KMS)。KMS是一种集中式的密钥管理系统,可以安全地存储、管理和轮换API密钥。常见的KMS服务包括AWS KMS、Google Cloud KMS和Azure Key Vault。使用KMS可以极大地提高密钥的安全性,并简化密钥管理的复杂性。
- 加密存储: 如果无法使用KMS,可以考虑使用加密算法对API密钥进行加密存储。例如,可以使用AES等对称加密算法,或者RSA等非对称加密算法。加密后的密钥可以存储在数据库或者文件中。在使用密钥时,需要先解密才能使用。
无论选择哪种配置方法,都需要遵循以下最佳实践:
- 避免硬编码: 切勿将API密钥直接硬编码到代码中。这是一种极其危险的做法,一旦代码泄露,密钥也会随之泄露。
- 限制权限: 确保API密钥只具有执行必要操作的最小权限。这可以降低密钥泄露造成的损失。
- 定期轮换: 定期更换API密钥可以降低密钥被盗用的风险。许多API提供商都支持密钥轮换功能。
- 监控使用情况: 监控API密钥的使用情况,可以及时发现异常活动,例如未经授权的访问。
- 安全审计: 定期进行安全审计,检查密钥配置和管理流程是否存在漏洞。
在配置API密钥时,请务必谨慎,并采取必要的安全措施,以保护你的应用程序和数据。
3. API调用
Kraken交易所的应用程序编程接口(API)采用RESTful架构风格,允许开发者通过标准的HTTP请求与平台进行交互,从而获取市场数据、执行交易操作、管理账户信息等。这种RESTful设计使得API易于理解和使用,兼容各种编程语言和开发环境。
为保障账户安全和数据完整性,所有对Kraken API的请求都必须携带有效的API密钥和数字签名。API密钥用于身份验证,确认请求的来源;数字签名则用于验证请求的完整性,防止数据在传输过程中被篡改。密钥的生成和管理需要在Kraken账户的安全设置中进行,并妥善保管,避免泄露。
更具体地说,API密钥通常由一对字符串组成:一个公共密钥(API Key)和一个私有密钥(API Secret)。公共密钥用于标识用户,而私有密钥则用于生成请求的签名。签名的生成过程通常涉及使用私有密钥对请求参数进行哈希运算,并将生成的哈希值作为签名附加到请求中。
Kraken API提供多种端点,涵盖不同的功能。例如,有用于获取实时市场行情的端点,用于提交和取消订单的端点,以及用于查询账户余额和交易历史的端点。每个端点都有特定的请求参数和返回格式,开发者需要仔细阅读API文档,了解每个端点的使用方法和限制。
Kraken API还对请求频率进行了限制,以防止滥用和保护系统稳定。开发者需要根据API文档中的说明,合理控制请求频率,避免触发频率限制,影响API的正常使用。建议使用适当的缓存机制和错误处理机制,提高应用程序的稳定性和可靠性。
3.1 公共端点
公共端点,作为开放数据访问的门户,无需提供API密钥即可访问。这类端点专门设计用于提供非私密的、公开可用的市场数据,例如实时交易价格、交易量、以及其他聚合的市场统计信息。它们是用户获取基本市场信息的便捷途径,尤其适用于初学者、研究人员,或需要快速获取市场快照的应用。
公共端点通常提供以下类型的数据:
- 实时行情数据: 包括最新成交价(Last Traded Price, LTP)、买一价(Best Bid)、卖一价(Best Ask)、最高价(High)、最低价(Low)等。
- 交易量数据: 展示特定时间段内(如24小时)的交易总量,可以帮助用户了解市场活跃度。
- 市场深度信息: 有时也提供有限的市场深度信息,例如买卖盘的挂单量分布,但通常深度有限。
- 历史数据: 一些公共端点也会提供有限的历史数据,例如每日的开盘价、收盘价、最高价、最低价(OHLC)。
- 聚合统计数据: 例如加权平均价、成交笔数等。
由于不需要API密钥认证,公共端点使用起来非常方便,但也意味着其在访问频率上通常会受到限制,以防止滥用和保障系统稳定性。用户应当仔细阅读API文档,了解具体的频率限制和数据范围,以便合理使用公共端点资源。某些平台也可能提供更高频率限制的付费API服务,以满足专业用户的需求。
在具体使用时,开发者可以通过HTTP GET请求来访问公共端点,通常返回JSON格式的数据。例如,获取比特币/美元(BTC/USD)实时价格的请求可能如下所示:
GET /api/v1/ticker/BTCUSD HTTP/1.1
Host: example.com
返回的数据可能包含以下信息:
{
"symbol": "BTCUSD",
"lastPrice": "29500.00",
"volume": "1000",
"timestamp": "1678886400"
}
需要注意的是,不同的交易所或数据提供商的API接口和数据格式可能存在差异,因此在使用前务必仔细阅读其API文档。
3.1.1 获取交易对信息
功能描述: 此端点用于检索Kraken交易所支持的各种交易对的详细信息,包括交易对名称、精度、手续费结构以及其他相关参数。通过查询此端点,用户可以获取进行交易决策所需的关键信息。
端点:
/0/public/AssetPairs
方法:
GET
参数:
-
pair
(可选): 指定要查询的交易对名称。 如果不指定此参数,则返回所有可用的交易对信息。 交易对名称通常由两种资产的代码组成,例如XBTUSD
代表比特币/美元。 可用交易对列表可以在Kraken官方网站或其他相关文档中找到。
请求示例:
使用curl命令行工具发送请求,获取XBTUSD交易对的信息:
curl 'https://api.kraken.com/0/public/AssetPairs?pair=XBTUSD'
返回值:
服务器将返回一个JSON格式的数据对象,其中包含所请求交易对的详细信息。返回的JSON对象可能包含以下字段(具体字段取决于交易对):
-
altname
: 交易对的替代名称。 -
wsname
: 用于WebSocket订阅的名称。 -
aclass_base
: 基础资产的资产类别。 -
base
: 基础资产的代码(例如,XBT
)。 -
aclass_quote
: 报价资产的资产类别。 -
quote
: 报价资产的代码(例如,USD
)。 -
lot
: 最小交易规模的单位。 -
pair_decimals
: 交易对价格的小数位数。 -
lot_decimals
: 交易规模的小数位数。 -
lot_multiplier
: 交易规模的乘数。 -
fees
: 一个数组,包含不同交易量等级对应的交易费用率。 费用率通常以百分比表示。 -
fees_maker
: 一个数组,包含不同交易量等级对应的挂单 maker 交易费用率。 费用率通常以百分比表示。 -
fee_volume_currency
: 用于计算交易量的货币。 -
margin_call
: 保证金追缴比例。 -
margin_stop
: 强制平仓比例。 -
ordermin
: 最小订单量.
错误处理:
如果请求失败,服务器将返回一个包含错误信息的JSON对象。常见的错误包括:
-
Invalid asset pair
: 指定的交易对不存在。
3.1.2 获取市场深度(Order Book Depth)
端点:
/0/public/Depth
方法:GET
参数:
*
pair
: 交易对名称,指定要查询的市场。例如
XBTUSD
代表比特币/美元。务必使用交易所支持的交易对格式。
*
count
(可选): 返回的深度数量,控制订单簿中买单和卖单的条目数量。默认为20,表示返回最佳的20个买单和20个卖单。可以根据需求调整此参数,但需要注意交易所对最大数量的限制。过大的数量会增加数据传输量和处理时间。
示例:
curl 'https://api.kraken.com/0/public/Depth?pair=XBTUSD&count=10'
返回值:
返回JSON格式的数据,详细展示指定交易对的买单(Bid)和卖单(Ask)的价格和数量。数据结构通常包含以下信息:
- Bids (买单) : 按照价格从高到低排序的买单列表,每个买单包含价格和数量。
- Asks (卖单) : 按照价格从低到高排序的卖单列表,每个卖单包含价格和数量。
- Timestamp (时间戳) : 数据生成的时间,用于跟踪数据的时效性。
注意事项:
- 市场深度数据是动态变化的,会随着交易的进行而更新。建议根据应用场景设置合理的请求频率,避免对交易所API造成过大的压力。
- 返回的数据精度可能受到交易所的限制。
- 对于高频交易或需要实时数据的应用,可以考虑使用WebSocket等推送技术,以获得更低延迟的市场深度信息。
3.1.3 获取最新交易信息
端点:
/0/public/Trades
方法: GET
描述: 此端点用于检索指定交易对的最新交易数据。它允许用户监控市场的实时活动,包括价格波动和交易量,从而做出更明智的交易决策。
参数:
-
pair
: (必选) 交易对名称,用于指定要查询的交易市场。例如,XBTUSD
代表比特币/美元交易对。常见的交易对包括但不限于ETHUSD
,LTCEUR
等。务必使用交易所支持的有效交易对代码。 -
since
: (可选) Unix 时间戳,表示从指定时间开始返回交易信息。如果省略此参数,则返回最近的交易记录。 使用since
参数可以有效地分页或增量获取交易数据,避免一次性获取大量数据,提高效率。时间戳精度通常为秒,具体取决于交易所的实现。
请求示例:
使用 curl 命令请求 Kraken 交易所的最新 XBTUSD 交易信息,并从 Unix 时间戳 1678886400 开始获取:
curl 'https://api.kraken.com/0/public/Trades?pair=XBTUSD&since=1678886400'
返回值:
成功调用该端点后,服务器将返回 JSON 格式的数据。该数据结构包含一个交易数组,每个交易对象包含以下关键信息:
- 时间戳: 交易发生的 Unix 时间戳,通常精确到毫秒或微秒,取决于交易所的精度。
- 价格: 交易的执行价格,以交易对的计价货币表示。
- 数量: 交易的成交数量,以交易对的基础货币表示。
- 买/卖标志: 指示该交易是买入还是卖出操作。
- 交易类型: 指示交易的类型,例如限价单、市价单等。
示例 JSON 响应:
{
"error": [],
"result": {
"XBTUSD": [
[
"1678886400.123456",
"28000.00",
"0.01",
"b",
"l",
""
],
[
"1678886400.678901",
"28000.50",
"0.005",
"s",
"m",
""
]
],
"last": "1678886400.678901"
}
}
注意事项:
- 请注意,交易所有可能对请求频率进行限制(Rate Limiting)。高频率的请求可能会导致您的 IP 地址被暂时或永久屏蔽。建议合理设置请求间隔,并参考交易所的 API 文档了解具体的频率限制策略。
- 交易所返回的时间戳格式和精度可能有所不同。请务必查阅交易所的 API 文档,了解时间戳的具体格式,并根据需要进行转换。
- 交易数据是动态变化的,请注意处理数据更新和数据一致性问题。
- 不同的交易所有不同的市场深度和流动性,因此交易数据可能存在差异。
3.2 私有端点
私有端点是加密货币交易所API的重要组成部分,它们提供对用户账户和交易活动的安全访问。 与公共端点不同,访问这些端点**必须**通过API密钥认证,这是一种身份验证机制,用于验证请求的来源,并确保只有授权用户才能执行敏感操作。
私有端点通常用于以下操作:
-
账户管理:
- 查询账户余额和交易历史
- 获取存款地址
- 发起提款请求
- 修改账户设置
-
交易下单:
- 创建、修改和取消限价单、市价单和其他高级订单类型
- 查询订单状态
- 获取历史成交记录
- 批量下单
-
获取实时数据:
- 订阅私有账户的实时数据流,如余额变化、订单更新等。
API密钥通常由一对密钥组成:一个API密钥(公钥)和一个API密钥Secret(私钥)。 API密钥用于标识用户,而API密钥Secret用于签署请求,以确保请求的完整性和真实性。 强烈建议采取安全措施来保护您的API密钥Secret,例如将其存储在安全的环境变量中,并且避免在客户端代码中暴露它。
在使用私有端点时,务必仔细阅读交易所的API文档,了解每个端点的具体参数、请求方法和响应格式。 正确使用API密钥和遵循安全最佳实践对于保护您的账户安全至关重要。
3.2.1 获取账户余额
功能描述: 此端点用于查询用户在交易所账户中的可用余额,余额以各种加密货币和法定货币的形式显示。这是交易前检查账户资金状况的关键步骤。
端点:
/0/private/Balance
方法: POST。出于安全考虑,获取账户余额等敏感操作应使用 POST 方法,防止信息泄露。
参数: 无。 该端点不需要额外的请求参数,仅依赖于签名进行身份验证。
签名: 需要对请求进行签名。Kraken API 要求所有私有端点都必须进行签名认证,以确保请求的合法性和安全性。签名过程涉及使用API密钥、私钥以及请求数据生成唯一的签名。
详细签名流程说明:
- 生成Nonce: Nonce(Number used once)是一个唯一的、时间相关的数值,用于防止重放攻击。通常使用当前时间戳(毫秒级)来生成。
- 构建Post Data字符串: 将请求的POST数据进行URL编码。
- 组合签名消息: 将Nonce和编码后的POST数据组合成一个字符串,并使用SHA256算法进行哈希处理。
- 生成HMAC签名: 使用API私钥对包含端点路径和哈希结果的消息进行HMAC-SHA512签名。
- Base64编码: 将HMAC签名进行Base64编码,得到最终的API签名。
示例:
以下Python代码示例演示了如何使用 Kraken API 获取账户余额, 务必替换
YOUR_API_KEY
和
YOUR_API_SECRET
为您实际的 API 密钥和私钥。
import hashlib
import hmac
import base64
import time
import urllib.parse
import requests
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
api_url = "https://api.kraken.com"
def get_kraken_signature(urlpath, data, secret):
post_data = urllib.parse.urlencode(data)
encoded = (str(data['nonce']).encode() + post_data.encode())
message = urlpath.encode() + hashlib.sha256(encoded).digest()
mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())
return sigdigest.decode()
def kraken_request(uri_path, data, api_key, api_sec):
headers = {
"API-Key": api_key,
"API-Sign": get_kraken_signature(uri_path, data, api_sec)
}
url = api_url + uri_path
response = requests.post(url, headers=headers, data=data)
return response
nonce = str(int(time.time() * 1000))
data = {
"nonce": nonce
}
resp = kraken_request("/0/private/Balance", data, api_key, api_secret)
print(resp.())
代码解释:
-
get_kraken_signature
函数:用于生成 Kraken API 请求所需的签名。它接收 URL 路径、请求数据和 API 私钥作为输入,并返回计算出的签名。 -
kraken_request
函数:封装了发送 API 请求的逻辑。它接收 URI 路径、请求数据、API 密钥和 API 私钥作为输入,并返回 API 响应。 请求头中包含了 API 密钥和生成的签名。 -
nonce
变量: 存储一个唯一的 nonce 值,用于防止重放攻击。 -
主程序:设置 API 密钥、私钥和 URL,创建一个包含 nonce 的数据字典,然后调用
kraken_request
函数发送请求,并打印响应的 JSON 内容。
请求示例:
以下展示了使用 curl 命令发送的请求示例。 实际使用时,请替换
YOUR_API_KEY
,
YOUR_API_SECRET
和
YOUR_NONCE
为您实际的值。
curl -X POST \
'https://api.kraken.com/0/private/Balance' \
-H 'API-Key: YOUR_API_KEY' \
-H 'API-Sign: YOUR_SIGNATURE' \
-d 'nonce=YOUR_NONCE'
返回值:
返回JSON格式的数据,包含账户余额信息。JSON 响应会显示各种货币的余额,包括加密货币(如 BTC、ETH)和法定货币(如 USD、EUR)。
返回值示例:
{
"error": [],
"result": {
"XXBT": "1.2345678900",
"ZUSD": "1234.56789012",
"XETH": "0.5000000000"
}
}
返回值字段解释:
-
error
: 一个数组,包含任何发生的错误信息。如果请求成功,则该数组为空。 -
result
: 一个对象,包含了账户余额信息。- 键:代表不同的货币代码,例如 "XXBT" 代表比特币,"ZUSD" 代表美元。
- 值:代表该货币的可用余额。
3.2.2 下单
端点:
/0/private/AddOrder
方法:
POST
参数:
-
pair
:交易对名称,指定要交易的资产对,例如XBTUSD
(比特币/美元)。支持的交易对可以在Kraken API文档中找到。 -
type
:订单类型,指示买入或卖出,可选值为buy
或sell
。buy
表示买入指定交易对的基础资产,sell
表示卖出。 -
ordertype
:订单方式,定义订单执行的方式,例如market
(市价单)、limit
(限价单)、stop-loss
(止损单)、stop-loss-limit
(止损限价单)、take-profit
(止盈单)、take-profit-limit
(止盈限价单)、settle-position
(平仓)。 -
volume
:订单数量,表示要买入或卖出的基础资产的数量。数量必须为正数,并且符合交易对的最小交易单位和数量精度要求。 -
price
(可选):订单价格,仅在limit
、stop-loss-limit
和take-profit-limit
订单时需要。limit
订单指定期望的买入或卖出价格。stop-loss-limit
订单指定触发止损的价格和实际执行的价格。take-profit-limit
指定触发止盈的价格和实际执行的价格。 -
leverage
(可选):杠杆倍数,用于放大交易规模。仅在保证金交易中可用。例如,leverage=2
表示使用2倍杠杆。请谨慎使用杠杆,因为它会放大潜在收益和损失。 -
starttm
(可选): 订单生效的开始时间。 -
expiretm
(可选): 订单过期时间,超过这个时间订单会被取消。 -
close
(可选): 平仓订单的附加参数, 包含ordertype
,price
,volume
。用于简化平仓操作。
签名: 需要对请求进行签名,以验证请求的真实性和完整性。签名过程涉及使用您的私钥对请求参数进行加密哈希。
示例:
import hashlib import hmac import base64 import time import urllib.parse import requests 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 请求签名。 Args: urlpath (str): API 端点路径。 data (dict): 请求数据。 secret (str): API 私钥。 Returns: str: 生成的签名。 """ post data = urllib.parse.urlencode(data) encoded = (str(data['nonce']).encode() + post data.encode()) message = urlpath.encode() + hashlib.sha256(encoded).digest() mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512) sigdigest = base64.b64encode(mac.digest()) return sigdigest.decode() def kraken request(uri path, data, api key, api sec): """ 发送 Kraken API 请求。 Args: uri_path (str): API 端点路径。 data (dict): 请求数据。 api_key (str): API 密钥。 api_sec (str): API 私钥。 Returns: requests.Response: API 响应。 """ headers = { "API-Key": api key, "API-Sign": get kraken_signature(uri_path, data, api_sec) } url = api_url + uri_path response = requests.post(url, headers=headers, data=data) return response nonce = str(int(time.time() * 1000)) data = { "nonce": nonce, "pair": "XBTUSD", "type": "buy", "ordertype": "market", "volume": "0.001" } resp = kraken request("/0/private/AddOrder", data, api key, api_secret) print(resp.())
返回值:
返回JSON格式的数据,包含订单ID (
txid
)、订单描述 (
descr
) 和其他相关信息。如果订单提交成功,
result
字段将包含订单的相关信息。如果出现错误,
error
字段将包含错误代码和描述。请务必检查
error
字段以确保订单已成功提交。
3.2.3 取消订单
取消订单接口允许用户撤销尚未成交的订单。务必谨慎操作,避免不必要的交易风险。
端点:
/0/private/CancelOrder
方法:POST
参数:
-
txid
: 订单ID。这是您要取消的订单的唯一标识符。请确保提供的 ID 正确无误。
签名:为了安全起见,所有私有 API 请求都需要进行签名验证。签名过程涉及使用您的 API 密钥和私钥对请求数据进行加密处理,以确保请求的真实性和完整性。
以下 Python 示例展示了如何使用 Kraken API 密钥和私钥生成签名,并发送取消订单请求。请注意,您需要替换示例中的
YOUR_API_KEY
和
YOUR_API_SECRET
为您自己的真实密钥。
txid
也需要替换成需要取消的订单 ID。
请仔细阅读 Kraken 官方 API 文档,了解最新的签名算法和安全最佳实践。
示例:
python
import hashlib
import hmac
import base64
import time
import urllib.parse
import requests
api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
api_url = "https://api.kraken.com"
def get_kraken_signature(urlpath, data, secret):
post_data = urllib.parse.urlencode(data)
encoded = (str(data['nonce']).encode() + post_data.encode())
message = urlpath.encode() + hashlib.sha256(encoded).digest()
mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())
return sigdigest.decode()
def kraken_request(uri_path, data, api_key, api_sec):
headers = {
"API-Key": api_key,
"API-Sign": get_kraken_signature(uri_path, data, api_sec)
}
url = api_url + uri_path
response = requests.post(url, headers=headers, data=data)
return response
nonce = str(int(time.time() * 1000))
data = {
"nonce": nonce,
"txid": "O7F6HV-N25G6-7G74XG"
}
resp = kraken_request("/0/private/CancelOrder", data, api_key, api_secret)
print(resp.())
此示例代码使用了
hashlib
、
hmac
、
base64
、
time
、
urllib.parse
和
requests
库。确保您的环境中已安装这些库。
nonce
参数用于防止重放攻击,应该是一个单调递增的整数。建议使用当前时间戳乘以 1000。
get_kraken_signature
函数负责生成请求签名。它使用您的私钥对请求数据进行哈希处理,并将结果进行 base64 编码。
返回值:
成功取消订单后,API 将返回一个 JSON 对象,其中包含有关取消操作状态的信息。常见的返回值包括:
-
error
: 包含错误信息的数组。如果请求成功,此数组应为空。 -
result
: 包含操作结果的对象。对于取消订单请求,它可能包含有关已取消订单的信息。例如:{"count":1}
表示成功取消了一个订单。
请务必检查
error
数组,以确保请求已成功处理。如果出现错误,请根据错误信息进行调试。
4. 签名生成
Kraken API采用HMAC-SHA512算法来确保请求的安全性与完整性。签名是基于您的API密钥、私钥以及请求参数生成的唯一字符串,用于验证请求的来源和内容,防止篡改和伪造。签名机制是API安全的关键组成部分。
以下是使用Python演示如何生成Kraken API签名的一个示例。此示例展示了生成签名所涉及的关键步骤,包括构建请求数据、计算哈希值以及使用您的私钥进行签名。请注意,您需要安装相应的Python库,如
hashlib
,
hmac
,
base64
, 和
urllib.parse
。
import hashlib
import hmac
import base64
import urllib.parse
def get_kraken_signature(urlpath, data, secret):
"""
生成 Kraken API 请求的 HMAC-SHA512 签名。
参数:
urlpath (str): API 端点路径 (例如: '/0/private/AddOrder').
data (dict): 请求数据字典 (包括 nonce).
secret (str): 您的 Kraken API 私钥 (base64 编码).
返回:
str: base64 编码的 HMAC-SHA512 签名.
"""
post_data = urllib.parse.urlencode(data) # 将请求数据编码为 URL 格式的字符串。
encoded = (str(data['nonce']).encode() + post_data.encode()) #将nonce和 postdata 连接后编码。
message = urlpath.encode() + hashlib.sha256(encoded).digest() #使用 sha256 计算编码后数据的哈希值,并将其附加到 API 路径.
mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512) # 使用 HMAC-SHA512 算法,使用私钥对消息进行签名
sigdigest = base64.b64encode(mac.digest()) #将签名结果进行 Base64 编码.
return sigdigest.decode() # 返回字符串格式的签名.
重要说明:
-
替换示例代码中的
urlpath
,data
, 和secret
为您实际的API端点路径、请求数据和私钥。 -
nonce
(现时标志) 是一个唯一的递增数字或时间戳,用于防止重放攻击。每次 API 调用都必须使用一个新的 nonce 值。 - 您的 Kraken API 私钥必须以 Base64 编码的形式提供。
- 确保您的私钥安全存储,不要将其暴露给未经授权的方。
5. 错误处理
Kraken API 通过 JSON 格式返回详细的错误信息,以便开发者能够有效地诊断和处理问题。每个API请求的响应都应仔细检查其中的
error
字段。如果
error
字段包含数据,则表明请求未能成功执行,其中包含了错误代码和相应的描述信息。开发者应该根据这些信息采取适当的措施来解决问题。
以下列出了一些常见的错误代码及其含义,开发者可以参考这些信息来诊断和解决API调用中遇到的问题:
-
EAPI:Invalid key
: 此错误表示提供的 API 密钥无效。这可能是由于密钥不正确、已被撤销或未激活。开发者应确保使用正确的 API 密钥,并验证其状态是否有效。 -
EOrder:Insufficient funds
: 当账户余额不足以满足交易所需的资金时,会返回此错误。这可能是由于账户中的可用余额低于订单所需的金额,或者存在未结算的交易占用了部分资金。开发者应检查账户余额,确保有足够的资金来执行订单。 -
EOrder:Order minimum not met
: 此错误表明尝试提交的订单数量低于 Kraken 交易所规定的最小交易数量。每个交易对都有其最小交易量限制,开发者应确保订单数量符合该要求。具体的最小交易量可以在 Kraken 的 API 文档或交易平台上找到。 -
EGeneral:Invalid arguments
: 此错误表示请求中包含无效的参数。这可能是由于参数格式不正确、参数值超出范围或缺少必需的参数。开发者应仔细检查请求参数,并确保它们符合 API 文档中规定的格式和要求。
除了以上列出的错误,Kraken API 还会返回其他错误代码,开发者应仔细阅读 API 文档,了解所有可能的错误类型及其对应的解决方案。通过有效地处理错误信息,开发者可以构建更加健壮和可靠的应用程序,并提供更好的用户体验。
6. 速率限制
Kraken API实施了速率限制机制,旨在保护服务器资源,确保API服务的稳定性和公平性。速率限制是指对每个API密钥在特定时间窗口内允许发送的请求数量进行约束。超出速率限制会导致API请求被拒绝,返回错误代码,影响应用程序的正常功能。开发者必须深入理解并严格遵守Kraken API的速率限制策略,才能构建健壮可靠的应用程序。
开发者应充分了解Kraken API的具体速率限制规则,这些规则通常在Kraken API官方文档中详细说明。速率限制可能基于不同的API端点、请求方法(如GET、POST)、用户等级或其他因素而有所不同。理解这些差异至关重要,以便根据实际需求进行合理的请求规划。开发者应密切关注API文档的更新,因为速率限制规则可能会随着API版本的升级而发生变化。
为了避免触发速率限制,开发者需要对API请求的频率进行精细控制。一种常用的方法是实现请求队列,将API请求放入队列中,并以受控的速率从队列中取出请求并发送。还可以使用指数退避算法,在收到速率限制错误时,逐渐增加请求之间的间隔时间,直到成功发送请求。缓存API响应也是一种有效的策略,可以减少对API的重复请求,降低触发速率限制的风险。 监控API请求的响应状态码和错误信息,可以帮助开发者及时发现速率限制问题,并采取相应的措施。