Local Data Service(REST + WebSocket)
本服务基于 FastAPI + ccxt,自动拉取交易所行情、写入本地 Parquet,同时提供 REST 和 WebSocket 数据访问。
自带时间周期聚合能力:只需抓取 1m / 1h / 1d / 1w / 1M 等基础周期,即可自动生成 2m/3m/.../30m、2h/3h/.../16h 等衍生周期。
1. 环境准备
1.1 依赖
- Python ≥ 3.10(本地运行方式需要)
pip install -r requirements.txt(包含fastapi,uvicorn,ccxt,pandas,pyarrow,technical等)- 或者直接使用仓库内的
docker-compose.yml
1.2 关键环境变量
| 变量 | 说明 | 默认 |
|---|---|---|
DATA_DIR |
本地 Parquet 存储目录 | /data |
EXCHANGE |
交易所标识(目前支持 binance) | binance |
SYMBOLS |
逗号分隔的交易对列表 | BTC/USDT:USDT,ETH/USDT:USDT |
TIMEFRAMES |
基础抓取周期,逗号分隔 | 1m,1h,1d,1w,1M |
START_FROM |
首次启动回补的起始 UTC 时间(ISO 字符串或毫秒时间戳) | 2022-01-01 |
POLL_FACTOR |
拉取间隔因子,实际间隔 = 周期毫秒 × factor | 0.5 |
BACKOFF_BASE / BACKOFF_MAX |
异常重试的指数退避参数 | 2.0 / 30.0 |
衍生周期列表由程序自动推导,无需手动写入
TIMEFRAMES。
2. 启动与关闭
2.1 Docker 方式
cd user_data/Chan/datasvc
docker compose up -d # 启动
docker compose logs -f # 查看日志
docker compose down # 关闭
2.2 本地运行(无 Docker)
export DATA_DIR=./data
export SYMBOLS="BTC/USDT:USDT"
export TIMEFRAMES="1m,1h,1d"
cd /Users/jack/Project/freqtrade
uvicorn user_data.Chan.datasvc.app.main:app --reload
关闭时 Ctrl+C 即可,服务会自动取消后台抓取任务并释放资源。
3. 数据存储与聚合
3.1 基础周期
只会为 TIMEFRAMES 声明的基础周期创建抓取任务(例如 1m / 1h / 1d)。
3.2 衍生周期
启动后自动维护以下聚合:
| 基础周期 | 自动生成 |
|---|---|
1m |
2m, 3m, 4m, 5m, 10m, 15m, 20m, 25m, 30m |
1h |
2h, 3h, 4h, 6h, 8h, 12h, 16h |
1d |
2d, 3d, 4d, 5d, 6d |
1w |
2w |
1M |
2M, 3M, 6M |
聚合过程通过 technical.util.resample_to_interval 完成,写入同一 Parquet 数据目录。
所有周期都可以被 REST/WS 访问。
3.3 数据目录
{DATA_DIR}/{timeframe}/{symbol}.parquet
4. 接口调用
4.1 健康检查
GET /health
返回运行状态、基础/衍生周期列表、各抓取任务的最新进度与错误计数,便于监控。
4.2 REST API
GET /api/candles?symbol=BTC/USDT:USDT&tf=2h&start=1700000000000&end=1700003600000
参数说明:
symbol:交易对(必须在SYMBOLS列表中)tf:时间周期(支持基础或衍生)start/end:毫秒时间戳,可选
返回示例:
[
{"timestamp": 1700000000000, "open": 36000.0, "high": 36120.0, "low": 35980.0, "close": 36050.0, "volume": 125.4},
...
]
4.3 WebSocket
ws://localhost:8000/ws?symbol=ETH/USDT:USDT&tf=15m&since=1700000000000
- 首次连接:收到
snapshot消息(快照数组) - 后续增量:收到
upsert消息(最新几根K线),以及周期性ping
消息示例:
{"topic":"candles.ETH/USDT:USDT.15m","type":"snapshot","data":[{"t":1700000000000,"o":2000.0,"h":2005.0,"l":1995.0,"c":2002.5,"v":312.7}, ...]}
{"topic":"candles.ETH/USDT:USDT.15m","type":"upsert","data":{"t":1700000900000,"o":2002.5,"h":2006.0,"l":2000.0,"c":2004.0,"v":120.8}}
5. 停机与维护
- 正常关闭:
docker compose down或 Ctrl+C。服务会等待所有抓取任务结束并关闭ccxt客户端。 - 异常恢复:若网络异常,服务会自动指数退避重试;可通过
/health的consecutive_errors与last_error排查。 - 数据清理:直接删除
DATA_DIR下对应的 Parquet 文件即可,下次启动会重新回补。
6. 常见问题
-
缺少
technical模块
聚合周期会跳过,并在日志中提示;先执行pip install technical再重启。 -
接收不到某个周期的数据
确认该周期在TIMEFRAMES或自动聚合列表中;若是衍生周期,需要确保对应基础周期已在运行。 -
如何新增交易对/周期
修改环境变量或 docker-compose 配置后,重启服务即可;Parquet 文件会按需生成。
欢迎结合自身策略或可视化前端直接消费本地数据服务。若要集成到其他项目,可直接引用 /api/candles 的 JSON 响应或订阅 /ws 的实时推送。