更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。

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

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

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

CCXT的显式调用与隐式调用

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

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

import ccxt
binance = ccxt.binance()
okex = ccxt.okex()
spot_symbol = "BTC/USDT"
# fetch_order_book
spot_depth = binance.fetch_order_book(spot_symbol)
spot_depth = okex.fetch_order_book(spot_symbol)
# limit_buy_order
binance.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中的描述一样。由此可以判断,我们调用隐式方法的思路是正确的。

隐式调用:接收行情

我们刚才调用的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隐式方法。

隐式调用:交易

我们知道,交易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"]

写在最后

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

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

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

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

想要获取本次分享的完整代码,或是任何关于数据分析、量化投资的问题,欢迎添加技术宅微信:sljsz01,与我交流


往期干货分享推荐阅读

分享一个年化15%以上的无风险套利机会

网格交易系统开发

通过深度学习股价截面数据分析和预测股票价格

Omega System Trading and Development Club内部分享策略Easylanguage源码

一个真实数据集的完整机器学习解决方案(下)

一个真实数据集的完整机器学习解决方案(上)

如何使用交易开拓者(TB)开发数字货币策略

股指期货高频数据机器学习预测

如何使用TradingView(TV)回测数字货币交易策略

如何投资股票型基金?什么时间买?买什么?

【数量技术宅|量化投资策略系列分享】基于指数移动平均的股指期货交易策略

AMA指标原作者Perry Kaufman 100+套交易策略源码分享

【 数量技术宅 | 期权系列分享】期权策略的“独孤九剑”

【数量技术宅|金融数据系列分享】套利策略的价差序列计算,恐怕没有你想的那么简单

【数量技术宅|量化投资策略系列分享】成熟交易者期货持仓跟随策略

如何获取免费的数字货币历史数据

【数量技术宅|量化投资策略系列分享】多周期共振交易策略

【数量技术宅|金融数据分析系列分享】为什么中证500(IC)是最适合长期做多的指数

商品现货数据不好拿?商品季节性难跟踪?一键解决没烦恼的Python爬虫分享

【数量技术宅|金融数据分析系列分享】如何正确抄底商品期货、大宗商品

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

【数量技术宅 | Python爬虫系列分享】实时监控股市重大公告的Python爬虫

如何利用CCXT交易数字货币合约的更多相关文章

  1. 神经网络与数字货币量化交易系列(1)——LSTM预测比特币价格

    首发地址:https://www.fmz.com/digest-topic/4035 1.简单介绍 深度神经网络这些年越来越热门,在很多领域解决了过去无法解决的难题,体现了强大的能力.在时间序列的预测 ...

  2. 如何使用交易开拓者(TB)开发数字货币策略

    更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 为何使用交易开拓者(TB)作为回测工具 交易开拓者(后文以TB简称)是一个支持国内期货市场K线 ...

  3. 一步步教你创建自己的数字货币(代币)进行ICO

    本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 ...

  4. ERC20数字货币ProxyOverflow存在漏洞

    ERC20的ProxyOverflow漏洞造成影响广泛,本文将对其攻击方法进行分析,以便于智能合约发布者提高自身代码安全性以及其他研究人员进行测试.本文选择传播广泛.影响恶劣的SMT漏洞(CVE-20 ...

  5. [币严BIZZAN区块链]数字货币交易所钱包对接之比特币(BTC)

    在币严BIZZAN开发数字货币交易所的过程中,一共有两大难点,一个是高速撮合交易引擎,另一个是钱包对接,这两者是我们团队以前没有接触过的.这个系列的文章主要介绍数字货币交易所钱包对接实现技术.第一个要 ...

  6. 央行辟谣未发行“DC/EP”和“DCEP” 法定数字货币仍在测试阶段

    http://www.sohu.com/a/354709423_100157595 近期,中国央行再度就法定数字货币发布公告,指出目前系统仍处于研究测试过程中,市场上交易“DC/EP”或“DCEP”均 ...

  7. 关于央行数字货币DCEP的几个特点的思考(转)

    近期,央行即将推出数字货币,无论在金融领域还是在资本市场,央行数字货币这一话题都被炒的很火热.央行研发的数字货币叫做DCEP(DC,DigitalCurrency,是数字货币:EP,Electroni ...

  8. DCEP:中国自己的数字货币

    DCEP:中国自己的数字货币 https://cloud.tencent.com/developer/news/435883 文章来源:企鹅号 - 星星观察 广告关闭 11.11 智慧上云 云服务器企 ...

  9. [转帖]都在说DCEP,央行数字货币究竟跟你有什么关系?

    都在说DCEP,央行数字货币究竟跟你有什么关系? https://kuaibao.qq.com/s/20191104A0G1D300?refer=spider   黄奇帆指出,DCEP 使得交易环节对 ...

  10. [转帖]DCEP:中国自己的数字货币

    DCEP:中国自己的数字货币 https://cloud.tencent.com/developer/news/435883 前面我们讨论了Libra的革命性和局限性,接下来我想跟你聊一件重要的事,那 ...

随机推荐

  1. 28. 干货系列从零用Rust编写正反向代理,项目日志的源码实现

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  2. C++ LibCurl实现Web指纹识别

    Web指纹识别是一种通过分析Web应用程序的特征和元数据,以确定应用程序所使用的技术栈和配置的技术.这项技术旨在识别Web服务器.Web应用框架.后端数据库.JavaScript库等组件的版本和配置信 ...

  3. python列表之部分列表——切片

    目录 切片 全索引 半索引 负数索引 遍历切片 复制列表 切片 全索引 我们平常可能需要使用一个列表中的子列表,也就是部分元素,这个时候我们就需要用到切片这个功能啦 要创建切片,就如同range()函 ...

  4. java中Calendar日历类型常见方法

    Calendar是Java中常用的时间处理工具之一,它提供了很多日历类型常见方法,下面是一些常用的方法及对应的代码和运行结果. 1. 如何创建 Calendar 日历对象 Calendar 是一个抽象 ...

  5. 小心C#中的只读结构体成员

    示例 我们先来看一段结构体的代码 (基于 VS2022 + .NET 8.0) public struct MyStruct(int number) { public int Number = num ...

  6. ABAP 生产订单长文本增强 <销售计划 、物料独立需求 长文本带入 计划订单-生产订单 >

    计划订单长文本带入生产订单 尝试在生产订单保存后 用 creat_text 函数 去创建长文本,发现前台不显示,查看 文本抬头底表 STXL 发现有值 ,用READ 函数 读取 能读. DATA:td ...

  7. Linux笔记02: Linux环境_2.3 Linux网络连接

    2.3 Linux网络连接 本节介绍VMware Workstation Player 17下CentOS 7的网络连接. 2.3.1 VMware网络类型 VMware提供的网络连接有5种: ●桥接 ...

  8. C++学习笔记四:变量与数据类型(布尔型与字符型)

    今天来整理一下布尔型和字符型变量的基本使用方法1)布尔型变量1. 声明和初始化一个布尔类型的变量占据1 Byte空间,数值0代表false,其他非0数值代表true bool red_light {f ...

  9. 【Python】【OpenCV】定位二维码

    相较于BarCode,QRCode有明显的特征区域,也就是左上角.右上角.左下角三个"回"字区域,得益于hierarchy中,父子关系的轮廓是连续的(下标),所以这个时候我们就可以 ...

  10. Kafka干货之「零拷贝」

    一.背景 周所周知,Kafka是一个非常成熟的消息产品,开源社区也已经经历了多年的不断迭代,特性列表更是能装下好几马车,比如:幂等消息.事务支持.多副本高可用.ACL.Auto Rebalance.H ...