CCXT fetch_deposits获取FTX历史充值记录仅返回近1月数据问题
FTX历史充值记录拉取异常修复
问题背景
使用CCXT库调用fetchDeposits接口从FTX交易所拉取充值记录,目标是统计汇入指定FTX地址的全部比特币充值总额。实际调用中出现异常:尝试获取1个月以前的历史充值数据时,接口始终仅返回近1个月的记录,更早数据无法获取。
相关时间参数定义
- 充值查询起始时间:2022年4月1日,对应秒级Unix时间戳
1648771200 - 测试用充值查询结束时间:2022年4月30日,对应秒级Unix时间戳
1651363199 - 目标查询结束时间:查询执行时的当前时间,对应秒级Unix时间戳
1655033415
已完成测试及结果
- 拉取近1个月充值记录:调用成功,返回数据准确,共包含33笔交易
- 拉取2022年4月1日-4月30日充值记录:调用异常,返回结果与近1个月数据完全一致,该时间段实际应有3笔交易
- 拉取2022年4月1日至今充值记录:调用异常,返回结果与近1个月数据完全一致,该时间段实际应有44笔交易
已知分页机制会限制接口单次返回的数据量,但尝试多种参数调整方式后始终只能获取近1个月的数据,更早的历史记录全部缺失。
参考说明
- CCXT 充值接口调用规范
- CCXT 分页机制实现逻辑
原有问题代码
def get_deposits(asset_name): deposits_total = 0 deposits_count = 0 since = 1648771200 param = {"endTime": 1655033415} deposits = exchange.fetch_deposits(asset_name, since, limit=None, params=param) # 统计汇入指定充值地址的所有充值记录 for item in deposits: if item['addressTo'] == deposit_address[asset_name]: deposits_total = deposits_total + item['amount'] deposits_count = deposits_count +1 print(item['datetime']) return(deposits_total, deposits_count)
问题根因
原有代码存在三处核心错误:
- 时间戳单位不匹配:CCXT所有统一接口的
since入参要求传入毫秒级Unix时间戳,当前代码传入的是秒级时间戳,数值偏差1000倍,接口无法识别合法的时间范围,会默认返回最近1个月的兜底数据。 - 未实现分页遍历:FTX原生接口单次最多返回100条记录,即使时间参数正确,单次调用也无法拉取全量历史数据,必须逐页遍历。
- 参数传值错误:传入
limit=None不符合FTX接口要求,接口会直接使用默认的时间范围规则返回数据,不会遵循传入的时间参数。
修复后可运行代码
def get_deposits(asset_name): deposits_total = 0 deposits_count = 0 # 秒级时间戳转毫秒级,适配CCXT统一接口的since参数要求 since = 1648771200 * 1000 end_time = 1655033415 * 1000 limit = 100 # FTX接口单次支持的最大返回条数 while True: # FTX原生接口的endTime参数要求传入秒级时间戳 params = {"endTime": end_time // 1000} deposits = exchange.fetch_deposits(asset_name, since, limit=limit, params=params) if not deposits: break # 无更多数据时退出循环 for item in deposits: if item['addressTo'] == deposit_address[asset_name]: deposits_total += item['amount'] deposits_count += 1 print(item['datetime']) # 更新下一次查询的起始时间为当前批次最后一条记录的时间+1ms,避免重复拉取 last_record_ts = deposits[-1]['timestamp'] since = last_record_ts + 1 # 拉取到设定结束时间后终止循环 if since >= end_time: break return (deposits_total, deposits_count)
注意事项:
- CCXT统一层参数和交易所原生参数的时间戳单位要求不一致,
since是CCXT统一参数要求毫秒级,endTime是FTX原生参数要求秒级,不要混淆 - 分页时必须逐次更新查询起始位置,不能单次调用拿全量数据
- 显式传入接口支持的最大
limit值,减少请求次数
内容的提问来源于stack exchange,提问作者Alphatio
相关产品推荐
相关产品推荐

