使用 Coinbase Pro API 构建自动交易机器人
前言
Coinbase Pro,如今已成功升级并整合为Coinbase Advanced Trade,其API为开发者敞开了大门,赋予他们强大的能力,可以精准地获取实时市场数据,高效地管理自己的账户,并以程序化的方式执行交易策略。本文将深入探讨如何利用这一API,从零开始构建一个功能完备的自动化交易机器人。我们将详细剖析从安全身份验证到执行实际交易的每一个关键步骤,确保读者能够掌握构建自动交易系统的核心技能。
Coinbase Advanced Trade API不仅提供基础的市场数据和交易功能,更包含高级订单类型、历史数据查询以及WebSocket实时数据流等功能,这些都将极大地丰富自动交易策略的开发。我们将重点关注如何利用这些高级功能,构建更智能、更高效的交易机器人。
自动化交易机器人能够根据预设的规则,在无需人工干预的情况下自动进行买卖操作,这对于那些希望利用市场波动或执行复杂交易策略的交易者来说,极具吸引力。 通过本文的学习,您将不仅能够理解API的使用方法,更能掌握构建稳定可靠的自动交易系统的关键技巧,为您的加密货币交易之路提供强有力的技术支持。我们还将涵盖风险管理和安全最佳实践,确保您的交易机器人能够在安全可控的环境下运行。
1. 准备工作
你需要一个 Coinbase Pro 账户。 如果你还没有账户,请前往 Coinbase Pro 网站注册。登录后,进入你的账户设置,找到 API 设置页面,在此生成 API 密钥。API 密钥允许你以编程方式访问你的 Coinbase Pro 账户,执行交易、获取市场数据等操作。请务必妥善保存生成的
API Key
,
API Secret
和
Passphrase
,因为它们是访问 Coinbase Pro API 的必要凭证,丢失后需要重新生成。
API Key
是你的身份标识,
API Secret
用于签名请求,
Passphrase
则是 API 密钥的额外安全层。强烈建议在账户中启用双因素身份验证 (2FA),例如使用 Google Authenticator 或 Authy,以增强账户的整体安全性,防止未经授权的访问。
选择你偏好的编程语言。 Python 是一个非常流行的选择,尤其是在金融和加密货币领域,因为它拥有丰富的开源库,例如
requests
和
ccxt
。
requests
库可以用于发送 HTTP 请求,而
ccxt
(Crypto Currency eXchange Trading Library)是一个专门用于与加密货币交易所 API 交互的库,它支持大量的交易所,并提供统一的接口,可以大大简化与 Coinbase Pro API 的集成。 除了 Python,你也可以选择其他语言,例如 JavaScript、Java 或 Go,但需要查找或编写相应的库来处理 API 请求和数据解析。本文将以 Python 为例进行讲解,因为它易于学习和使用,并且拥有强大的社区支持。
安装必要的 Python 库:
使用 Python 的包管理器 pip 安装
requests
和
ccxt
库。在命令行或终端中执行以下命令:
pip install requests ccxt
如果你的 Python 环境中安装了多个版本的 pip,可能需要使用
pip3
命令来确保库安装到正确的 Python 环境中:
pip3 install requests ccxt
安装完成后,你可以通过在 Python 解释器中导入这些库来验证安装是否成功:
import requests
import ccxt
print(requests.__version__)
print(ccxt.__version__)
如果能够成功打印出库的版本号,则表示安装成功。
2. 身份验证
Coinbase Pro API 采用基于 HMAC (Hash-based Message Authentication Code) 的身份验证机制,确保请求的安全性与完整性。每个发送到 Coinbase Pro API 的请求都必须包含特定的头部信息,这些信息通过您的 API 密钥、API 密钥的密钥以及时间戳进行数字签名,从而验证请求的合法性。
以下是一个使用 Python 的
requests
库生成必要的身份验证头部的示例函数。该函数演示了如何使用您的 API 密钥和密钥对请求进行签名,然后将签名添加到请求头中:
import requests
import time
import hmac
import hashlib
import base64
API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_SECRET_KEY'
API_PASSPHRASE = 'YOUR_PASSPHRASE'
def get_signature(timestamp, method, request_path, body=''):
"""
生成 Coinbase Pro API 请求的数字签名。
Args:
timestamp (str): 请求的时间戳。
method (str): HTTP 请求方法 (例如, 'GET', 'POST', 'DELETE')。
request_path (str): API 请求的路径 (例如, '/orders')。
body (str, optional): 请求体,如果存在。默认为空字符串。
Returns:
str: 基于 Base64 编码的数字签名。
"""
message = timestamp.encode('utf-8') + method.encode('utf-8') + request_path.encode('utf-8') + body.encode('utf-8')
hmac_key = base64.b64decode(API_SECRET)
signature = hmac.new(hmac_key, message, hashlib.sha256)
signature_b64 = base64.b64encode(signature.digest()).decode('utf-8')
return signature_b64
def get_headers(method, request_path, body=''):
"""
生成 Coinbase Pro API 请求的头部信息。
Args:
method (str): HTTP 请求方法。
request_path (str): API 请求的路径。
body (str, optional): 请求体,如果存在。默认为空字符串。
Returns:
dict: 包含身份验证信息的 HTTP 头部字典。
"""
timestamp = str(time.time())
signature = get_signature(timestamp, method, request_path, body)
headers = {
'Content-Type': 'application/',
'CB-ACCESS-KEY': API_KEY,
'CB-ACCESS-SIGN': signature,
'CB-ACCESS-TIMESTAMP': timestamp,
'CB-ACCESS-PASSPHRASE': API_PASSPHRASE
}
return headers
务必将
YOUR_API_KEY
、
YOUR_SECRET_KEY
和
YOUR_PASSPHRASE
替换为您从 Coinbase Pro 获得的实际 API 凭证。
API_SECRET
是您的密钥,需要进行 Base64 解码才能用作 HMAC 的密钥。
API_PASSPHRASE
是您在创建 API 密钥时设置的密码短语,用于进一步增强安全性。请注意,
Content-Type
设置为
application/
,因为大多数 API 调用都期望 JSON 格式的数据。
3. 获取账户信息
在成功完成身份验证头部配置后,你便可以开始利用你的 API 密钥访问 Coinbase 的 API 端点。 例如,以下代码演示了如何通过 API 获取你的账户信息:
import requests
import
BASE_URL = 'https://api.coinbase.com'
# 务必使用 Coinbase API, Coinbase Pro API 已弃用。
def get_accounts():
# Coinbase API V3 的账户信息端点。
endpoint = '/api/v3/brokerage/accounts'
method = 'GET'
headers = get_headers(method, endpoint)
url = BASE_URL + endpoint
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.()
else:
print(f"Error: {response.status_code} - {response.text}")
return None
accounts = get_accounts()
if accounts:
print(.dumps(accounts, indent=4))
上述 Python 代码段构建了一个向
/api/v3/brokerage/accounts
端点发起 GET 请求的函数,用于检索用户的账户详情。 请求头信息通过
get_headers
函数生成,保证了请求的合法性。 如果 API 调用成功(HTTP 状态码为 200), 返回的 JSON 数据将被解析并打印。 如果 API 请求失败,则会输出错误状态码和错误信息,以便于调试。 特别需要注意的是,原有的 Coinbase Pro API 已经迁移至 Coinbase API V3,因此在调用 API 时需要使用新的端点
/api/v3/brokerage/accounts
以确保代码的兼容性和功能正常。
4. 获取市场数据
在加密货币交易中,为了制定明智的交易策略和做出有效的决策,实时且准确的市场数据至关重要。Coinbase Pro API 提供了一个强大的接口,允许开发者和交易者获取各种关键的市场信息,包括产品行情、历史价格数据、订单簿深度以及交易活动等。
通过访问 Coinbase Pro API,你可以监控价格波动、分析交易量模式、评估市场深度以及识别潜在的交易机会。这些数据对于量化交易策略、风险管理和投资组合优化至关重要。
以下是一个使用 Python 和 Coinbase Pro API V3 获取 ETH-USD 产品实时行情信息的示例代码。这段代码展示了如何构造 API 请求、处理响应以及提取所需的市场数据:
def get_product_ticker(product_id='ETH-USD'):
endpoint = f'/api/v3/brokerage/products/{product_id}' # Coinbase API V3 端点,用于获取指定产品的行情信息
method = 'GET' # 指定 HTTP 请求方法为 GET,用于从服务器检索数据
headers = get_headers(method, endpoint) # 使用自定义的 get_headers 函数生成包含认证信息的请求头
url = BASE_URL + endpoint # 构建完整的 API 请求 URL,BASE_URL 是 Coinbase Pro API 的基础 URL
response = requests.get(url, headers=headers) # 发送 GET 请求到指定的 URL,并传递请求头
if response.status_code == 200: # 检查响应状态码是否为 200,表示请求成功
return response.() # 如果请求成功,将响应内容解析为 JSON 格式并返回
else:
print(f"Error: {response.status_code} - {response.text}") # 如果请求失败,打印错误状态码和错误信息
return None
ticker = get_product_ticker() # 调用 get_product_ticker 函数获取 ETH-USD 的行情数据
if ticker: # 检查是否成功获取到行情数据
print(.dumps(ticker, indent=4)) # 如果成功获取,将行情数据格式化为 JSON 字符串并打印到控制台,使用缩进使输出更易读
这段代码通过向
/api/v3/brokerage/products/{product_id}
端点发送一个 GET 请求,获取指定交易对(例如 ETH-USD)的实时行情信息。API 返回的数据包含了最新的成交价格、买入价、卖出价、交易量以及其他关键的市场指标。你可以根据实际需求解析这些数据,并将其应用于各种交易策略和分析工具中。需要注意的是,`get_headers()` 函数负责生成包含身份验证信息的请求头,这对于访问 Coinbase Pro API 是必不可少的。确保你已经正确配置了 API 密钥和签名,才能成功发送请求并获取数据。
5. 下单
下单功能是自动交易机器人运作的核心,直接关系到策略的执行。 Coinbase Pro API 提供了丰富的订单类型,允许开发者根据交易策略创建不同类型的订单,包括市价单、限价单和止损单。 正确理解和使用这些订单类型是构建高效稳定交易机器人的关键。
以下代码示例展示了如何使用 Coinbase Pro API v3 下一个市价单:
def place_market_order(product_id='ETH-USD', side='BUY', size='0.01'):
endpoint = '/api/v3/brokerage/orders' # Coinbase API V3 订单提交接口
method = 'POST'
body = .dumps({
"client_order_id": str(int(time.time())), # 客户端订单ID,需保证唯一性
"product_id": product_id, # 交易对,例如 ETH-USD
"side": side, # 交易方向,'BUY' 或 'SELL'
"order_configuration": {
"market_market_ioc": { # 市价单配置
"quote_size": size if side == 'BUY' else None, # 如果是买单,指定花费多少quote currency,比如USD
"base_size": size if side == 'SELL' else None # 如果是卖单,指定卖出多少base currency,比如ETH
}
}
})
headers = get_headers(method, endpoint, body) # 获取请求头,包含签名信息
url = BASE_URL + endpoint # 完整的API请求URL
response = requests.post(url, headers=headers, data=body) # 发送POST请求
if response.status_code == 200:
return response.() # 返回JSON格式的响应数据
else:
print(f"Error: {response.status_code} - {response.text}") # 打印错误信息
return None # 返回None表示下单失败
order = place_market_order()
if order:
print(.dumps(order, indent=4)) # 格式化打印订单信息
该代码段向
/api/v3/brokerage/orders
端点发送一个 POST 请求,用于创建一个立即成交的市价单。
side
参数定义了交易方向,可以是
BUY
(买入) 或
SELL
(卖出)。
size
参数指定了交易的数量。
client_order_id
是一个由客户端生成的唯一订单标识符,用于追踪订单状态。 API v3 下市价单时,买单需要设置
quote_size
(花费多少目标货币),卖单需要设置
base_size
(卖出多少基础货币)。正确设置这两个参数是成功提交市价单的关键。
使用市价单时需要注意滑点风险,尤其是在市场波动剧烈时,实际成交价格可能与预期价格存在较大差异。 在实际应用中,应根据具体情况选择合适的订单类型。
6. 监控订单状态
成功提交订单后,密切监控其状态至关重要,这能让你了解订单是否已成交、部分成交或被拒绝。Coinbase API V3 提供了便捷的方式来检索特定订单的详细信息。你可以利用订单ID来查询订单的状态,成交价格,成交数量等关键信息。
以下 Python 代码示例演示了如何使用 Coinbase API V3 获取订单信息:
def get_order(order_id):
"""
使用订单ID从Coinbase API V3获取订单信息.
Args:
order_id (str): 要查询的订单的唯一标识符.
Returns:
dict: 包含订单详细信息的字典, 如果订单未找到或发生错误, 则返回 None.
"""
endpoint = f'/api/v3/brokerage/orders/historical/{order_id}' #Coinbase API V3 历史订单接口
method = 'GET' # 使用 GET 方法请求数据
headers = get_headers(method, endpoint) # 使用自定义函数获取请求头信息,包含签名等
url = BASE_URL + endpoint # 完整的 API 请求 URL
response = requests.get(url, headers=headers) # 发送 GET 请求
if response.status_code == 200: # 检查响应状态码是否成功 (200 OK)
return response.() # 将响应内容解析为 JSON 格式并返回
else:
print(f"Error: {response.status_code} - {response.text}") # 打印错误信息,包括状态码和错误文本
return None # 返回 None 表示订单获取失败
代码详解:
-
get_order(order_id)
函数: 此函数接受一个order_id
作为输入,用于标识要查询的订单。 -
endpoint
变量: 定义了 Coinbase API V3 的历史订单接口的端点,其中{order_id}
会被替换为实际的订单 ID。 历史订单接口用于获取已完成的或已取消的订单。 -
method
变量: 指定 HTTP 请求方法为GET
,用于从服务器获取数据。 -
headers
变量: 调用get_headers(method, endpoint)
函数生成包含必要身份验证信息的请求头。这些信息通常包括 API 密钥、时间戳和签名,以确保请求的安全性。 请务必正确实现get_headers
函数。 -
url
变量: 将BASE_URL
(Coinbase API 的基础 URL) 和endpoint
拼接成完整的 API 请求 URL。 -
requests.get(url, headers=headers)
: 使用requests
库发送 GET 请求到指定的 URL,并包含必要的请求头。 -
response.status_code == 200
: 检查响应的状态码。状态码200
表示请求成功。 -
response.()
: 如果请求成功,将响应内容解析为 JSON 格式,并返回包含订单详细信息的字典。 -
错误处理:
如果响应状态码不是
200
,则打印错误信息(包括状态码和错误文本),并返回None
,表示订单获取失败。
重要提示:
-
确保已正确配置
BASE_URL
和get_headers
函数,以便正确连接到 Coinbase API V3 并进行身份验证。BASE_URL
应该是 Coinbase API V3 的基础 URL,例如https://api.coinbase.com/
。get_headers
函数必须生成包含必要身份验证信息的请求头。 - 在生产环境中,请妥善保管你的 API 密钥,并使用安全的方式存储和管理。 切勿将 API 密钥硬编码到代码中。
- 请仔细阅读 Coinbase API V3 的官方文档,了解有关订单状态代码和其他相关信息的详细说明。
假设
order_id
是您之前下单时获得的唯一订单标识符
order_id = "YOUR_ORDER_ID"
order_status = get_order(order_id)
if order_status:
print(.dumps(order_status, indent=4))
请务必将
YOUR_ORDER_ID
替换为您需要查询的实际订单ID。
上述代码示例通过调用
get_order
函数(该函数通常会向交易所的API发送请求)来查询订单状态。
该函数内部可能使用HTTP GET方法向
/api/v3/brokerage/orders/historical/{order_id}
这样的RESTful API端点发送请求,其中
{order_id}
会被实际的订单ID替换。
返回的
order_status
对象通常是一个包含订单详细信息的JSON格式的数据结构,例如订单类型(市价单或限价单)、订单方向(买入或卖出)、下单时间、委托价格、已成交数量、剩余未成交数量、平均成交价格、订单状态(已创建、已提交、部分成交、完全成交、已取消、已过期等)以及交易手续费等。
.dumps(order_status, indent=4)
用于将JSON对象格式化输出,
indent=4
参数使输出具有良好的可读性,通过缩进展示JSON的层级结构。
7. 风险管理
在构建自动交易机器人时,有效的风险管理是保证长期盈利能力和降低潜在损失的关键环节。你应该预先设定止损(Stop-Loss)和止盈(Take-Profit)点位,这两个关键参数能够帮助你在市场波动不利时自动平仓,从而限制单次交易的最大亏损额,并在价格达到预期盈利目标时锁定利润。止损点的设置应基于你的风险承受能力、交易策略以及标的资产的波动性;止盈点的设置则应结合技术分析和市场趋势,力求在合理范围内最大化收益。
除了设置止损止盈,限制每次交易的风险敞口也是至关重要的。这意味着你需要控制每次交易投入的资金比例,通常建议将单次交易的风险控制在总资金的1%-2%以内。通过限制单次交易的风险,即使出现连续亏损,也能有效保护你的交易账户免受重大损失。同时,合理分配资金也能让你有足够的空间来应对市场变化和把握未来的交易机会。
加密货币市场瞬息万变,自动化交易并非一劳永逸。因此,请密切关注市场动态,包括但不限于新闻事件、监管政策变化、技术指标的异常波动等。你需要定期审查和调整你的交易策略和风险管理参数,以适应不断变化的市场环境。在市场出现重大突发事件或机器人无法有效处理的异常情况时,果断进行手动干预,及时调整仓位或暂停机器人运行,可以避免潜在的巨大损失。
8. 使用 ccxt 库
ccxt
(CryptoCurrency eXchange Trading Library) 库提供了一个统一的、高级别的抽象层,极大地简化了与众多加密货币交易所 API 的交互。其目标是让开发者能够使用一套代码,连接并操作不同的交易所,而无需针对每个交易所编写不同的 API 调用逻辑。 使用
ccxt
库,可以通过相对简洁的代码获取账户信息,并进行其他交易操作。
import ccxt
exchange = ccxt.coinbasepro({ 'apiKey': API_KEY, 'secret': API_SECRET, 'password': API_PASSPHRASE, })
coinbasepro
实例化中的
apiKey
、
secret
和
password
分别对应你在 Coinbase Pro (或 Coinbase Advanced Trade) 上创建的 API 密钥、密钥对应的 secret 以及 passphrase。 这些凭据用于身份验证,确保只有授权的用户才能访问账户信息并执行交易。 请务必妥善保管这些信息,避免泄露,并使用强密码策略。
try: balance = exchange.fetch_balance() print(balance) except ccxt.AuthenticationError as e: print(f"Authentication Error: {e}") except Exception as e: print(f"An unexpected error occurred: {e}")
在上述代码中,
fetch_balance()
函数会调用 Coinbase Pro API 获取账户余额信息。
try...except
块用于捕获可能发生的异常情况。
ccxt.AuthenticationError
通常表示提供的 API 密钥或 secret 不正确,或者权限不足。其他的
Exception
则用于捕获其他未预期的错误,例如网络问题或 API 服务器错误。通过捕获和处理异常,可以提高代码的健壮性。
ccxt
库极大地简化了身份验证和数据处理的流程,使得代码更加简洁易懂,降低了开发难度。开发者可以通过统一的接口调用不同的交易所 API,无需关注底层细节。 然而,需要注意的是,
ccxt
库的更新可能存在滞后性,可能无法完全同步最新的 Coinbase API V3 变更。在使用时,请务必查阅
ccxt
的官方文档,确认其对 Coinbase API V3 的支持情况,并根据实际情况进行调整。 不同交易所对于API的使用频率和限制可能有所不同,使用ccxt时也需要注意遵守相关限制,避免触发风控。
略