Python交易所应用包ccxt:学一抵百
在上篇文章“python微信自动提醒应用:交易所价格、订单、余额监控”中我们提到可以使用CCXT非常方便实现交易所API连接,功能强大,支持众多交易所。那我们只要把这个好好研究透,相当于学会一个可以轻松实现135个交易所的连接,真是以一抵百。这篇文章我们就来深入了解下具体功能。官网手册是https://github.com/ccxt/ccxt/wiki/Manual
ccxt安装方式上篇文章已提到,并且我们上篇文章也用到了几个功能,比如行情数据fetch_ticker(symbol) 、下限价单格式create_limit_sell_order(symbol, amount, price)、根据订单号查询订单fetch_order(id, symbol)、余额查询功能fetch_balance()等等,不知你是否还有印象?实际使用时在每个前面加上交易所名字并带个点,比如币安在使用fetch_ticker(symbol) 时就变成binance.fetch_ticker(symbol) ,下同。
我们用到的功能有三大块:市场数据、交易相关、账户操作。
开始之前我们先用API连接交易所,同样,以币安为例,其它交易所,比如火币只需用huobipro代替以下binance即可。
import ccxt
# 创建方式一
binance = ccxt.binance(
{'apiKey':'你的API KEY',
'secret':'你的API Secret'})
# 创建方式二
exchange_id ='binance'
exchange_class =getattr(ccxt, exchange_id)exchange = exchange_class({
'apiKey':'你的API KEY',
'secret':'你的API Secret',
'timeout':30000,
'enableRateLimit':True,
})
这里使用两种方式创建,方法二与方法一的区别在于交易所的名字也成了一个变量,比如说你有多个交易所想放到一个程序里,使用方法二只要把“交易所名字”、API KEY、API secret三个变量当成一组数据,就可以累加多个交易所。
在使用之前我们可以查询下这个交易所支持哪些功能:
# 拥有功能
print(binance.has)
结果如下,现在可能看不懂,没关系,接下来我们就仔细聊聊。
一、市场数据
1.订单簿fetch_order_book(symbol, limit)
比如以BTC/USDT为例,以下可以获得目前买一价到买五价及对应数量,卖一价到卖五价及对应数量,limit=5的意思是获取5对数据。
symbol ='BTC/USDT'
order_book = binance.fetch_order_book(symbol, limit=5)
print(order_book)
2.行情数据fetch_ticker(symbol)
这个上次提到过,通过它可获得比如最新成交价,买一价,卖一价等等,很常用。
ticker = binance.fetch_ticker(symbol)
print(ticker)
BTC_price =float(ticker['last'])# 币安最新成交价
print("币安BTC成交价(USDT)", BTC_price)
buy_price =float(ticker['bid'])# 获取买一价,字符串不能交易,必须转换成浮点数
sell_price =float(ticker['ask'])# 获取卖一价,
print('买一价', buy_price)
print('卖一价', sell_price)
返回结构如下
二、交易相关
1.下限价单和市价单
下单参数交易对symbol, amount交易数量, pirce交易价格
限价买单create_limit_buy_order(symbol, amount, pirce)
限价卖单create_limit_sell_order(symbol, amount, pirce)
限价单需要指定价格,是最常用的。
注意调试程序时,最好一个一个试,对限价单注意当前价格是否会立马成交,对市价单调试时数量尽可能小
市价买单create_market_buy_order(symbol, amount)
市价卖单create_market_sell_order(symbol, amount)
市价单不需要输入价格
# 下单参数
symbol ="BTC/USDT"
amount =0.001
price =8000
# 限价单
order_info = binance.create_limit_buy_order(symbol, amount, pirce)# 买单
order_info = binance.create_limit_sell_order(symbol, amount, pirce)# 卖单
# 市价单,市价单不需要输入价格
order_info = binance.create_market_buy_order(symbol, amount)# 买单
order_info = binance.create_market_sell_order(symbol, amount)# 卖单
print(order_info['id']) # 返回订单号
print(order_info['info'])
2.订单查询:
查询方法有
根据订单号查询fetch_order(id, symbol)、
根据交易对fetch_orders(symbol, limit)、
查询开放订单fetch_open_orders(symbol, limit) 、
查询已成交订单fetch_closed_orders(symbol, limit)
查询交易历史fetch_my_trades(symbol)
等方式,根据需要输入参数即可
# 订单查询# 根据订单号查询订单信息By Order Id
order_info = binance.fetch_order(id='20508888', symbol)
print(order_info)
print(order_info['remaining'])#剩余
print(order_info['status'])
# 根据交易对查询订单信息, 包括成交、未成交、取消
order_info = binance.fetch_orders(symbol, limit=10)# limit参数控制返回最近的几条
for iin order_info:
print(i['datetime'], i['status'])
# 返回尚未成交的订单
order_info = binance.fetch_open_orders(symbol, limit=10)# limit参数控制返回最近的几条
for iin order_info:
print(i['datetime'], i['status'])
# 返回已成交的订单
order_info = binance.fetch_closed_orders(symbol, limit=10)# limit参数控制返回最近的几条
for iin order_info:
print(i['datetime'], i['status'])
# 查询交易历史
history = binance.fetch_my_trades(symbol)
print(history)
3.撤单cancel_order(id, symbol)
撤单是根据订单号来撤消的,你可能会说我不知道订单号怎么撤消呢?可以根据上条的查询开放订单来获取订单号,或者根据下单后返回信息查询订单号。
# # =====撤单
order_info = binance.cancel_order(id='20508061', symbol)
print(order_info)
三、账户操作
1.获取余额fetch_balance()
可以根据以下代码查询到某一币种的余额。
# 获取账户余额
balance = binance.fetch_balance()
BTC1 =float(balance['BTC']['free'])
print('BTC1', BTC1)# 资产的数量
每种余额会有三种调取方式:
'free'指可用数量;
'used'是已经使用数量,比如正在挂单的;
'total'是总的数量
可根据需要更换上述中['free']来显示不同类型方式。
2.提现Withdraw
不同交易所对提现有不同的规定:
币安提现需要API开放提现功能,并限制IP访问,不用时一定要关掉,提现手续费会从提现数量中扣;
火币需要存储地址后才能提现,没有开关,提现数量必须是扣掉手续费后的数量,并且注意小数位要求,否则会报错;
比特儿需要使用过的地址才能提现等等。
# 币安提现,注意提现需要API开放,限制IP,不用之后一定要关了
amount =1 # 币安手续费从这个数量中扣
address ='你的提现地址'
withdraw = binance.withdraw('BTC', amount, address, tag=None, params={})
print(withdraw)
针对有标签或备注的币种提现如何操作?比如EOS、GXC、ATOM等,在提现参数中输入标签,如tag='105494' 否则tag=None
提现数量如果全部提完如何设定?假如账户中有ATOM数量为100.0049125,币安提现时数量可以直接输入100.0049125就行,因为手续费从中扣掉了。而火币就要注意,因为提现数量必须是扣掉手续费后的数量,假设手续费0.005,那么提现数量应为100.0049123-0.005=99.9999125,但火币又有精度要求比如6位,如果用round(ATOM2 - 0.005, 6)就是对99.9999125四舍五入会变成=99.999913,你会发现大于应提数量,会报错,所以用round(ATOM2 - 0.0051, 6)进行调整,数量多减0.0001
这个比较复杂,我也是掉了很多坑后摸索出来的,实际使用当中就需要根据报错内容来查找原因。
# 针对有标签提现
balance2 = huobipro.fetch_balance()#提ATOM
ATOM2 =float(balance2['ATOM']['free'])
address1 ='cosmos1rw62phusuv9vzraezr55k0vsqssvz6ed52zyrl' # ATOM地址 tag='105494'
amount1 =round(ATOM2 -0.0051, 6)# 提现数量需要扣除手续费0.005, 必须先减再圆整
withdraw1 = huobipro2.withdraw('ATOM', amount1, address1, tag='105494', params={})
print(withdraw1)
3.获取充值地址fetch_deposit_address()
使用场景不多,比如想批量获取账户内ONT的充值地址,有多个账户,如果一个个登陆,非常慢,如果用API就非常方便,币安因暂停充值未成功,火币可以。
# addr = binance.fetch_deposit_address('ONT', params={})['address'] # 币安未成功
addr = huobipro.fetch_deposit_address('ONT', params = {})['address']# 火币
print(addr)
综上, 我们了解了利用ccxt用python获取交易所的市场数据、交易相关、账户操作三大类型数十种用法,基本上能满足日常使用。先有印象,在使用时来查询调用就可以了,最关键的是学一抵百,上百个交易所在这些功能上基本通用,大大提高效率!