Coinbase Pro API交易指南:新手也能轻松上手?

频道: 教程 日期: 浏览:28

如何通过API在Coinbase Pro 进行交易

Coinbase Pro 提供了一套强大的 API,允许开发者以编程方式进行交易、获取市场数据和管理账户。本文将详细介绍如何使用 Coinbase Pro API 进行交易,包括必要的设置、身份验证、API 端点以及示例代码。

准备工作

在开始之前,你需要准备以下事项,确保能够顺利地与Coinbase Pro API进行交互:

  1. Coinbase Pro 账户: 如果你尚未拥有Coinbase Pro账户,请务必访问Coinbase Pro官方网站( https://pro.coinbase.com/ )进行注册。一个经过身份验证的Coinbase Pro账户是使用其API的前提。你需要完成KYC(了解你的客户)流程,确保账户具备交易和API访问权限。
  2. API 密钥: 为了通过程序访问Coinbase Pro API,你需要生成API密钥。API密钥包括API Key、Secret Key 和Passphrase三个部分。请务必妥善保管这些密钥,避免泄露,因为它们拥有访问你账户的权限。在Coinbase Pro的账户设置中,找到API选项并创建新的API密钥。请注意,你可以设置API密钥的权限,例如仅允许读取数据或允许进行交易操作。 强烈建议你只授予API密钥所需的最低权限,以降低安全风险。
  3. 编程环境: 选择你最熟悉的编程语言,用于编写与Coinbase Pro API交互的代码。常用的选择包括Python、JavaScript (Node.js 或浏览器环境) 或 Java。安装相应的开发工具包 (SDK) 和依赖项,以便更轻松地进行开发。 例如,如果你选择Python,你需要安装Python解释器和pip包管理器。
  4. 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 密钥

  1. 登录你的 Coinbase Pro 账户。 访问 Coinbase Pro 官方网站,使用你的用户名和密码进行安全登录。确保已启用双重验证,以增强账户安全性。
  2. 导航到 API 设置页面。 登录后,在账户设置中查找 API 管理相关选项。这通常位于用户设置、安全设置或 API 设置等部分。Coinbase Pro 可能会更新界面,因此请仔细查找包含“API”字样的链接或选项。
  3. 创建新的 API 密钥。 点击“创建 API 密钥”或类似的按钮。在创建过程中,系统将提示你为该密钥设置权限。选择合适的权限至关重要,因为它决定了该密钥可以执行的操作。
  4. 配置 API 密钥权限。 Coinbase Pro 提供了多种 API 权限,包括查看账户余额、交易下单、访问历史数据等。对于需要进行交易操作的应用程序,必须选择 trade 权限。根据你的具体需求,可能还需要选择其他权限,例如 read (读取账户信息)或 withdraw (提现资金),但请谨慎授予 withdraw 权限,并确保采取额外的安全措施。
  5. 安全地保存你的 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,防止泄露。

  1. 构造 Prehash 字符串: Prehash 字符串是构建 HMAC 签名的基础,它将多个关键信息组合在一起。 按照以下顺序连接字符串:
    • 请求时间戳(Unix 时间戳): 自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来经过的秒数。精确到秒的时间戳至关重要,因为它有助于防止重放攻击。
    • 请求方法: HTTP 请求方法,例如 GET POST PUT DELETE 。 方法必须以大写形式指定。
    • 请求路径: API 端点的路径,不包含域名。 例如, /accounts 用于获取账户信息, /orders 用于管理订单。
    • 请求正文: 如果请求包含正文(例如,POST 或 PUT 请求),则包含请求正文的内容。 如果请求没有正文(例如,GET 或 DELETE 请求),则使用空字符串。
  2. 计算 HMAC 签名: 使用你的 Secret 作为密钥,对 Prehash 字符串进行 HMAC-SHA256 哈希计算。 HMAC-SHA256 算法是一种加密哈希函数,它可以生成一个固定大小的哈希值,用于验证消息的完整性和真实性。
  3. Base64 编码签名: 将 HMAC 签名进行 Base64 编码。 Base64 是一种将二进制数据转换为 ASCII 字符串的编码方案。 这种编码是必要的,因为 HTTP 标头只能包含 ASCII 字符。
  4. 添加 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/ - 获取特定账户的详细余额信息。 需要替换为实际的账户ID。返回信息包括可用余额(可以用于交易)、持有余额(已锁定或待结算)以及总余额。
  • 获取市场行情: GET /products - 获取Coinbase Pro上所有可交易交易对的市场行情数据。每个交易对的信息包括交易对ID、基础货币、报价货币、交易规模增量和当前交易状态。
  • 获取特定交易对行情: GET /products/ /ticker - 获取特定交易对的实时行情快照。 需要替换为实际的交易对ID,例如 "BTC-USD"。返回信息包含当前成交价格、成交量、最高价、最低价和时间戳等。此接口提供的是近乎实时的市场数据。
  • 下单: POST /orders - 创建新的买入或卖出订单。请求体需要包含订单类型(市价单或限价单)、交易对ID、买卖方向、订单数量和价格(如果为限价单)。成功下单后,API将返回订单ID和其他相关信息。注意,下单需要进行身份验证和权限验证。
  • 取消订单: DELETE /orders/ - 取消指定的未成交订单。 需要替换为要取消的订单ID。只有未成交的订单才能被取消。取消成功后,API将返回确认信息。
  • 获取订单信息: GET /orders/ - 获取指定订单的详细信息,包括订单状态、订单类型、交易对ID、下单时间、成交数量和平均成交价格等。 需要替换为要查询的订单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 密钥是否正确。