CCXT

Python交易所应用包ccxt:学一抵百

2019-05-14  本文已影响0人  杨卫祥_老杨提醒

在上篇文章“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获取交易所的市场数据、交易相关、账户操作三大类型数十种用法,基本上能满足日常使用。先有印象,在使用时来查询调用就可以了,最关键的是学一抵百,上百个交易所在这些功能上基本通用,大大提高效率!

上一篇下一篇

猜你喜欢

热点阅读