交易所API实战:用ccxt连接币安,搞定行情与交易
说实话,做量化交易的第一步,就是跟交易所打交道。你策略写得再漂亮,拿不到数据、下不了单,全是白搭。今天我们就来聊聊怎么用ccxt这个库,把币安(Binance)给“管”起来。
我个人习惯把ccxt叫做“交易所的万能遥控器”。它封装了上百家交易所的API,你只需要学会一套用法,就能操作几乎所有主流交易所。嗯,这感觉就像你学会了普通话,走遍全国都不怕。
1. 安装与初始化:先连上再说
安装很简单,一行命令搞定:
pip install ccxt
然后我们创建一个币安交易所的实例。这里要注意,如果你只是查行情,不需要API Key。但要做交易、查账户,就必须配置密钥。
import ccxt
# 创建币安交易所对象
exchange = ccxt.binance({
'apiKey': 'YOUR_API_KEY',
'secret': 'YOUR_SECRET_KEY',
'enableRateLimit': True, # 我建议一定要开,防止被交易所封IP
'options': {
'defaultType': 'spot', # 现货交易
}
})
# 测试连接
print(exchange.name) # 输出: Binance
2. 获取实时行情:Ticker与K线
行情数据是策略的“眼睛”。我们先看看怎么拿Ticker(实时价格)和K线(历史价格走势)。
2.1 Ticker:看一眼当前价格
# 获取BTC/USDT的实时行情
ticker = exchange.fetch_ticker('BTC/USDT')
print(f"最新价: {ticker['last']}")
print(f"24h最高: {ticker['high']}")
print(f"24h最低: {ticker['low']}")
print(f"24h成交量: {ticker['baseVolume']}")
这里有个小坑——交易对格式。币安用的是BTC/USDT,但有些交易所可能用BTC-USDT或btcusdt。ccxt统一了格式,但底层会帮你自动转换。
2.2 K线:看历史走势
K线数据是策略回测和实时分析的基石。我个人习惯用1小时K线做趋势判断,用5分钟K线做入场时机。
# 获取BTC/USDT的1小时K线,最近100根
ohlcv = exchange.fetch_ohlcv('BTC/USDT', timeframe='1h', limit=100)
# 返回格式:[[timestamp, open, high, low, close, volume], ...]
for candle in ohlcv[:5]: # 只看前5根
timestamp = candle[0]
open_price = candle[1]
high_price = candle[2]
low_price = candle[3]
close_price = candle[4]
volume = candle[5]
print(f"时间: {timestamp}, 开: {open_price}, 高: {high_price}, 低: {low_price}, 收: {close_price}, 量: {volume}")
pd.to_datetime(timestamp, unit='ms')转换成可读时间。我在做数据分析时,习惯直接转成DataFrame,操作起来方便很多。
3. 账户信息与资产查询:看看自己有多少钱
做交易前,你得知道自己有多少本金。这个接口需要API Key,而且建议用只读权限的Key,安全第一。
# 获取账户信息
balance = exchange.fetch_balance()
# 查看所有资产
for currency, amount in balance['total'].items():
if amount > 0: # 只显示有余额的币种
print(f"{currency}: {amount}")
# 查看特定资产
usdt_balance = balance['USDT']['free'] # 可用余额
btc_balance = balance['BTC']['used'] # 冻结余额(挂单中的)
print(f"USDT可用: {usdt_balance}, BTC冻结: {btc_balance}")
这里有个细节——free和used。free是你可以自由使用的资金,used是已经挂单被锁定的。我刚开始做交易时,经常忘了算used,结果下单时提示余额不足,搞得一头雾水。
4. 下单与撤单:动手交易
终于到了最刺激的部分——下单。我们先从最简单的限价单开始。
4.1 下个限价单
# 以30000 USDT的价格买入0.01个BTC
order = exchange.create_limit_buy_order('BTC/USDT', 0.01, 30000)
print(f"订单ID: {order['id']}")
print(f"订单状态: {order['status']}") # open 表示未成交
限价单不会立即成交,它会挂在订单簿上等人来吃。如果你想要立即成交,可以用市价单。
4.2 下个市价单
# 市价买入100 USDT的BTC
order = exchange.create_market_buy_order('BTC/USDT', 100)
print(f"成交均价: {order['average']}")
print(f"成交数量: {order['filled']}")
create_market_buy_order_with_cost方法,可以直接传金额。我在做网格策略时,经常用这个功能。
4.3 撤单:后悔药
有时候挂单价格不合适,或者行情突变,你需要撤单重来。
# 取消指定订单
order_id = '1234567890' # 替换成你的订单ID
exchange.cancel_order(order_id, 'BTC/USDT')
print("订单已取消")
# 取消所有挂单
exchange.cancel_all_orders('BTC/USDT')
print("所有挂单已取消")
嗯,这里要注意,撤单只能撤销未成交的订单。如果已经部分成交,撤单只会撤销剩余部分。
5. 核心逻辑流程图
下面这张图,是我自己总结的交易所API调用流程。你跟着这个顺序走,基本不会出错。
6. 避坑指南:我踩过的那些坑
做交易所API开发,有些坑是绕不过去的。我把自己踩过的几个分享给你:
- 频率限制: 币安对API调用有频率限制,现货交易一般是1200次/分钟。我刚开始做高频策略时,没控制好频率,直接被封了IP。后来老老实实开了
enableRateLimit,再也没出过问题。 - 网络超时: 交易所API偶尔会超时,尤其是行情剧烈波动时。我建议设置超时时间,并做好重试机制。比如用
exchange.timeout = 30000(30秒超时)。 - 精度问题: 不同交易对的价格精度和数量精度不一样。比如BTC/USDT价格精度是2位小数,但有些山寨币可能是8位。下单前一定要查一下精度,否则会报错。可以用
exchange.markets['BTC/USDT']['precision']查看。 - 订单状态: 下单后不要立即认为订单已经成交。市价单可能瞬间成交,但限价单可能挂很久。我习惯用
fetch_order定期检查订单状态,或者用WebSocket监听成交推送。
- ccxt统一了上百家交易所的API,学会一套用法走遍天下
- 行情数据用
fetch_ticker和fetch_ohlcv,注意时间格式 - 账户查询和下单需要API Key,务必保管好密钥
- 限价单和市价单各有用途,根据策略需求选择
- 频率限制、精度问题、网络超时是三大常见坑,提前做好防护
好了,这一章的内容就到这里。你把这些基础操作练熟了,后面讲策略实现时就能直接上手。记住,纸上得来终觉浅,绝知此事要躬行——打开你的编辑器,把代码跑一遍,比看十遍文章都管用。