- 每整分钟拉取 Binance 永续合约 1m K 线 - 运行完整缠论管线检测买卖点 (BSP) - 新 BSP 推送到 Telegram - fix: fetcher 用 limit=1000 替代固定 since,避免 API 500 根限制截断新数据
46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
"""
|
|
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
|