一、CCXT 到底是什么,能帮你省掉什么麻烦

入门

假设你想写个程序,自动盯着币安和 OKX 上比特币的价格,哪边便宜就在哪边买。问题来了:每家交易所的接口地址、参数名、返回格式都不一样,光是读完它们的文档就要好几天。

CCXT 做的事情,就是给这些交易所套一层统一的外壳。你学会一套写法,就能操作一百多家交易所,切换时基本只改一个名字。

它目前支持 104 家交易所和预测市场,官方提供 Python、JavaScript/TypeScript、PHP、C#、Go、Java、Rust 八种语言的版本。

CCXT 统一接口示意

交易所接口(API)可以理解成"点餐窗口":你按格式报菜名,对方按格式递菜。CCXT 是那个帮你把所有窗口的菜单翻译成同一份的中间人。

二、装之前先确认两件事

入门

第一,你的语言版本要够新。 Python 需要 3.7 以上,JavaScript 需要 Node 7.6 以上。版本太老会装不上,因为库用到了新语法。

第二,想清楚你要"读数据"还是"真下单"。 只读行情不需要注册交易所账号;要下单则必须先在目标交易所注册、完成实名认证,并申请一对 API Key(相当于交易所发给程序的用户名和密码)。

安装本身只有一行命令:

pip install ccxt

用 JavaScript 的话换成:

npm install ccxt

三、跑通第一个例子:读取比特币实时价格

入门

下面这段代码会连上币安,打印出 BTC/USDT 这个交易对的最新行情。不需要任何账号,直接运行即可。

import ccxt

exchange = ccxt.binance()          # 选一家交易所
ticker = exchange.fetch_ticker('BTC/USDT')   # 问它 BTC/USDT 的行情

print(ticker['last'])    # 最新成交价
print(ticker['high'])    # 24 小时最高价
print(ticker['volume'])  # 24 小时成交量

fetch_ticker 返回的是一个普通字典,字段名在所有交易所里都是同一套,这就是 CCXT 的核心价值。

CCXT 支持的交易所

四、核心概念:交易所对象、统一方法与隐式加载

进阶 · 推荐细读

交易所对象:ccxt.binance() 创建出来的东西,是你和这家交易所之间的唯一通道。所有操作都从它出发。

统一方法:CCXT 把常见操作归纳成固定几个动词,记住这些就够日常使用:

  • fetch_ticker 拿单个交易对的最新行情
  • fetch_ohlcv 拿 K 线数据(开高低收加成交量)
  • fetch_balance 查账户余额
  • create_order 下单
  • cancel_order 撤单

隐式加载:你写 ccxt.binance() 时,CCXT 内部才去加载对应交易所的代码,而不是一上来把一百多家全读进内存。所以启动很快,但第一次调用某个交易所时会有一点点延迟。

统一数据结构:不同交易所返回的字段名千奇百怪,CCXT 全部翻译成同一套。比如"最新价"永远叫 last,不用去记某家叫 price、另一家叫 close。

五、进阶用法:下单、查余额与异常处理

进阶 · 推荐细读

要真正交易,得先填上 API Key。注意:密钥千万不要写死在代码里再传到公开仓库,建议放在环境变量或本地配置文件。

import ccxt, os

exchange = ccxt.binance({
    'apiKey': os.environ['BINANCE_KEY'],
    'secret': os.environ['BINANCE_SECRET'],
})

balance = exchange.fetch_balance()
print(balance['USDT']['free'])   # 可用 USDT 余额

order = exchange.create_order(
    symbol='BTC/USDT',
    type='limit',        # 限价单
    side='buy',          # 买入
    amount=0.001,        # 数量
    price=30000,         # 出价
)
print(order['id'])

网络请求随时可能失败,所以调用最好包一层异常处理。CCXT 把错误分成了几类,方便你分别应对:

try:
    exchange.fetch_ticker('BTC/USDT')
except ccxt.NetworkError as e:
    print('网络问题,稍后重试', e)
except ccxt.ExchangeError as e:
    print('交易所拒绝了这次请求', e)

NetworkError 通常是超时或断网,重试往往有效;ExchangeError 是交易所明确拒绝,比如余额不足、参数不对,重试没用。

CCXT 生态中的交易机器人

六、集成到现有项目时的注意点

深入 · 老手可选

限速是硬约束。 每家交易所都规定了每秒最多能请求几次,超了会被临时封禁。CCXT 内置了限速开关,默认开启,不要为了"跑快点"把它关掉。

exchange.enableRateLimit = True   # 保持默认即可

不同交易所支持的品种不一样。 有的只有现货,有的还有合约、期权。调用前先用 exchange.has 查一下这家支持哪些方法,避免调用不存在的能力。

版本升级可能带来破坏性改动。 CCXT 迭代很快,升级前建议先看更新日志,并在测试环境验证一遍再上生产。

浏览器端用法不同。 如果要在网页里直接用,需要通过 CDN 引入打包好的脚本,而不是用 pip 或 npm 那套。

<script src="https://cdn.jsdelivr.net/npm/ccxt/dist/ccxt.browser.min.js"></script>

建议先用小额资金和测试网络跑通全流程,确认下单、撤单、查余额都正常,再考虑接入真实资金。

最后提醒一句:CCXT 只是把接口统一了,它不会替你判断该不该买。行情数据的解读、策略的盈亏,仍然是你自己的责任。

项目信息

项目 值
仓库 ccxt/ccxt
语言 Python
Star 44,253
Fork 8,875
主页 https://docs.ccxt.com

参考链接

延伸阅读

想继续探索?这些同领域的教程可能也适合你: