加密货币交易所 API 框架 CCXT

Posted linchaolong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加密货币交易所 API 框架 CCXT相关的知识,希望对你有一定的参考价值。

目录

CCXT是什么

一个支持 javascript / Python / php 的加密货币交易 API 框架,支持 120 多个加密货币交易所

CCXT项目地址:https://github.com/ccxt/ccxt

CCXT文档地址:https://ccxt.readthedocs.io/en/latest/index.html

CCXT封装了120多个交易所api并统一了调用方法和返回数据格式,所以省掉了对接这么多交易所的麻烦,而且切换交易所也十分方便。

安装CCXT

执行 pip3 install ccxt 命令安装 CCXT

使用 pip3 list 命令查看已安装的 package

public api 与 private api

文档地址:https://github.com/ccxt/ccxt/wiki/Manual#publicprivate-api

CCXT封装了绝大部分交易所的api,他们都继承自Exchange类,并统一了api调用方法。架构如下:

                                 User
    +-------------------------------------------------------------+
    |                            CCXT                             |
    +------------------------------+------------------------------+
    |            Public            |           Private            |
    +=============================================================+
    │                              .                              |
    │                    The Unified CCXT API                     |
    │                              .                              |
    |       loadMarkets            .           fetchBalance       |
    |       fetchMarkets           .            createOrder       |
    |       fetchCurrencies        .            cancelOrder       |
    |       fetchTicker            .             fetchOrder       |
    |       fetchTickers           .            fetchOrders       |
    |       fetchOrderBook         .        fetchOpenOrders       |
    |       fetchOHLCV             .      fetchClosedOrders       |
    |       fetchStatus            .          fetchMyTrades       |
    |       fetchTrades            .                deposit       |
    |                              .               withdraw       |
    │                              .                              |
    +=============================================================+
    │                              .                              |
    |                     Custom Exchange API                     |
    |         (Derived Classes And Their Implicit Methods)        |
    │                              .                              |
    |       publicGet...           .          privateGet...       |
    |       publicPost...          .         privatePost...       |
    |                              .          privatePut...       |
    |                              .       privateDelete...       |
    |                              .                   sign       |
    │                              .                              |
    +=============================================================+
    │                              .                              |
    |                      Base Exchange Class                    |
    │                              .                              |
    +=============================================================+

Public API 包括加载市场信息、获取K线数据、获取OrderBook等等api;

Private API 包括获取账户信息、下单、取消订单等等api;

Private API和Public API区别在于,Private API 需要有 api key 、 api secret 和相关权限才能调用成功,否则会报错。

有的方法个别交易所不一定有,调用前可查交易所实现类中的has的定义,如果为True表示该方法是支持的。

隐式 api

Custom Exchange API 是CCXT中交易所的隐式API,基本都是交易所独有的api,这些 api 没有在代码中显式的定义,但在交易所是实现类的 api 属性中有声明,这些 api 会统一通过基类的 define_rest_api 运行时自动生成。

也可以通过dir查看所有隐式api

# 打印交易所所有隐式api
print(dir(exchange))

如何调用隐式api?

这里以调用OKEX的策略委托下单接口为例,

请求示例:

POST /api/v5/trade/order-algo
body

    "instId":"BTC-USDT",
    "tdMode":"cross",
    "side":"buy",
    "ordType":"conditional",
    "sz":"2",
    "tpTriggerPx":"15",
    "tpOrdPx":"18"

接口文档说明:

调用隐式接口示例代码:

接口调用方法名以下划线连接,参数用键值对集合的形式传入

# 策略委托下单
# 提供单向止盈止损委托 、双向止盈止损委托、计划委托
response = exchange.private_post_trade_order_algo(
    'instId': 'ETH-USDT',       # 产品ID
    'tdMode': 'isolated',       # 逐仓
    'side': 'sell',             # 订单方向 buy:买 sell:卖
    'ordType': 'conditional',   # 单向止盈止损
    'sz': 0.01,                 # 委托数量
    'slTriggerPx': 999,         # 止损触发价
    "slOrdPx": 999              # 止损委托价
)
print(response)

返回结果:

'code': '0', 'data': ['algoId': '341552587589701632', 'sCode': '0', 'sMsg': ''], 'msg': ''

在OKEX客户端可以看到止损单已经提交上去了。

代码实战

这里以OKEX的api为例

1. 申请 OKEX api

