CCXT fetch_ohlcv API无最新价格,如何完整提取OHLCV数据?
CCXT fetch_ohlcv 无法获取最新OHLCV数据的问题解决
问题原因
出现这种情况主要来自两方面限制:
- 交易所K线生成规则:多数交易所的K线是在周期结束后才生成完整数据。比如15分钟周期的K线,要等该时间段结束(如00:15)才会生成00:00-00:15的完整K线;若当前时间是00:00,正在运行的这个15分钟周期K线还未闭合,交易所不会返回这条数据。此外部分交易所存在数据推送延迟,刚生成的K线不会立即开放查询。
- CCXT与交易所的请求限制:
since参数指定的是起始时间戳,返回的是时间戳大于等于该值的K线,但如果交易所对应时间段的K线未生成,自然无法获取。另外部分交易所对单次请求的K线数量有隐性上限,即便设置limit=1000,实际返回数量也可能低于设定值;同时如果未启用限流控制,频繁请求可能被交易所限制,导致数据获取不全。
正确获取方法
方法1:直接获取最新N条K线
如果目标是获取最近N个周期的记录,无需指定起始时间,直接请求足够数量的K线后截取最后N条:
import ccxt # 初始化交易所实例,必须启用限流控制 exchange = ccxt.bybit({'enableRateLimit': True}) symbol = 'SOLUSDT' timeframe = '15m' needed_count = 99 # 请求比需要数量多10条,避免因交易所返回数量不足导致缺失 ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=needed_count + 10) # 截取最后needed_count条 target_ohlcv = ohlcv[-needed_count:] print(f"成功获取{len(target_ohlcv)}条目标K线")
方法2:循环补全指定时间段的K线
如果必须从指定时间点开始获取完整数据,可通过循环分批请求,逐步补全缺失部分:
import ccxt import time exchange = ccxt.bybit({'enableRateLimit': True}) symbol = 'SOLUSDT' timeframe = '15m' # 指定起始时间 since = exchange.parse8601('2023-12-24 00:00:00') # 单次请求的K线数量,建议按交易所限制设置(多数交易所单次支持100-200条) limit_per_request = 100 all_ohlcv = [] while True: batch = exchange.fetch_ohlcv(symbol, timeframe, since=since, limit=limit_per_request) if not batch: break all_ohlcv.extend(batch) # 更新起始时间为最后一条K线的时间 + 一个周期的毫秒数,避免重复请求 last_ts = batch[-1][0] period_ms = exchange.parse_timeframe(timeframe) * 1000 since = last_ts + period_ms # 遵循交易所限流规则,自动等待 time.sleep(exchange.rateLimit / 1000) print(f"累计获取{len(all_ohlcv)}条K线")
方法3:补充未闭合的最新周期K线
如果需要包含当前正在运行的未闭合周期数据,可通过ticker接口获取最新价格,手动构造K线补充:
# 先获取已闭合的K线 ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=needed_count) # 获取最新行情 ticker = exchange.fetch_ticker(symbol) # 计算当前周期的起始时间 last_closed_ts = ohlcv[-1][0] period_ms = exchange.parse_timeframe(timeframe) * 1000 current_period_ts = last_closed_ts + period_ms # 构造未闭合K线(注:成交量字段部分交易所无法提供当前周期数据,需根据实际情况调整) current_ohlcv = [ current_period_ts, ohlcv[-1][4], # 开盘价取上一条收盘价 max(ohlcv[-1][4], ticker['last']), # 最高价 min(ohlcv[-1][4], ticker['last']), # 最低价 ticker['last'], # 当前收盘价(最新价) ticker['quoteVolume'] # 若无法获取当前周期成交量,可留空或用0 ] ohlcv.append(current_ohlcv)
内容的提问来源于stack exchange,提问作者Wonderjimmy
相关产品推荐
相关产品推荐

