如何用CCXT获取BingX全量交易历史?现有Python代码无法运行
解决BingX合约全量交易历史获取问题
原代码核心问题
- 未指定合约交易类型,ccxt默认访问现货接口,现货订单不包含PnL、合约平均价这类专属数据
limit=20仅能获取最近20条订单,无法拿到全量历史- 未处理分页逻辑,无法突破单请求数量限制
- 未捕获接口请求异常,故障排查困难
修正后的实现方案
1. 初始化合约专用接口
必须在初始化时指定defaultType: 'swap',确保ccxt调用BingX合约接口:
import ccxt import config # 初始化BingX合约交易接口 bingx = ccxt.bingx({ 'apiKey': config.BINGX_API_KEY, 'secret': config.BINGX_SECRET_KEY, 'options': { 'defaultType': 'swap' # 关键:指定为合约交易类型 } })
2. 分页获取全量历史订单
通过循环分页请求,逐步拉取所有历史订单:
def fetch_all_closed_orders(symbol): all_orders = [] max_limit = 100 # 单请求最大返回数(BingX接口允许的上限) since = None # 起始时间,None从最新订单开始 while True: try: # 拉取当前页订单 orders = bingx.fetch_closed_orders(symbol, limit=max_limit, since=since) if not orders: break # 无更多订单,终止循环 all_orders.extend(orders) # 更新起始时间为当前页最早订单的时间(减1避免重复拉取最后一条) since = orders[-1]['timestamp'] - 1 except Exception as e: print(f"拉取订单失败: {str(e)}") break return all_orders
3. 提取所需字段
PnL属于BingX专属字段,ccxt不会统一封装,需从order['info'](交易所原始返回数据)中提取:
# 获取DOGE/USDT合约全量历史订单 full_order_history = fetch_all_closed_orders('DOGE/USDT:USDT') # 遍历输出核心字段 for order in full_order_history: print(f"交易时间: {bingx.iso8601(order['timestamp'])}") print(f"订单ID: {order['id']}") print(f"平均成交价格: {order.get('average', '未成交')}") print(f"盈亏(PnL): {order['info'].get('pnl', '无数据')}") print(f"订单状态: {order['status']}") print("------------------------------")
额外注意事项
- 确保API密钥已开启合约交易读取权限,否则会返回权限错误
- 若仍无法获取PnL,可尝试调用
fetch_my_trades接口,部分交易所的成交明细会包含更详细的盈亏数据 - 避免短时间内频繁请求,遵守BingX的API频率限制
内容的提问来源于stack exchange,提问作者behzad taghizadeh
相关产品推荐
相关产品推荐

