data_provider: 新增链上指标模块 (btc_netflow/stablecoin_supply/etf_flow/mvrv_zscore)

- onchain_metrics.py: 独立模块,CoinMetrics/CoinGecko/Farside 免费数据源
- main.py: 集成后台线程 + REST API (/api/onchain/metrics, /latest, /available)
- requirements.txt: 添加 requests 依赖
- 5分钟自动刷新,CSV 落盘到 data/onchain/
This commit is contained in:
jackyu66git
2026-07-02 15:09:02 +08:00
parent 7b91f459d7
commit ffe7074fef
3 changed files with 617 additions and 0 deletions
+19
View File
@@ -24,6 +24,12 @@ from fastapi.responses import HTMLResponse
import uvicorn
from technical.util import resample_to_interval
from onchain_metrics import (
OnchainMetricsManager,
api_keys_from_env,
create_onchain_router,
)
# docker compose logs --tail=200
# docker compose down && docker compose build --no-cache && docker compose up -d
@@ -1132,6 +1138,13 @@ def create_app(provider: DataProvider) -> FastAPI:
"""构造 FastAPI 应用:lifespan 内同步 initialize 并启动后台拉数;WebSocket 实时推送。"""
ws_manager = WebSocketManager()
# 初始化链上指标模块
onchain_manager = OnchainMetricsManager(
data_dir=provider.data_dir,
api_keys=api_keys_from_env(),
)
onchain_router = create_onchain_router(onchain_manager)
def _on_data_update(symbol: str, base_tf: str) -> None:
"""后台刷新线程回调:广播基础及衍生周期更新给 WebSocket 订阅者。"""
with provider._lock:
@@ -1165,9 +1178,12 @@ def create_app(provider: DataProvider) -> FastAPI:
provider.start_background_workers()
# 启动 WebSocket 实时监听(asyncio 后台任务)
provider.start_watch_tasks()
# 启动链上指标后台刷新
onchain_manager.start()
try:
yield
finally:
onchain_manager.stop()
provider.stop()
app = FastAPI(title="Chan 数据提供商", version="1.0.0", lifespan=lifespan)
@@ -1180,6 +1196,9 @@ def create_app(provider: DataProvider) -> FastAPI:
allow_headers=["*"],
)
# 注册链上指标 API
app.include_router(onchain_router)
@app.get("/health")
async def health() -> Dict[str, object]:
"""存活检查:交易所、交易对、基础/衍生周期、是否已完成冷启动。"""