""" fetcher.py - CCXT REST 拉取 Binance 永续合约 1m K 线,从固定起点累积。 """ import ccxt import pandas as pd import logging from datetime import datetime, timezone logger = logging.getLogger(__name__) SYMBOL = "BTC/USDT:USDT" TIMEFRAME = "1m" # 每次拉取最近 LIMIT 根 K 线(Binance 上限 1500,足够缠论管线用 ~25h 数据) _FETCH_LIMIT = 1000 _exchange = None def _get_exchange(): global _exchange if _exchange is None: _exchange = ccxt.binance({ "enableRateLimit": True, "options": {"defaultType": "future"}, }) _exchange.load_markets() logger.info("ccxt binance 已初始化") return _exchange def fetch_ohlcv() -> pd.DataFrame: """拉取最近 _FETCH_LIMIT 根 1m K 线。 管线每次重跑最新的 K 线窗口。 用 limit 而非 since 避免 API 500 根限制截断新数据。 """ exchange = _get_exchange() raw = exchange.fetch_ohlcv(SYMBOL, TIMEFRAME, limit=_FETCH_LIMIT) df = pd.DataFrame(raw, columns=["timestamp", "open", "high", "low", "close", "volume"]) df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms", utc=True) df["date"] = df["timestamp"] df = df.drop_duplicates(subset="timestamp").sort_values("timestamp").reset_index(drop=True) return df