网易首页 > 网易号 > 正文 申请入驻

如何利用CCXT交易数字货币合约

0
分享至

  

  更多精彩内容,欢迎关注公众号:数量技术宅,欢迎加入量化学院,与180位来自各行各业优秀的同学一同交流量化观点。

  对于币圈量化老司机来说,相信或多或少都有接触过ccxt这个接口,ccxt为我们提供了多交易所统一的标准格式API,方便我们做两件事:第一,跨市场的策略,可以轻松对接不同交易所;第二,同一个策略,可以在几乎不修改代码的前提下,移植到不同的交易所。

  大多数情况下,我们使用ccxt接口连接行情、交易,默认接入的都是币币交易(spot)。其实,ccxt还有一个强大的隐藏功能,它也能用来交易数字货币期货,也就是我们通常说的合约,包括交割合约、永续合约、币本位合约、U本位合约,只要ccxt封装了交易所的相关API,我们就可以实现对应的交易。有了这个利器,我们甚至可以用ccxt做一些期现套利,以及跨交易所的期货策略。

  ccxt的官方帮助文档中,并没有详细介绍如何用ccxt交易合约,我们通过这篇文章为大家总结。

  01

  CCXT的显式调用与隐式调用

  介绍如何使用ccxt调用期货方法之前,我们先来看两个重要的概念:显式调用与隐式调用。

  显式调用很好理解,就算用ccxt封装的统一接口,来完成行情获取、交易等相关的操作。对于ccxt所支持的每一个交易所,我们都可以用同样的方式,只需更改交易所的名称,即可用同样的代码,在不同交易所,完成同样的操作。我们来看以下代码示例:

  
import ccxtbinance = ccxt.binance()okex = ccxt.okex()spot_symbol = "BTC/USDT"# fetch_order_bookspot_depth = binance.fetch_order_book(spot_symbol)spot_depth = okex.fetch_order_book(spot_symbol)# limit_buy_orderbinance.create_limit_buy_order(spot_symbol, amount, price)okex.create_limit_buy_order(spot_symbol, amount, price)

  关于显式调用,ccxt的帮助文档中已经介绍的比较详细了,大家有不清楚的可以参照github上ccxt的manual,我们在这里不在赘述。我们重点来看ccxt的隐式调用。隐式调用在ccxt的官方文档中,几乎是一笔带过,仅仅告诉我们,使用dir()命令,我们可以获取该交易所ccxt支持的隐式方法。

  

  我们根据上述的说明,以币安交易所为例,通过dir(ccxt.binance()),查看币安交易所的隐式方法,由于隐式的方法实在太多,我们只能截取部分方法来显示。

  

  

  

  在这些方法中,我们看到了一些共同的抬头,比如dapi、fapi、sapi,其实,这些抬头的API,就分别是币安某个合约接口(比如u本位永续、币本位交割、币本位永续)的特有类别的API。如此多的方法,让我们看的眼花缭乱,那么我们如何知道,每个方法该如何使用,参数又该如何传入、传入哪些。

  这就需要我们对照币安交易所的API,来为大家解释了。我们以u本位合约获取所有交易对的api为例,我们先看币安api说明对于这个方法的描述,仔细看这个api的地址GET /fapi/v1/exchangeInfo。

  

  我们再在dir(ccxt.binance())的显示结果中搜索“exchangeInfo”。我们看到fapi开头的方法中,有如下几个,这些方法,其实是一个方法(ccxt分为驼峰和下划线,两种命名方式)

  fapiPublicGetExchangeInfo,这个方法,是将GET /fapi/v1/exchangeInfo这个原始api的关键词,按照一定的顺序排列组合起来,并且在里面加上了Public。因为这是一个所有人都可以查询得到的公有方法。如果方法中包含Private字样,说明该方法是原始api中的私有方法。所以说,我们对于每个原始api,都可以用他的关键词,在ccxt的隐式方法列表中查询,如果能够查询到该关键词的方法,而且方法的其他字段,也与该方法的原始请求地址一致,那么说明该方法,极有可能就是原始api封装的隐式方法。

  

  我们通过实例来验证,由于fapiPublicGetExchangeInfo是不需要传入参数的。我们直接调用:

  symbols = binance.fapiPublicGetExchangeInfo(),这个方法,并看一下这个方法返回的symbols 结果。通过比较ccxt隐式方法返回的结果,与api说明中的返回一致,取到了u本位所有的交易币种信息,的确和api中的描述一样。由此可以判断,我们调用隐式方法的思路是正确的。

  

  02

  隐式调用:接收行情

  刚才调用binance.fapiPublicGetExchangeInfo(),已经给我们列出了所有在币安能够交易的U本位合约,并且每个symbols list里的symbol字段,就是币安交易所的u本位合约标准字段。我们以'BTCUSDT'字段为例,调用U本位合约的隐式api,来获取深度行情。

  首先,还是来看一下币安u本位合约行情的api说明。与exchangeInfo不同的是,深度行情的获取,需要传入参数,参数列表有两个,分别是symbol和limit,大家需要特别注意后面这个是否必需的字段,Yes代表该参数必须传,No代表该参数可以传,也可以按系统指定的默认值来。

  

  我们再按照刚才的规则,找到ccxt对于币安u本位合约获取深度行情的隐式方法:fapiPublicGetDepth。该函数,同样符合我们之前所推断的命名规则。我们调用该函数,按照格式要求传入symbol函数,执行深度数据的获取。

  
