为何CCXT中load_markets().keys()与fetch_tickers()返回数量不一致?
问题分析与解决方案
核心原因
load_markets(True)会加载Bybit平台所有可交易市场,涵盖现货、永续合约、交割合约、期权、杠杆交易等全品类交易对,因此数量达到2542。fetch_tickers()默认仅请求Bybit API返回的热门/主力交易对(通常是现货主流币种对),并非全量交易对——这是平台API的默认限制,CCXT的封装逻辑遵循该规则,演示模式也不例外。
解决方案
若需获取全量交易对的tickers,可采用以下两种方式:
- 指定目标交易对列表:加载全市场后,筛选出对应品类的交易对,再传入
fetch_tickers:async def debug(): exchange = ccxt.bybit({'enableRateLimit': True}) # 建议开启限速避免触发API限制 markets = await exchange.load_markets(True) # 筛选出所有现货交易对(可替换为swap/future等品类) target_markets = [symbol for symbol, info in markets.items() if info['type'] == 'spot'] tickers = await exchange.fetch_tickers(target_markets) print(len(target_markets)) print(len(tickers)) await exchange.close() asyncio.run(debug()) - 调用品类专属接口:CCXT针对不同交易品类提供了专门的ticker获取方法,例如:
- 永续合约:
fetch_tickers(exchange.symbols_by_type['swap']) - 交割合约:
fetch_tickers(exchange.symbols_by_type['future']) - 期权:
fetch_option_tickers()
- 永续合约:
补充说明
Bybit公开API对无参数的tickers接口调用有返回数量限制,仅返回流动性较好的热门交易对,目的是降低API负载与数据传输量。若需全量数据,必须明确指定交易对列表或品类。
内容的提问来源于stack exchange,提问作者kapedalex
相关产品推荐
相关产品推荐

