You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 拉取近1个月充值记录:调用成功,返回数据准确,共包含33笔交易
  2. 拉取2022年4月1日-4月30日充值记录:调用异常,返回结果与近1个月数据完全一致,该时间段实际应有3笔交易
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:03:23