ba_futures_symbol = "BTCUSDT"future_depth = binance.fapiPublicGetDepth({"symbol":ba_futures_symbol})

  

  通过返回结果可以看到,我们成功的使用隐式方法,调取到了币安u本位BTCUSDT合约的深度数据。

  而对于OKEX交易所来说,我们也可以遵循同样的步骤,来获取OK我们需要币种(合约)的深度数据。我们还是通过print(dir(ccxt.okex())),打印ccxt支持的okex交易所的所有隐式方法。

  

  我们再来看OKEX交易所的API,以交割合约为例,我们同样找到API关于获取深度行情的方法,以及需要传入的参数,这个方法的关键词包括”futures"、"instruments“、"book"等。

  

  我们用上述关键词,在ccxt okex的所有隐式方法中寻找,可以找到对应的方法:

  futuresGetInstrumentsInstrumentIdBook,他的命名结构、命名逻辑,与ok的api传入地址很相似。

  

  我们调用这个方法来进行测试,这里需要注意的是,对于okex交易所,我们传入的合约ID(instrument_id)需要是具体的交割合约,比如我们以BTC-USD-0625举例,与此同时,再传入一个辅助的size参数。由于我们的size选择的是50档的盘口,返回的也是50档的深度数据。

  
ok_futures_symbol = "BTC-USD-0625"future_depth = okex.futuresGetInstrumentsInstrumentIdBook({"instrument_id":ok_futures_symbol, "size":50})

  

  通过这个例子,可以看到ok交易所,我们也可以用同样的逻辑+方法,获取到ccxt隐式方法封装的合约深度。对于其他交易所的隐式行情调用,我们都可以以此类推,在这里就不一一详述了,大家对哪个交易所有兴趣,都可以print(交易所.dir()),并且与该交易所的官方api文档进行比对,调用相应命名规则的ccxt隐式方法。

  03

  隐式调用:交易

  我们知道,交易api一般来说都比行情api更加复杂一些,但我们调用api的基本流程,应该来说不会发生变化,依然是先找到交易所api文档中,对应方法的地址,再根据地址中的关键词、传入参数,调用ccxt隐式交易api。

  先看币安交易所,还是以u本位api举例,来看用的最多的下单函数的说明。下单函数请求地址:POST /fapi/v1/order。所以我们必须要找到包含这些关键词的ccxt隐式api对应方法,并且,按照binance的参数传入规则,将对应的下单参数传入。

  

  ccxt中对应的交易方法的名称叫做fapiPrivatePostOrder,我们将该方法名称拆分:fapi、Private、Post、Order,除了Private,其余正好对应了原始api的关键词字段。Private是ccxt为每个隐式的私有方法,都会添加的前缀。找到了隐式方法,再根据api文档的说明,我们就可以传入合法参数进行下单了。以下,就是一个利用隐式api下市价单的例子,在下完单的同时,我们在返回值中提取出orderId,为后续的查询订单、撤单方法使用。

  
