美文网首页CCXT
Python交易所应用包ccxt:学一抵百

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

作者: 杨卫祥_老杨提醒 | 来源:发表于2019-05-14 23:50 被阅读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获取交易所的市场数据、交易相关、账户操作三大类型数十种用法,基本上能满足日常使用。先有印象,在使用时来查询调用就可以了,最关键的是学一抵百,上百个交易所在这些功能上基本通用,大大提高效率!

    相关文章

      网友评论

        本文标题:Python交易所应用包ccxt:学一抵百

        本文链接:https://www.haomeiwen.com/subject/phwyaqtx.html