
Python调用Google Bard API 完整指南
OKX API 是一种允许交易者通过代码在 OKX 上自动交易加密货币的方法。
OKX 是一个在线加密货币交易平台,允许交易者交易超过 250 种coins和tokens。OKX 配备了自己的云服务,并能够参与现货、保证金和期货交易。
注册 OKX 并测试其 API 完全免费。当您开始使用 OKX API 进行交易时,才会收取费用。
OKX 的费用结构比大多数其他在线加密货币交易所更复杂。决定费用的第一件事就是您的用户类型。
OKX 用户主要分为两种类型:普通用户和 VIP 用户。对于普通用户,费用结构取决于您的 OKB 总持有量(OKX 原生加密货币)。以下是 SPOT 费用等级:
对于 VIP 用户,费用结构取决于您每月的交易量(以美元表示)。VIP 用户有 7 个等级,均遵循挂单/接受单费用结构。您可以在下面看到费用结构:
期货市场也是如此,但费用结构不同。下面有两个表格,第一个表格适用于普通用户,第二个表格适用于 VIP 用户。
如需更详细地了解 OKX 费用结构及其运作方式,请访问以下链接,其中通过示例进行了详细解释:https://www.okx.com/fees.html
OKX 致力于在全球范围内提供服务,但由于一些严格的法规和管辖权问题,它无法在以下国家/地区提供服务:
香港、古巴、伊朗、朝鲜、克里米亚、苏丹、马来西亚、叙利亚、美国(包括所有美国领土)、孟加拉国、玻利维亚、厄瓜多尔和吉尔吉斯斯坦。
OKX 可以替换为其他更适合您需求的网站。以下是其中一些:
OKX API 可在以下客户端中使用:
为了开始使用 OKX API 并启动这些交易策略,我们首先需要访问他们的网站并获取 API 密钥。
转到以下链接并单击页面顶部的蓝色“注册”按钮:https://www.okx.com
然后输入您的电子邮件地址,创建密码并单击注册按钮。
然后输入将发送到您的电子邮件帐户的 6 位数代码。之后,您将受到 OKX 网站的欢迎。现在,转到右上角的个人资料图标,然后在下拉菜单中选择 API。
现在将提示您通过手机号码或 Google Authenticator 启用 2FA。之后,转到 API 部分并单击“+创建 V5 API 密钥”按钮。
然后,您可以指定 API Key 实例如何在您的帐户上运行。您可以添加不同的权限、名称等。
然后,您将获得 API 密钥和密钥,您应该将其存储在安全的地方以供日后使用。就是这样!现在我们将探索 OKX API 功能,并在最后模拟两个简单的交易脚本。
您可以使用 OKX API 利用 tickers 端点获取交易对。使用 OKX API,您需要指定要获取的股票代码类型,即现货、掉期、期货或期权。
让我们导入相关库并获取所有现货交易对。为了清理,我们将数据放入 pandas 数据框中,删除instType
又名“SPOT”列并打印最后 5 个转置的值。
import requests
import pandas as pd
url = 'https://www.okx.com'
tickers = pd.DataFrame((requests.get(url+'/api/v5/market/tickers?instType=SPOT').json())['data'])
tickers = tickers.drop('instType', axis=1)
tickers.tail().T
在这里我们看到 SPOT 市场有 505 个交易对,这是一个不错的数字。要查看其余交易对,只需将端点中的“SPOT”更改为您感兴趣的交易对(即“FUTURES”)。
要使用 OKX API 获取价格数据,您需要在所需端点中指定工具 ID。工具 ID 由交易对 + 其所属的市场组成。让我们将其编码出来:
ticker = requests.get(url+'/api/v5/market/ticker?instId=BTC-USD-SWAP').json()
ticker
{'code' : '0',
'msg': '',
'data': [{'instType': 'SWAP',
'instId': 'BTC-USD-SWAP',
'last': '56143.2',
'lastSz': '5',
'askPx': '56145.4',
'askSz': '1475',
'bidPx': '56145.3',
'bidSz': '538',
'open24h': '58578.6',
'high24h': '59012',
'low24h': '54561.2',
'volCcy24h': '22600.2617',
'vol24h.: '12824931',
'ts': '1620119907853',
'sodUtc0': '57204.8',
'sodUtc8': '57653.4'}]}
要使用 OKX API 获取历史数据,您需要决定使用哪个端点,因为历史数据有 4 个端点。然后您可以通过所选端点请求数据。
以下列出并解释了 4 个端点:
我将采用第二种方法,并使用预设的蜡烛图获取过去几年的 BTC-USD 数据。我将清理响应并将其放入 pandas 数据框中。
historical = pd.DataFrame((requests.get(url+'/api/v5/market/history-candles?instId=BTC-USDT-SWAP').json())['data'])
historical
这里我们看到 OKX API 返回的数据没有以信息丰富的方式标记。让我们看看文档中的内容,并相应地重命名列。
我们还将把 Unix 时间转换为日期时间,并按升序对值进行排序。
historical.columns= ["Date","Open","High","Low","Close","Vol","volCcy"]
historical['Date'] = pd.to_datetime(historical['Date'], unit='ms')
historical.set_index('Date', inplace=True)
historical.sort_values(by='Date')
historical
太好了,我们现在可以使用指标并利用这些数据做一些事情。
OKX API 不具备指标创建功能,但我们可以利用 pandas 库或为指标构建的更复杂的 btalib 库自行完成。
让我们根据数据创建一个简单的 20 SMA,并将其全部放在一个漂亮的图表中:
historical['20 SMA'] = historical.Close.rolling(20).mean()
historical.tail()
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()
可以使用 OKX API 获取订单簿数据,方法是使用获取订单簿端点并指定工具 ID 和订单簿深度来检索数据。API 返回买卖价分拆的数据。
book = requests.get(url+'/api/v5/market/books?instId=BTC-USD-SWAP&sz=10').json()
book['data']
如果您想将出价和要价拆分到各自的数据框中,您可以执行以下操作:
ask = pd.DataFrame(book['data'][0]['asks'])
bid = pd.DataFrame(book['data'][0]['bids'])
ask
我们再次用数字代替了信息列。让我们以第一行为例,解释一下每个数字的含义:
现在,让我们从两个数据框中取出 0、1 和 3,并将它们合并为一个。
bid.pop(2)
ask.pop(2)
df = pd.merge(bid, ask, left_index=True, right_index=True)
df = df.rename({"0_x":"Bid Price","1_x":"Bid Size", "3_x":"Bid Amount",
"0_y":"Ask Price","1_y":"Ask Size", "3_y":"Ask Amount"}, axis='columns')
df.head()
要使用 OKX API 获取交易数据,您需要在 Get Trades 端点上执行请求。操作方法如下:
trades = requests.get(url+'/api/v5/market/trades?instId=BTC-USDT').json()
trades['data']
[{'instld': 'BTC-USDT',
'side': 'sell',
'sz': '0.00928',
'px': '54118.4',
'tradeId.: '177167228',
'ts': '1620149876536'},
{'instID': 'BTCUSDT',
'side': 'buy',
'sz': '0.00002267',
'px': '54118.5',
'tradeId': '177167227',
'ts': '1620149876291'},
除了价格参数之外,使用我们将要使用的OKX SDK启动市价订单和限价订单时还有一点区别。
不同之处在于您指定尺寸(sz
)参数时。使用市价单时,尺寸将由股票代码的第二个符号指定,反之亦然。
sz
为了说明这一点,以下两个订单都将购买价值 20 美元的 ETH,但市价单将关注 USDC 部分,而限价单将关注 ETH 部分。这就是参数不一样的原因。
# Limit Order
tradeAPI.place_order(instId='ETH-USDC', tdMode='cash', side='buy',
ordType='limit', sz='0.0093', px='2159.00')
# Market Order
tradeAPI.place_order(instId='ETH-USDC', tdMode='cash', side='buy',
ordType='market', sz='20')
在第一个示例中,我将向您展示如何正确安全地根据指定要求启动订单。我们想要做的事情是当 ETH 达到某个价格(例如 3000 美元)时启动 BTC 交易。
为了实现这一点,我们需要设置订单基础,然后创建一个循环来检查价格水平是否被触及。如果价格被触及,我们将执行市价订单。相反,我们将继续循环。
当价格执行后,我们会等待几秒钟,然后检查订单是否真的成交。这一额外步骤对于您的交易策略非常重要,因为交易所服务器可能会遇到一些问题。
现在我们已经有了主要想法,是时候开始交易了。请注意,我们将为此使用 OKX python SDK 。
import okx.Trade_api as Trade
import requests, time
api_key = ""
secret_key = ""
passphrase = ""
instId = "ETH-USDC"
flag = '0'
tradeAPI = Trade.TradeAPI(api_key, secret_key, passphrase, False, flag)
while True:
try:
ticker = requests.get('http://www.okx.com/api/v5/market/ticker?instId=BTC-USDC').json()
print(ticker['data'][0]['bidPx'])
except Exception as e:
print(f'Unable to obtain ticker: {e}')
if float(ticker['data'][0]['bidPx']) >= 32000.00:
try:
result = tradeAPI.place_order(instId=instId, tdMode='cash', side='buy',
ordType='limit', sz='0.005', px='2000.00')
ordId = result['data'][0]['ordId']
except Exception as e:
print(f'Unable to execute order: {e}')
time.sleep(2)
try:
check = tradeAPI.get_orders(instId, ordId)
except Exception as e:
print(f'Unable to check order: {e}')
if check['data'][0]['state'] == 'canceled':
print('Order was canceled.')
break
else:
print('Order was executed!')
break
else:
print('Requirement not reached.')
time.sleep(15)
主要任务是当 BTC 在过去 5 分钟内波动 5% 时执行 ETH 交易。这意味着我们需要创建一个循环来获取两种加密货币的价格并计算两者之间的百分比变化。
如果百分比变化小于 5%,程序将休眠 5 分钟并再次计算百分比变化。如果百分比变化等于或大于 5%,则交易将执行。
交易执行后,我们将休眠几秒钟,然后检查交易是否已完成。现在逻辑已经设置好,是时候编写代码了:
import okx.Trade_api as Trade
import requests, time
api_key = ""
secret_key = ""
passphrase = ""
instId = "ETH-USDC"
flag = '0'
tradeAPI = Trade.TradeAPI(api_key, secret_key, passphrase, False, flag)
while True:
try:
old = requests.get('http://www.okx.com/api/v5/market/ticker?instId=BTC-USDC').json()
print(old['data'][0]['bidPx'])
except Exception as e:
print(f'Unable to obtain ticker: {e}')
time.sleep(300)
try:
new = requests.get('http://www.okx.com/api/v5/market/ticker?instId=BTC-USDC').json()
print(new['data'][0]['bidPx'])
except Exception as e:
print(f'Unable to obtain ticker: {e}')
percent = ((float(new['data'][0]['bidPx']) - float(old['data'][0]['bidPx'])) / float(old['data'][0]['bidPx'])) * 100
if percent >= 5:
try:
result = tradeAPI.place_order(instId=instId, tdMode='cash', side='buy',
ordType='limit', sz='0.005', px='2000.00')
ordId = result['data'][0]['ordId']
except Exception as e:
print(f'Unable to execute order: {e}')
time.sleep(2)
try:
check = tradeAPI.get_orders(instId, ordId)
except Exception as e:
print(f'Unable to check order: {e}')
if check['data'][0]['state'] == 'canceled':
print('Order was canceled.')
break
else:
print('Order was executed!')
break
else:
print(f'Requirement not reached. Percentage move at {percent}')
要使用 OKX API 取消订单,您只需访问“取消订单”端点。以下是 OKX API SDK 文档中的示例代码:
import okx.Trade_api as Trade
tradeAPI = Trade.TradeAPI(api_key, secret_key, passphrase, False, flag)
tradeAPI.cancel_order(instId, ordId, clOrdId)