order_res = binance.fapiPrivatePostOrder({"symbol": _symbol,"side": _direction,"positionSide": _positionside,"type": "MARKET","quantity": _amount,"timestamp": severtime})orderid = order_res['orderId']

  对于OK交易所来说,也是同理,我们先查看OK交易所的原始api,同样以下单函数为例。OK交易所的下单api,有两个重要的特征,大家需要特别注意:第一,传入的参数类型都是string,哪怕背后对应的是整数类型,传入时也要转换为string,不然就会报错。第二,下单的数量,必须转换为合约的张数,其他交易所,例如币安,在u本位合约下单时,允许传入例如下单0.01btc这样的合约单位,但OK交易所不行,必须转换为整数,不然订单就无法提交成功。

  

  此外,instrument_id、type等参数,也需要严格的按照交易所api的要求来传递,我们来看下方的例子。

  
order_res = okex.futures_post_order({"client_oid": "test",'instrument_id': _futsymbol,'type': str(1),'size': str(1),'order_type': '0','match_price': '1'})orderid = order_res["order_id"]

  04

  写在最后

  写到这里,相信大家对ccxt如何调用交易所隐式api,已经有了很清楚的认识了。ccxt的隐式调用,虽然不如显式的方便(对于不同交易所,我们还是需要修改对应代码的,无法统一定制)。

  我们这里以ok、币安举例,是因为币安的现货、u本位合约、币本位合约,okex的现货、交割合约、永续合约,再到期权,ccxt都封装在了隐式方法中,对于这两个交易所,理论上所有的api功能,我们都可以通过调用隐式的方法实现,免去了我们自己去对接交易所底层api,处理那些鉴权、现货期货api合并等麻烦的问题。

  但是对于其他交易所来说,就没有那么幸运了,比如火币交易所,ccxt隐式提供的api就不包括hbdm,也就是火币合约相关的隐式方法,再比如gateio交易所,也只有现货的api提供。

  但是,ccxt起码是给大家在开发数字货币实盘系统提供了另外一个途径,在开发某个交易所的交易系统前,我们可以先通过dir方法,看一下ccxt的隐式接口是否齐全,如果齐全,我们借道ccxt就能够开发出一个完整功能的系统,如果该交易所隐式接口不齐全,我们再考虑自行对接交易所的api,由此,我们的开发效率也能够进一步的提高。

  欢迎加入数量技术宅知识星球:量化学院,知识星球每日更新,内有更多量化干货,等着你来学习。量化学院=公众号全策略+星球独家量化干货+答疑+日更。欢迎订阅量化学院,用一年的时间,做一件让自己感动的事。

  欲加入量化学院的同学,请添加技术宅微信sljsz01领取星球优惠券,限最后5位优惠名额。

  往期干货

  数字货币无风险收益率又双叒叕扩大了!!! 分享一个年化15%以上的无风险套利机会 通过深度学习股价截面数据分析和预测股票价格 Omega System Trading and Development Club内部分享策略Easylanguage源码

  Omega System Trading and Development Club内部分享策略源码 (第二期)

  一个真实数据集的完整机器学习解决方案(上) 一个真实数据集的完整机器学习解决方案(下) 股指期货高频数据机器学习预测 如何使用TradingView(TV)回测数字货币交易策略
【数量技术宅|量化投资策略系列分享】基于指数移动平均的股指期货交易策略
AMA指标原作者Perry Kaufman 100+套交易策略源码分享 【数量技术宅|量化投资策略系列分享】成熟交易者期货持仓跟随策略 【数量技术宅|量化投资策略系列分享】多周期共振交易策略

  【数量技术宅|量化投资策略系列分享】股指期货IF分钟波动率统计策略

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐

