
Python调用Google Bard API 完整指南
Coinbase Pro API 是一种允许我们通过代码在 Coinbase Pro 上自动交易加密货币的方法。
在 Coinbase Pro 上创建账户并使用 API 是免费的,但交易费用开始生效。Coinbase Pro 遵循的主要费用结构是通常的做市商/接受者费用结构,并采用费用等级。
费用(也称为定价)等级是根据您 30 天的美元交易量计算的。有些人可能想知道做市商/接受者结构究竟是如何运作的,我将通过以下示例来回答您的问题。
如果您下达的市价订单立即生效,则您将被归类为接受者,并需支付 0.04% 至 0.50% 之间的费用。
另一方面,如果您的订单没有立即匹配,它将被放入订单簿。当您的订单被另一个客户匹配时,您将被归类为挂单者,并将收取 0.00% 至 0.50% 之间的费用。
最后,如果您的订单在下单时部分成交,您将支付与成交部分相匹配的接受者费用。订单的剩余部分将放在订单簿上,并在匹配后被视为挂单。
您可以在下表中查看费用结构及其等级。
是也不是。这两个平台均归 Coinbase Global Inc 所有,但 Coinbase 更像是您的虚拟钱包,而 Coinbase Pro 则适合交易高级且准备与其他用户交易的人。
我们可以有力地论证说,Coinbase Pro API 比普通的 Coinbase API 更好,因为它允许更多高级功能和端点。
Coinbase Pro API 可在 100 多个国家/地区使用,完整列表可在此处找到。为了方便您,我在下图中汇总了所有获准的国家/地区:
Coinbase Pro API 可以替换为其他更适合您需求的交易所。以下是其中一些:
Coinbase Pro API 的可用和维护的客户端如下:
有两种方法可以开始使用 Coinbase Pro。第一种方法是直接在 Coinbase Pro 登录页面上创建一个帐户,第二种方法是将其与已创建的 Coinbase 帐户集成。
让我们先从后者开始。转到以下链接上的 Coinbase Pro 页面:Coinbase Pro | 数字资产交易所
到达那里后,点击右上角的蓝色“开始”按钮。然后,您需要指定您的基本帐户详细信息并验证您的电子邮件地址并通过电话进行身份验证。
根据您所在的地区,您将被要求提供您的姓名、出生日期、地址、意图、资金来源、职业和雇主。您还应该准备好您的身份证件,因为您将被要求提供身份证件的照片。
身份验证后,系统会要求您关联银行账户。您可以跳过此步骤,稍后再选择“开始交易”选项返回。第一种方法就是这样。
第二种方式是使用您的 Coinbase 帐户凭证登录,这将自动链接两者并允许在它们之间转移资金。
如果您想选择第二种选择,但没有 Coinbase 帐户,您可以查看我们的Coinbase 文章入门部分。
现在点击右上角的账户图标和 API,然后点击“+ 新 API 密钥”按钮。然后您将指定 API 密钥权限、昵称和密码。
之后,您可以创建 API 密钥。系统将提示您输入验证码,完成后将显示应安全存储的密钥。
现在我们的 API 密钥已创建并可运行,我们可以通过检查最常用的公共和私有端点来测试其功能。请务必使用以下命令安装 Python 客户端:
pip install cbpro
可以使用get_products
带有 Coinbase Pro API python 库的端点获取交易对。
现在,让我们导入库,初始化客户端,获取我们的产品数据,并将其放入 pandas 数据框中以便更好地观察:
import cbpro
import pandas as pd
c = cbpro.PublicClient()
data = pd.DataFrame(c.get_products())
data.tail().T
这是相当可观的交易对数量,但还可以更多。
可以使用 Coinbase Pro API 的get_product_ticker
端点获取价格数据。您需要指定要获取数据的股票代码参数。
让我们获取 Cardano 资产的数据:
ticker = c.get_product_ticker(product_id='ADA-USD')
ticker
{'trade_id': 15598647,
'price': '1.7446',
'size': '27.35',
'time': '2021-05-26T18:24:17.9723252',
'bid': '1.7435',
'ask': '1.7444',
'volume': '223045485.25'}
您还可以使用Coinbase Pro REST API端点通过以下方式获取数据:
import requests
ticker = requests.get('https://api.pro.coinbase.com/products/ADA-USD/ticker').json()
ticker
{'trade_id': 16369597,
'price': '1.6106',
'size': '1012.91',
'time': '2021-05-30T08:39:31.8363332',
'bid': '1.6106',
'ask': '1.6111',
'volume': '197711129.46'}
可以使用 Coinbase Pro API 的 get_product_historic_rates 端点获取历史数据。您可以将粒度、开始和结束日期指定为 API 请求的参数。
让我们使用默认参数获取 ETH-USD 的历史数据,并将其排列到已清理的 pandas 数据框中。我们将重命名列,将 Unix 时间转换为标准时间,并按此对数据进行排序。
historical = pd.DataFrame(c.get_product_historic_rates(product_id='ETH-USD'))
historical.columns= ["Date","Open","High","Low","Close","Volume"]
historical['Date'] = pd.to_datetime(historical['Date'], unit='s')
historical.set_index('Date', inplace=True)
historical.sort_values(by='Date', ascending=True, inplace=True)
historical
现在我们可以使用这些数据来创建一个简单的指标并生成一个交互式烛台图。
Coinbase Pro API 不提供任何预设指标,但我们可以使用一些内置的 pandas 功能来制作简单指标,或者依靠 btalib 库来制作更复杂的指标。
在本例中,我们将使用 pandas 创建一个简单的 20 SMA 指标:
historical['20 SMA'] = historical.Close.rolling(20).mean()
historical.tail()
现在我们拥有使用 plotly 库创建漂亮的交互式图表所需的所有数据:
import plotly.graph_objects as go
fig = go.Figure(data=[go.Candlestick(x = historical.index,
open = historical['Open'],
high = historical['High'],
low = historical['Low'],
close = historical['Close'],
),
go.Scatter(x=historical.index, y=historical['20 SMA'], line=dict(color='purple', width=1))])
fig.show()
可以使用get_product_order_book
Coinbase Pro API 端点获取订单簿数据。您需要指定要在其上设置订单簿的资产。
让我们获取 BTC-USD 的订单簿数据,并将买入价和卖出价排列到单独的 pandas 数据框中。之后,我将向您展示如何将两者合并在一起。
order_book = c.get_product_order_book('BTC-USD')
order_book
现在我们创建两个数据框:
bids = pd.DataFrame(order_book['bids'])
asks = pd.DataFrame(order_book['asks'])
bids.head()
现在我们将两者合并,并将列重命名为信息丰富的名称:
df = pd.merge(bids, asks, left_index=True, right_index=True)
df = df.rename({"0_x":"Bid Price","1_x":"Bid Size", "2_x":"Bid Amount",
"0_y":"Ask Price","1_y":"Ask Size", "2_y":"Ask Amount"}, axis='columns')
df.head()
可以使用端点通过 Coinbase Pro API 获取交易数据get_product_trades
。必需参数是您要获取数据的资产。
由于 Python 库可能会因为进行几个调用而卡住,因此我们将使用 REST API。
trades = pd.DataFrame(requests.get('https://api.pro.coinbase.com/products/ETH-USD/trades').json())
trades.tail()
Coinbase Pro WebSockets 可通过 WebscoketClient 端点访问。借助此功能,您可以轻松流式传输并及时了解您感兴趣的数据。
让我们从一个获取股票价格数据的基本 WebSocket 连接开始。
import cbpro
wsc = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com",
products="ADA-USD",
channels=["ticker"])
要关闭 WebSocket,请编写以下命令:
wsc.close()
现在,让我们创建一个类,它将获取一定数量的 WebSocket 消息的股票价格数据并将其打印出来:
import time, cbpro
class myWebsocketClient(cbpro.WebsocketClient):
def on_open(self):
self.url = "wss://ws-feed.pro.coinbase.com/"
self.products = ["ETH-USDT"]
self.channels=["ticker"]
self.message_count = 0
def on_message(self, msg):
self.message_count += 1
if 'price' in msg and 'type' in msg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
def on_close(self):
print("Closing")
wsClient = myWebsocketClient()
wsClient.start()
print(wsClient.url, wsClient.products, wsClient.channels)
while (wsClient.message_count < 50):
print ("\nmessage_count =", "{} \n".format(wsClient.message_count))
time.sleep(1)
wsClient.close()
在这个第一个例子中,我将向您展示如何正确安全地启动具有指定要求的订单。我们想要做的是当 BTC 达到某个价格(例如 38500 美元)时启动 ETH 交易。
为了实现这一点,我们需要设置订单基础,然后创建一个循环来检查价格水平是否被触及。如果价格被触及,我们将执行市价订单。否则,我们将继续循环。
当价格执行后,我们会等待几秒钟并检查订单是否真的已完成。这一额外步骤对于添加到您的交易策略中非常重要,因为交易所服务器可能会遇到一些问题。
现在逻辑已经设置好了,让我们导入相关的库并设置 API:
import cbpro
import base64
import json
from time import sleep
key = ''
secret = ''
passphrase = ''
encoded = json.dumps(secret).encode()
b64secret = base64.b64encode(encoded)
auth_client = cbpro.AuthenticatedClient(key=key, b64secret=secret, passphrase=passphrase)
c = cbpro.PublicClient()
现在来看看主要的交易逻辑。请注意我们如何通过采用当前的 ETH-USD 价格并在其上方加几美元来下限价订单。这样做是为了让订单更安全。
while True:
try:
ticker = c.get_product_ticker(product_id='BTC-USD')
except Exception as e:
print(f'Error obtaining ticker data: {e}')
if float(ticker['price']) >= 38500.00:
try:
limit = c.get_product_ticker(product_id='ETH-USD')
except Exception as e:
print(f'Error obtaining ticker data: {e}')
try:
order=auth_client.place_limit_order(product_id='ETH-USDT',
side='buy',
price=float(limit['price'])+2,
size='0.007')
except Exception as e:
print(f'Error placing order: {e}')
sleep(2)
try:
check = order['id']
check_order = auth_client.get_order(order_id=check)
except Exception as e:
print(f'Unable to check order. It might be rejected. {e}')
if check_order['status'] == 'done':
print('Order placed successfully')
print(check_order)
break
else:
print('Order was not matched')
break
else:
print(f'The requirement is not reached. The ticker price is at {ticker["price"]}')
sleep(10)
主要任务是当 BTC 在过去 5 分钟内波动 5% 时执行 ETH 交易。这意味着我们需要创建一个循环来获取两种加密货币的价格并计算两者之间的百分比变化。
如果百分比变化小于 5%,程序将休眠 5 分钟并再次计算百分比变化。如果百分比变化等于或大于 5%,则交易将执行。
交易执行后,我们将休眠几秒钟,然后检查交易是否已完成。请记住,库和 API 设置与上一个示例相同。
现在已经设置了逻辑,是时候编写代码了:
while True:
try:
ticker_old = c.get_product_ticker(product_id='BTC-USD')
except Exception as e:
print(f'Error obtaining ticker data: {e}')
sleep(300)
try:
ticker_new = c.get_product_ticker(product_id='BTC-USD')
except Exception as e:
print(f'Error obtaining ticker data: {e}')
percent = ((float(ticker_new['price']) - float(ticker_old['price']))*100)/float(ticker_old['price'])
if percent >= 5:
try:
limit = c.get_product_ticker(product_id='ETH-USDT')
except Exception as e:
print(f'Error obtaining ticker data: {e}')
try:
order=auth_client.place_limit_order(product_id='ETH-USDT',
side='buy',
price=float(limit['price'])+2,
size='0.007')
except Exception as e:
print(f'Error placing order: {e}')
sleep(2)
try:
check = order['id']
check_order = auth_client.get_order(order_id=check)
except Exception as e:
print(f'Unable to check order. It might be rejected. {e}')
if check_order['status'] == 'done':
print('Order placed successfully')
print(check_order)
break
else:
print('Order was not matched')
break
else:
print(f'The requirement is not reached. The percent change is at {percent}')
要使用 Coinbase Pro API 取消订单,您需要做的就是访问cancel_order
API 端点并将订单 ID 作为参数传递。
client.cancel_order(order_id = "ORDER-ID-HERE")