加密货币交易所 API 框架 CCXT
Posted linchaolong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密货币交易所 API 框架 CCXT相关的知识,希望对你有一定的参考价值。
CCXT是什么
一个支持 javascript / Python / php 的加密货币交易 API 框架,支持 120 多个加密货币交易所
CCXT项目地址:https://github.com/ccxt/ccxt
CCXT文档地址:https://ccxt.readthedocs.io/en/latest/index.html
CCXT封装了120多个交易所api并统一了调用方法和返回数据格式,所以省掉了对接这么多交易所的麻烦,而且切换交易所也十分方便。
安装CCXT
执行 pip3 install ccxt 命令安装 CCXT
使用 pip3 list 命令查看已安装的 package
public api 与 private api
文档地址:https://github.com/ccxt/ccxt/wiki/Manual#publicprivate-api
CCXT封装了绝大部分交易所的api,他们都继承自Exchange类,并统一了api调用方法。架构如下:
User
+-------------------------------------------------------------+
| CCXT |
+------------------------------+------------------------------+
| Public | Private |
+=============================================================+
│ . |
│ The Unified CCXT API |
│ . |
| loadMarkets . fetchBalance |
| fetchMarkets . createOrder |
| fetchCurrencies . cancelOrder |
| fetchTicker . fetchOrder |
| fetchTickers . fetchOrders |
| fetchOrderBook . fetchOpenOrders |
| fetchOHLCV . fetchClosedOrders |
| fetchStatus . fetchMyTrades |
| fetchTrades . deposit |
| . withdraw |
│ . |
+=============================================================+
│ . |
| Custom Exchange API |
| (Derived Classes And Their Implicit Methods) |
│ . |
| publicGet... . privateGet... |
| publicPost... . privatePost... |
| . privatePut... |
| . privateDelete... |
| . sign |
│ . |
+=============================================================+
│ . |
| Base Exchange Class |
│ . |
+=============================================================+
Public API 包括加载市场信息、获取K线数据、获取OrderBook等等api;
Private API 包括获取账户信息、下单、取消订单等等api;
Private API和Public API区别在于,Private API 需要有 api key 、 api secret 和相关权限才能调用成功,否则会报错。
有的方法个别交易所不一定有,调用前可查交易所实现类中的has的定义,如果为True表示该方法是支持的。
隐式 api
Custom Exchange API 是CCXT中交易所的隐式API,基本都是交易所独有的api,这些 api 没有在代码中显式的定义,但在交易所是实现类的 api 属性中有声明,这些 api 会统一通过基类的 define_rest_api 运行时自动生成。
也可以通过dir查看所有隐式api
# 打印交易所所有隐式api
print(dir(exchange))
如何调用隐式api?
这里以调用OKEX的策略委托下单接口为例,
请求示例:
POST /api/v5/trade/order-algo
body
{
"instId":"BTC-USDT",
"tdMode":"cross",
"side":"buy",
"ordType":"conditional",
"sz":"2",
"tpTriggerPx":"15",
"tpOrdPx":"18"
}
接口文档说明:
调用隐式接口示例代码:
接口调用方法名以下划线连接,参数用键值对集合的形式传入
# 策略委托下单
# 提供单向止盈止损委托 、双向止盈止损委托、计划委托
response = exchange.private_post_trade_order_algo({
'instId': 'ETH-USDT', # 产品ID
'tdMode': 'isolated', # 逐仓
'side': 'sell', # 订单方向 buy:买 sell:卖
'ordType': 'conditional', # 单向止盈止损
'sz': 0.01, # 委托数量
'slTriggerPx': 999, # 止损触发价
"slOrdPx": 999 # 止损委托价
})
print(response)
返回结果:
{'code': '0', 'data': [{'algoId': '341552587589701632', 'sCode': '0', 'sMsg': ''}], 'msg': ''}
在OKEX客户端可以看到止损单已经提交上去了。
代码实战
这里以OKEX的api为例
1. 申请 OKEX api
api申请链接:https://www.okex.com/account/my-api
- 填写备注名和Passphrase,权限一般只选只读和交易,如果没有必要不要选提现
提交成功后,点查看就可以看到自己的api key和api secret了
2. 代码
import ccxt
# =====创建交易所
# 查看支持的交易所
# print(ccxt.exchanges)
# 创建交易所对象
exchange = ccxt.okex5()
# 设置代理
exchange.proxies = {
'http': 'http://127.0.0.1:6666',
'https': 'http://127.0.0.1:6666',
}
# 设置apiKey和apiSecret
exchange.apiKey = ''
exchange.secret = ''
exchange.password = '' # okex特有的参数Passphrase,如果不设置会报错:AuthenticationError: requires `password`
# 加载市场信息
exchange.load_markets()
# 查看支持的交易对
print(exchange.symbols)
# =====Public API
# 获取盘口数据
# order_book = exchange.fetch_order_book(symbol=symbol)
# print(order_book)
# l2_order_book = exchange.fetch_l2_order_book(symbol=symbol)
# print(l2_order_book)
# =====获取账户资产
# 查询余额
# balance = exchange.fetch_balance()
# print(balance['info'])
# print(balance['free']) # 可用资金
# print(balance['used']) # 在途资金
# print(balance['total']) # 总资金
# balance_margin = exchange.fetch_balance({'type': 'trading'}) # 获取margin账户资产
# print(balance_margin['USDT']) # USDT这个资产的数量
# =====下单交易
# 下单参数
# symbol = 'ETH/USDT'
# pirce = 1000
# amount = 0.01
# 下单类型:
# market:margin交易市价单
# limit:margin交易限价单
# exchange market:exchange交易市价单
# exchange limit:exchange交易限价单
# 限价单
# order_info = exchange.create_limit_buy_order(symbol, amount, pirce, {'type': 'limit'}) # margin买单
# order_info = exchange.create_limit_sell_order(symbol, amount, pirce, {'type': 'limit'}) # margin卖单
# 市价单,市价单不需要输入价格
# order_info = exchange.create_market_buy_order(symbol, amount, {'type': 'market'}) # margin买单
# order_info = exchange.create_market_sell_order(symbol, amount, {'type': 'market'}) # margin买单
# 返回内容的数据结构:https://github.com/ccxt/ccxt/wiki/Manual#placing-orders
# print(order_info['id'])
# print(order_info['info'])
# 获取待成交的订单
# open_orders = exchange.fetch_open_orders()
# print(open_orders)
# 取消订单
# exchange.cancel_order(open_orders[0]['info']['ordId'], symbol=symbol)
# =====隐式api调用
# 打印交易所所有隐式api
# print(dir(exchange))
# 策略委托下单
# 提供单向止盈止损委托 、双向止盈止损委托、计划委托
# response = exchange.private_post_trade_order_algo({
# 'instId': 'ETH-USDT', # 产品ID
# 'tdMode': 'isolated', # 逐仓
# 'side': 'sell', # 订单方向 buy:买 sell:卖
# 'ordType': 'conditional', # 单向止盈止损
# 'sz': 0.01, # 委托数量
# 'slTriggerPx': 999, # 止损触发价
# "slOrdPx": 999 # 止损委托价
# })
# print(response)
# 获取当前账户下未触发的策略委托单列表
response = exchange.private_get_trade_orders_algo_pending({
'instId': 'ETH-USDT', # 产品ID
'ordType': 'conditional', # 单向止盈止损
})
print(response)
if response['data']:
cancel_algos = []
for order in response['data']:
cancel_algos.append({
'algoId': order['algoId'], # 策略委托单ID
'instId': order['instId'], # 产品ID
})
# 撤销策略委托订单,每次最多可以撤销10个策略委托单
response = exchange.private_post_trade_cancel_algos(cancel_algos)
print(response)
以上是关于加密货币交易所 API 框架 CCXT的主要内容,如果未能解决你的问题,请参考以下文章