api申请链接:https://www.okex.com/account/my-api

  1. 填写备注名和Passphrase,权限一般只选只读和交易,如果没有必要不要选提现

提交成功后,点查看就可以看到自己的api key和api secret了

2. 代码

import ccxt

# =====创建交易所

# 查看支持的交易所
# print(ccxt.exchanges)

# 创建交易所对象
exchange = ccxt.okex5()

# 设置代理
exchange.proxies = 
    'http': 'http://127.0.0.1:6666',
    'https': 'http://127.0.0.1:6666',


# 设置apiKey和apiSecret
exchange.apiKey = ''
exchange.secret = ''
exchange.password = ''  # okex特有的参数Passphrase,如果不设置会报错:AuthenticationError: requires `password`

# 加载市场信息
exchange.load_markets()

# 查看支持的交易对
print(exchange.symbols)

# =====Public API

# 获取盘口数据
# order_book = exchange.fetch_order_book(symbol=symbol)
# print(order_book)

# l2_order_book = exchange.fetch_l2_order_book(symbol=symbol)
# print(l2_order_book)

# =====获取账户资产
# 查询余额
# balance = exchange.fetch_balance()
# print(balance['info'])
# print(balance['free'])  # 可用资金
# print(balance['used'])  # 在途资金
# print(balance['total'])  # 总资金

# balance_margin = exchange.fetch_balance('type': 'trading')  # 获取margin账户资产
# print(balance_margin['USDT'])  # USDT这个资产的数量

# =====下单交易
# 下单参数
# symbol = 'ETH/USDT'
# pirce = 1000
# amount = 0.01

# 下单类型:
# market:margin交易市价单
# limit:margin交易限价单
# exchange market:exchange交易市价单
# exchange limit:exchange交易限价单

# 限价单
# order_info = exchange.create_limit_buy_order(symbol, amount, pirce, 'type': 'limit')  # margin买单
# order_info = exchange.create_limit_sell_order(symbol, amount, pirce, 'type': 'limit')  # margin卖单

# 市价单,市价单不需要输入价格
# order_info = exchange.create_market_buy_order(symbol, amount, 'type': 'market')  # margin买单
# order_info = exchange.create_market_sell_order(symbol, amount, 'type': 'market')  # margin买单

# 返回内容的数据结构:https://github.com/ccxt/ccxt/wiki/Manual#placing-orders
# print(order_info['id'])
# print(order_info['info'])

# 获取待成交的订单
# open_orders = exchange.fetch_open_orders()
# print(open_orders)

# 取消订单
# exchange.cancel_order(open_orders[0]['info']['ordId'], symbol=symbol)


# =====隐式api调用

# 打印交易所所有隐式api
# print(dir(exchange))

# 策略委托下单
# 提供单向止盈止损委托 、双向止盈止损委托、计划委托
# response = exchange.private_post_trade_order_algo(
#     'instId': 'ETH-USDT',       # 产品ID
#     'tdMode': 'isolated',       # 逐仓
#     'side': 'sell',             # 订单方向 buy:买 sell:卖
#     'ordType': 'conditional',   # 单向止盈止损
#     'sz': 0.01,                 # 委托数量
#     'slTriggerPx': 999,         # 止损触发价
#     "slOrdPx": 999              # 止损委托价
# )
# print(response)


# 获取当前账户下未触发的策略委托单列表
response = exchange.private_get_trade_orders_algo_pending(
    'instId': 'ETH-USDT',       # 产品ID
    'ordType': 'conditional',   # 单向止盈止损
)
print(response)

if response['data']:
    cancel_algos = []
    for order in response['data']:
        cancel_algos.append(
            'algoId': order['algoId'],  # 策略委托单ID
            'instId': order['instId'],  # 产品ID
        )
    # 撤销策略委托订单,每次最多可以撤销10个策略委托单    
    response = exchange.private_post_trade_cancel_algos(cancel_algos)
    print(response)

以上是关于加密货币交易所 API 框架 CCXT的主要内容,如果未能解决你的问题,请参考以下文章

加密货币交易所 API 框架 CCXT

CCXT:加密货币量化交易神器

希尔金:什么是加密数字货币资产管理机构呢?

金融量化利用ccxt爬取交易所的交易历史烛线图数据信息

Bittrex API 加密货币交易者:php 到 Java 的转换

加密资产交易所BitMart为失窃资金买单