如何通过API在Coinbase Pro 进行交易
Coinbase Pro 提供了一套强大的 API,允许开发者以编程方式进行交易、获取市场数据和管理账户。本文将详细介绍如何使用 Coinbase Pro API 进行交易,包括必要的设置、身份验证、API 端点以及示例代码。
准备工作
在开始之前,你需要准备以下事项,确保能够顺利地与Coinbase Pro API进行交互:
- Coinbase Pro 账户: 如果你尚未拥有Coinbase Pro账户,请务必访问Coinbase Pro官方网站( https://pro.coinbase.com/ )进行注册。一个经过身份验证的Coinbase Pro账户是使用其API的前提。你需要完成KYC(了解你的客户)流程,确保账户具备交易和API访问权限。
- API 密钥: 为了通过程序访问Coinbase Pro API,你需要生成API密钥。API密钥包括API Key、Secret Key 和Passphrase三个部分。请务必妥善保管这些密钥,避免泄露,因为它们拥有访问你账户的权限。在Coinbase Pro的账户设置中,找到API选项并创建新的API密钥。请注意,你可以设置API密钥的权限,例如仅允许读取数据或允许进行交易操作。 强烈建议你只授予API密钥所需的最低权限,以降低安全风险。
- 编程环境: 选择你最熟悉的编程语言,用于编写与Coinbase Pro API交互的代码。常用的选择包括Python、JavaScript (Node.js 或浏览器环境) 或 Java。安装相应的开发工具包 (SDK) 和依赖项,以便更轻松地进行开发。 例如,如果你选择Python,你需要安装Python解释器和pip包管理器。
-
HTTP 客户端:
你需要一个HTTP客户端库来发送HTTP请求到Coinbase Pro API。 Python中,广泛使用的
requests
库提供了简单易用的API。在JavaScript中,可以使用axios
库或内置的fetch
API。Java中,可以使用HttpClient
或OkHttp
等库。确保选择的HTTP客户端支持HTTPS协议,因为Coinbase Pro API强制使用HTTPS进行安全通信。 使用HTTP客户端,你可以构造并发送GET、POST、PUT、DELETE等类型的HTTP请求,并处理API返回的JSON格式的响应数据。
获取 Coinbase Pro API 密钥
- 登录你的 Coinbase Pro 账户。 访问 Coinbase Pro 官方网站,使用你的用户名和密码进行安全登录。确保已启用双重验证,以增强账户安全性。
- 导航到 API 设置页面。 登录后,在账户设置中查找 API 管理相关选项。这通常位于用户设置、安全设置或 API 设置等部分。Coinbase Pro 可能会更新界面,因此请仔细查找包含“API”字样的链接或选项。
- 创建新的 API 密钥。 点击“创建 API 密钥”或类似的按钮。在创建过程中,系统将提示你为该密钥设置权限。选择合适的权限至关重要,因为它决定了该密钥可以执行的操作。
-
配置 API 密钥权限。
Coinbase Pro 提供了多种 API 权限,包括查看账户余额、交易下单、访问历史数据等。对于需要进行交易操作的应用程序,必须选择
trade
权限。根据你的具体需求,可能还需要选择其他权限,例如read
(读取账户信息)或withdraw
(提现资金),但请谨慎授予withdraw
权限,并确保采取额外的安全措施。 - 安全地保存你的 API 密钥、Secret 和 Passphrase。 创建 API 密钥后,Coinbase Pro 将生成 API 密钥(Key)、密钥(Secret)和密码(Passphrase)。这些凭据是访问 Coinbase Pro API 的关键。 请务必将它们安全地存储在离线环境中,例如加密的密码管理器或硬件钱包中。Secret 密钥只会显示一次,一旦离开页面,你将无法再次查看。如果遗失,你必须删除该 API 密钥并创建一个新的密钥。 Passphrase 是一个额外的安全层,用于进一步保护你的 API 密钥。切勿将这些凭据泄露给他人,也不要将它们存储在不安全的地方,例如电子邮件、文本文件或云存储服务(除非经过充分加密)。
身份验证
Coinbase Pro API 采用签名请求机制进行身份验证,保证了交易的安全性和完整性。 为进行身份验证,需要使用 API 密钥、Secret 和 Passphrase 生成一个 HMAC(Keyed-Hashing for Message Authentication)签名,并将此签名包含在每个发送到 Coinbase Pro API 的 HTTP 请求标头中。
生成签名的过程涉及多个步骤,这些步骤确保了只有拥有正确密钥的人才能成功与 API 交互。 请务必妥善保管您的 API 密钥、Secret 和 Passphrase,防止泄露。
-
构造 Prehash 字符串:
Prehash 字符串是构建 HMAC 签名的基础,它将多个关键信息组合在一起。 按照以下顺序连接字符串:
- 请求时间戳(Unix 时间戳): 自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来经过的秒数。精确到秒的时间戳至关重要,因为它有助于防止重放攻击。
-
请求方法:
HTTP 请求方法,例如
GET
、POST
、PUT
或DELETE
。 方法必须以大写形式指定。 -
请求路径:
API 端点的路径,不包含域名。 例如,
/accounts
用于获取账户信息,/orders
用于管理订单。 - 请求正文: 如果请求包含正文(例如,POST 或 PUT 请求),则包含请求正文的内容。 如果请求没有正文(例如,GET 或 DELETE 请求),则使用空字符串。
- 计算 HMAC 签名: 使用你的 Secret 作为密钥,对 Prehash 字符串进行 HMAC-SHA256 哈希计算。 HMAC-SHA256 算法是一种加密哈希函数,它可以生成一个固定大小的哈希值,用于验证消息的完整性和真实性。
- Base64 编码签名: 将 HMAC 签名进行 Base64 编码。 Base64 是一种将二进制数据转换为 ASCII 字符串的编码方案。 这种编码是必要的,因为 HTTP 标头只能包含 ASCII 字符。
-
添加 API 标头:
将以下标头添加到你的 API 请求中。 这些标头是 Coinbase Pro API 用来验证请求身份的关键信息:
-
CB-ACCESS-KEY
: 你的 API 密钥,用于标识你的账户。 -
CB-ACCESS-SIGN
: Base64 编码的 HMAC 签名,用于验证请求的完整性和真实性。 -
CB-ACCESS-TIMESTAMP
: 请求时间戳,必须与生成签名时使用的时间戳相同。 -
CB-ACCESS-PASSPHRASE
: 你的 Passphrase,作为额外的安全层。 -
Content-Type
:application/
对于 POST 和 PUT 请求,指示请求正文的 MIME 类型。
-
以下是一个 Python 示例,展示如何生成签名:
import time
import hmac
import hashlib
import base64
import requests
api_key = 'YOUR_API_KEY'
api_secret = 'YOUR_API_SECRET'
api_passphrase = 'YOUR_API_PASSPHRASE'
api_url = 'https://api.pro.coinbase.com'
def generate_signature(timestamp, method, request_path, body=''):
message = str(timestamp) + method + request_path + body
hmac_key = base64.b64decode(api_secret)
signature = hmac.new(hmac_key, message.encode('utf-8'), hashlib.sha256)
signature_b64 = base64.b64encode(signature.digest()).decode('utf-8')
return signature_b64
def make_request(method, path, body=None):
timestamp = str(int(time.time()))
signature = generate_signature(timestamp, method, path, body if body else '')
headers = {
'CB-ACCESS-KEY': api_key,
'CB-ACCESS-SIGN': signature,
'CB-ACCESS-TIMESTAMP': timestamp,
'CB-ACCESS-PASSPHRASE': api_passphrase,
'Content-Type': 'application/'
}
try:
if method == 'GET':
response = requests.get(api_url + path, headers=headers)
elif method == 'POST':
response = requests.post(api_url + path, headers=headers, data=body)
elif method == 'DELETE':
response = requests.delete(api_url + path, headers=headers)
else:
raise ValueError('Invalid method')
response.raise_for_status() # 抛出 HTTPError,以处理错误
return response.()
except requests.exceptions.RequestException as e:
print(f"API 请求失败: {e}")
return None
常用 API 端点
以下是一些常用的 Coinbase Pro API 端点,涵盖了账户管理、市场数据获取和订单执行等关键功能:
-
获取账户信息:
GET /accounts
- 获取所有已认证用户的账户信息,包括账户ID、币种类型、可用余额、持有余额和账户状态。此端点返回一个数组,每个元素代表一个账户。 -
获取账户余额:
GET /accounts/
- 获取特定账户的详细余额信息。 -
获取市场行情:
GET /products
- 获取Coinbase Pro上所有可交易交易对的市场行情数据。每个交易对的信息包括交易对ID、基础货币、报价货币、交易规模增量和当前交易状态。 -
获取特定交易对行情:
GET /products/
- 获取特定交易对的实时行情快照。/ticker -
下单:
POST /orders
- 创建新的买入或卖出订单。请求体需要包含订单类型(市价单或限价单)、交易对ID、买卖方向、订单数量和价格(如果为限价单)。成功下单后,API将返回订单ID和其他相关信息。注意,下单需要进行身份验证和权限验证。 -
取消订单:
DELETE /orders/
- 取消指定的未成交订单。 -
获取订单信息:
GET /orders/
- 获取指定订单的详细信息,包括订单状态、订单类型、交易对ID、下单时间、成交数量和平均成交价格等。 -
获取所有订单:
GET /orders
- 获取所有未完成(未成交或部分成交)的订单列表。可以通过参数筛选特定交易对的订单。返回信息包括订单ID、交易对ID、订单状态和下单时间等。分页参数可用于获取大量订单。 -
获取历史订单:
GET /fills
- 获取历史成交记录,即已完成的订单信息。 可以通过参数筛选特定交易对和时间范围内的成交记录。返回信息包括成交价格、成交数量、手续费和成交时间等。 此端点对于分析交易历史和计算盈利至关重要.
下单示例
以下是一个 Python 示例,展示如何通过 API 提交一个市价买单。 市价单将以当前市场上最优的价格立即执行,无需指定价格。
要执行此操作,需要指定交易对(例如 BTC-USD),并确定希望购买的加密货币数量(以其原生单位表示)。 以下代码片段说明了如何设置必要的参数。
product_id = 'BTC-USD' # 指定交易对为比特币/美元
size = '0.001' # 买入 0.001 个 BTC
现在,创建一个包含订单详细信息的 Python 字典。 订单类型设置为 'market' 以表明这是一个市价单。 'side' 设置为 'buy' 表示购买操作。'product_id' 指定交易对,'size' 表示购买的数量。
order_data = {
'size': size, # 订单数量,单位为 BTC
'type': 'market', # 订单类型为市价单
'side': 'buy', # 订单方向为买入
'product_id': product_id # 交易对为 BTC-USD
}
接下来,使用
make_request
函数(假设已定义)向交易平台的 API 发送 POST 请求,将订单数据传递给
/orders
端点。 此函数应处理身份验证和 API 请求的构造。
response = make_request('POST', '/orders', order_data)
处理 API 响应以确定订单是否成功提交。 如果
response
对象存在(表明请求成功),则提取并打印订单 ID。 否则,指示订单提交失败。
if response:
print(f"订单已提交,订单 ID: {response['id']}") # 打印订单 ID
else:
print("订单提交失败") # 打印错误信息
请注意,实际的
make_request
函数实现将取决于您使用的特定交易平台 API 及其身份验证要求。 确保正确处理 API 密钥、签名和错误处理。
重要提示:
- 沙盒环境测试: 在实际交易中使用 Coinbase Pro API 之前,务必在 Coinbase Pro 的沙盒环境中进行充分测试。沙盒环境允许你模拟交易,验证你的代码逻辑,并在不承担真实资金风险的情况下调试问题。确保你的应用程序能够正确处理各种场景,例如订单创建、取消、查询等。
- 详尽阅读 API 文档: 仔细阅读 Coinbase Pro API 文档,全面了解所有可用的端点、参数和错误代码。理解每个端点的功能,包括请求方法 (GET, POST, DELETE)、请求参数(例如订单大小、价格、交易对)以及响应数据的格式。熟悉常见的错误代码及其含义,有助于你快速诊断和解决问题。
- API 密钥安全管理: 妥善管理你的 API 密钥和 Secret,切勿泄露给任何未经授权的人员。API 密钥是访问你的 Coinbase Pro 账户的凭证,泄露可能导致资金损失。建议使用安全的存储方法(例如加密的配置文件、硬件安全模块)来保存 API 密钥,并定期轮换密钥。
- 交易规则与费用结构: 详细了解 Coinbase Pro 的交易规则和费用结构。不同的交易对可能具有不同的交易规则,例如最小订单大小、价格精度等。理解费用结构,包括挂单 (maker) 和吃单 (taker) 费率,以及可能的额外费用(例如提现费用),有助于你优化交易策略并降低交易成本。
- 健壮的错误处理: 使用适当的错误处理机制来处理 API 请求失败的情况。API 请求可能因为网络问题、服务器错误、请求参数错误等原因而失败。你的应用程序应能够捕获这些错误,并采取相应的措施,例如重试请求、记录错误日志、通知用户。
- 谨慎的交易策略: 考虑到加密货币市场的波动性,谨慎设置你的交易策略。避免使用激进的交易策略,例如高杠杆交易,除非你完全理解其中的风险。根据市场情况和你的风险承受能力,制定合理的止损和止盈策略。
- 风险管理与资金控制: 进行严格的风险管理,不要投入你无法承受损失的资金。加密货币市场风险较高,价格波动剧烈。只使用你愿意承担损失的资金进行交易,并定期评估你的投资组合。
- 定期审查与更新: 定期审查你的 API 使用情况,并更新你的 API 密钥。监控你的 API 调用频率,避免超出 API 限制。定期轮换 API 密钥,降低密钥泄露的风险。同时,关注 Coinbase Pro API 的更新和变更,及时调整你的应用程序。
获取账户信息示例
以下是一个 Python 示例,展示如何通过 API 获取用户的加密货币账户信息。该示例使用常见的编程模式,并展示了如何处理 API 响应以提取关键数据。
示例代码假定你已经定义了一个名为
make_request
的函数,该函数负责向 API 发送 HTTP 请求。该函数接受 HTTP 方法(例如 "GET")和 API 路径(例如 "/accounts")作为参数,并返回 API 的响应数据。 你可以使用如requests等Python库实现此功能。
response = make_request('GET', '/accounts')
此行代码调用
make_request
函数,使用 GET 方法请求
/accounts
路径。这将从服务器检索与用户账户相关的详细信息。
/accounts
API 端点通常返回一个 JSON 数组,其中每个元素代表一个账户。
if response:
在收到 API 响应后,此条件语句检查响应是否成功。如果
response
对象存在(即,API 请求成功并且返回了数据),则执行
if
块中的代码。
for account in response:
此循环迭代
response
数组中的每个账户。对于数组中的每个账户对象,循环体内的代码都会执行一次。
print(f"账户 ID: {account['id']}, 币种: {account['currency']}, 可用余额: {account['available']}")
此行代码使用 f-string 格式化字符串并打印账户信息。它从每个账户对象中提取三个属性:
id
(账户的唯一标识符),
currency
(账户中持有的加密货币的类型,例如 BTC 或 ETH), 以及
available
(账户中可用的余额)。这些值被插入到字符串中,生成一条易于阅读的消息,显示每个账户的详细信息。
available
余额通常表示可以立即用于交易或提现的金额。
else:
如果 API 请求失败或未返回任何数据,则执行
else
块中的代码。
print("获取账户信息失败")
此行代码打印一条错误消息,指示获取账户信息失败。这可能由于多种原因导致,例如网络连接问题、API 服务器错误、身份验证失败或权限不足。在实际应用中,应使用更详细的错误处理来识别和解决问题。
取消订单示例
以下是一个 Python 示例,展示如何通过 API 取消指定 ID 的订单。请务必谨慎操作,取消后订单将无法恢复。
order_id = 'YOUR_ORDER_ID' # 替换为你要取消的订单 ID
该行代码定义了一个名为
order_id
的变量,并将其赋值为字符串
'YOUR_ORDER_ID'
。 你需要将
'YOUR_ORDER_ID'
替换为实际要取消订单的唯一标识符。订单 ID 通常由交易所或交易平台提供。
response = make_request('DELETE', f'/orders/{order_id}')
这行代码使用
make_request
函数向 API 发送一个 DELETE 请求,以取消订单。
'DELETE'
指定了 HTTP 请求方法。
f'/orders/{order_id}'
构造了 API 端点,其中
{order_id}
将被替换为上面定义的订单 ID。
make_request
函数负责处理与 API 的通信,包括身份验证、请求构建和错误处理。此函数是示例代码中假定的函数,你需要根据你所使用的交易所 API 文档实现该函数。它应当处理例如 API 密钥的验证,构建正确的请求头等。
if response == None: # DELETE 请求成功返回空字符串, requests.delete 已经处理了
print(f"订单 {order_id} 已取消")
else:
print(f"取消订单 {order_id} 失败")
这段代码检查 API 请求的响应。如果
response
为
None
,则表示 DELETE 请求成功,并打印一条消息表明订单已取消。 如果
response
不为
None
, 则表示取消订单失败,并打印一条错误消息。之所以判断`None`是因为某些http库,例如`requests.delete`, 在成功时会返回`None`,并且已经处理了异常情况。 如果你使用的库不同,这里的成功/失败判断逻辑可能需要调整。 实际应用中,应该根据API返回的状态码(例如,200 OK, 204 No Content, 400 Bad Request, 404 Not Found)来更精确地判断订单取消是否成功。可以考虑添加更详细的错误处理,例如记录错误日志或向用户显示更具体的错误信息。
错误处理
Coinbase Pro API 在交互过程中会返回各种错误代码,这些代码对于诊断和解决问题至关重要。理解这些错误代码及其含义,能帮助开发者快速定位并修复程序中的问题,从而保证交易的顺利进行。常见的错误代码及其详细解释如下:
-
400 Bad Request
: 此错误表示客户端发送的请求格式不符合 API 的要求。这通常意味着请求体中的 JSON 数据格式不正确,或者缺少必要的参数。开发者应该仔细检查请求体的内容,确保其符合 API 文档中规定的格式要求。例如,检查字段名称是否正确,数据类型是否匹配,以及是否缺少必填字段。 -
401 Unauthorized
: 此错误表明客户端未能通过身份验证。这通常是由于提供的 API 密钥、Secret 密钥或 Passphrase 不正确导致的。请务必仔细检查这些凭据是否正确配置,并确保它们与你在 Coinbase Pro 账户中生成的凭据完全一致。同时,也要注意避免在代码中硬编码这些敏感信息,而应该使用环境变量或其他安全的方式进行管理。 -
403 Forbidden
: 此错误表示客户端没有足够的权限访问所请求的资源。即使你的 API 密钥是有效的,它可能也不具备执行特定操作的权限。在创建 API 密钥时,请确保已授予其所需的权限。例如,如果你想交易,你需要拥有交易权限;如果你想查看账户信息,你需要拥有查看账户信息的权限。 -
404 Not Found
: 此错误表示请求的资源不存在。这通常是由于 API 端点 URL 不正确造成的。请仔细检查你使用的 API 端点 URL 是否正确,并确保它是 Coinbase Pro API 提供的有效端点。还要注意 API 端点的大小写是否正确,因为 API 端点通常是区分大小写的。 -
429 Too Many Requests
: 此错误表示客户端在短时间内发送了过多的请求,超过了 Coinbase Pro API 的速率限制。为了维护 API 的稳定性和可用性,Coinbase Pro 会对每个 API 密钥设置速率限制。开发者应该遵循这些速率限制,避免过度请求。可以使用指数退避(Exponential Backoff)等技术来处理此错误,即在收到此错误后,等待一段时间再重试,并逐渐增加等待时间。 -
500 Internal Server Error
: 此错误表示 Coinbase Pro 服务器内部发生了错误。这通常不是客户端的问题,而是 Coinbase Pro 方面的问题。如果遇到此错误,可以稍后重试。如果错误持续发生,请联系 Coinbase Pro 的技术支持。
为了提高应用程序的健壮性和可靠性,开发者应该在代码中加入完善的错误处理机制。这包括捕获 API 返回的错误代码,并根据不同的错误代码采取相应的处理措施。例如,如果收到
429 Too Many Requests
错误,可以暂停发送请求,并在一段时间后重试。如果收到
500 Internal Server Error
错误,可以记录错误日志,并通知相关人员进行处理。
加入适当的错误处理机制不仅可以帮助应用程序更好地处理错误,还可以提高用户体验。通过向用户提供清晰的错误信息,可以帮助他们更好地了解问题所在,并采取相应的措施。例如,如果用户输入的 API 密钥不正确,可以向他们显示一条友好的错误消息,提示他们检查 API 密钥是否正确。