33+10+13却无缘今日最佳!对不起兰德尔,你碰到NBA联盟第一人了

体育就你秀
2021-05-16 13:11:36

临沂男童被樱桃堵住气管,父母用海姆立克法把儿子从鬼门关救回

社会潮流时代
2021-05-16 10:36:33

明天A股就要开盘,周末发生了7个重磅消息,对明日影响如何解读?

A股无小事
2021-05-16 10:40:35

车晓身材还挺有内容的,穿着“迷宫”透肉纱裙,看起来太撩人了

火星时尚
2021-05-16 13:28:01

印媒:被男网友骗见父母,德里一女子遭25名男子轮奸

环球网资讯
2021-05-16 17:14:15

一些不堪入目的闺蜜聊天截图

有趣青年
2021-05-16 00:08:04

蔡英文做梦都没想到,为了获得大陆疫苗,台“友邦”已准备“投降”

海纳新闻
2021-05-16 09:28:56

易波:因长得太帅不甘心送快递,整容成谢霆锋,如今逆袭成富豪!

mx八卦城
2021-05-15 23:10:28

香港慈母以逾900万元为儿子购入极高层、实用面积45平方的大屋

智能理财小助手
2021-05-16 16:41:50

一错再错!美国,彻底没救了...

功夫财经
2021-03-21 11:59:46

狗狗币Doge挺进1美元的至暗时刻

阿力博士
2021-05-16 12:00:40

荒唐至极!连新冠病毒感染者都不放过,印度医院男员工兽行曝光

绝对观察
2021-05-15 17:17:13

胡明轩宿舍内景曝光!亮点很多,杜锋说的没错,是要管管他

路人聊篮球
2021-05-16 19:18:43

刚刚,华晨宇工作室发布声明

每日经济新闻
2021-05-13 21:47:13

帮美国一起“卡脖子”,自认明智之举,差点遭美企“反杀”

财事有道
2021-05-16 10:00:21

传播链再延长!辽宁新增4确诊5无症状,戴口罩诊所大夫也中招!3天26名本土感染,吴尊友:源头很可能是这里!单日疫苗接种量创新高

中国基金报
2021-05-16 08:52:53

被可口可乐押宝,这个品牌能否成为运动饮料新巨头

体育产业生态圈
2021-05-15 19:57:43

风力发电机的危害有多大?应该立即停止!还是该加大推广力度?

星辰大海路上的种花家
2021-05-15 13:35:39

两性关系之间,女人最容易出轨的年龄,男人必须牢记!

无忧故事会
2021-05-16 16:40:40

播出2集,收视就直接拿下第1,这部《中流击水》到底有多“横”?

立场影视
2021-05-16 17:27:38
2021-05-17 00:49:07
数量技术宅
数量技术宅
爱好数据分析量化投资的技术宅
30文章数 29关注度
往期回顾 全部

科技要闻

SpaceX使用八手火箭发射52颗星链卫星和两颗客户卫星

头条要闻

女子遭家暴头骨开裂昏迷63天 儿子:希望父亲受惩罚

头条要闻

女子遭家暴头骨开裂昏迷63天 儿子:希望父亲受惩罚

体育要闻

因扎吉:现在只能为拉齐奥加油 我们没能尽早杀死比赛

娱乐要闻

宋佳台下观秀比模特抢眼 知性优雅

财经要闻

汽车要闻

补贴后售13万-15.59万 思皓E40X上市

态度原创

游戏
房产
家居
旅游
公开课

PlayStation中国发布国行倒计时海报

房产要闻

深圳实施住房建设计划 居住用地供应有望再创新高

家居要闻

港男月入过万只能带妻儿住7平蜗居 在洗衣机上做饭

旅游要闻

“童话边城”布尔津邀您步入时光往事

公开课

维密超模告诉你:外表不是全部