From 249aec917a1e599816bcc438846e4fc3e4c4d02f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Mon, 16 Feb 2026 17:30:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(binance=5Fclient,=20market=5Fscanner,=20po?= =?UTF-8?q?sition=5Fmanager):=20=E5=A2=9E=E5=BC=BA=E8=A1=8C=E6=83=85?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96=E4=B8=8E=E5=A4=84=E7=90=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 `binance_client` 中新增多个公开行情接口,包括深度信息、资金费率和未平仓合约数的获取,优化了 REST API 的调用逻辑。更新 `market_scanner` 以并行请求主周期和确认周期的 K线数据,提升了数据获取效率并引入超时处理。`position_manager` 中增加了从深度信息获取当前价格的逻辑,确保在多种情况下都能准确获取价格,增强了系统的稳定性和可追溯性。 --- docs/行情接口可用性说明.md | 61 ++ trading_system/binance_client.py | 138 ++++ trading_system/config.py | 3 +- trading_system/kline_stream.py | 7 + trading_system/market_scanner.py | 73 ++- trading_system/position_manager.py | 16 +- 行情接口REST.txt | 952 ++++++++++++++++++++++++++++ 7 files changed, 1230 insertions(+), 20 deletions(-) create mode 100644 docs/行情接口可用性说明.md diff --git a/docs/行情接口可用性说明.md b/docs/行情接口可用性说明.md new file mode 100644 index 0000000..0015488 --- /dev/null +++ b/docs/行情接口可用性说明.md @@ -0,0 +1,61 @@ +# 行情接口可用性说明 + +基于「行情 WS 接口」「行情接口REST.txt」与当前交易系统实现,对各类接口的**是否已用、是否建议用**做简要说明。 +**已接入 REST**:深度、最新标记价格与资金费率、资金费率历史、未平仓合约数、持仓量历史、大户/全局多空比、主动买卖量(见 `binance_client.py`)。 + +--- + +## 一、当前系统已在用的 + +| 文档名称 | 在系统中的用法 | +|---------|----------------| +| **24hr 价格变动情况** | `ticker_24h_stream` WS + REST `get_ticker_24h` / `get_all_tickers_24h`,用于扫描涨跌幅、当前价、成交量。 | +| **K 线数据** | `kline_stream` WS + REST `get_klines`,用于技术指标(RSI/MACD/ATR/EMA 等)与多周期分析。 | +| **当前最优挂单** | `book_ticker_stream` WS(!bookTicker)+ 兜底 REST,用于当前价、滑点估算、挂保护单前价格校验。 | +| **最新价格**(含 V2) | 功能被 24h ticker 与 book 覆盖,未单独接;需要“仅最新价”时可用 `ticker.price` 做轻量兜底。 | + +--- + +## 二、建议接入、能明显改善的 + +| 文档名称 | 建议用途 | 说明 | +|---------|----------|------| +| **深度信息 (depth)** | 滑点估算、限价挂单参考、大单/盘口结构 | 目前只有最优买卖一档(book);接入 depth 后可做更准的市价冲击成本、或简单 order book 策略。可用 WS depth 流维护本地盘口,减少 REST 权重。 | +| **最新标记价格和资金费率** | 强平/风险展示、资金费成本 | 当前 markPrice 来自持仓接口;若要做「全市场标记价」或单独展示资金费率,可接此接口。资金费可用于过滤高费率时开仓。 | +| **标记价格 K 线数据** | 以标记价做技术分析 | 若希望指标更贴近强平价、减少插针影响,可部分替代「K 线数据」用于计算。 | +| **查询资金费率历史 / 资金费率信息** | 资金费择时、多空成本 | 避免在资金费极高时开仓,或作为多空情绪/结构的辅助。 | +| **获取未平仓合约数 / 合约持仓量历史** | 量价、趋势过滤 | 与价格/成交量结合,做趋势确认或过滤(如持仓量骤增+价格突破)。 | +| **大户持仓量多空比 / 大户账户数多空比 / 多空持仓人数比** | 情绪/反向指标 | 可作为过滤条件或信号权重(例如极端多空比时谨慎同向开仓)。 | +| **合约主动买卖量** | 买卖压力、入场时机 | 辅助判断多空力量,用于入场/出场或过滤。 | + +--- + +## 三、可选、按策略需要再接 + +| 文档名称 | 可选用途 | +|---------|----------| +| **近期成交 / 近期成交(归集) / 查询历史成交** | 微观结构、大单检测、成交分布统计;当前策略未用。 | +| **连续合约 K 线数据** | 跨期或连续合约分析时用。 | +| **价格指数 K 线 / 溢价指数 K 线** | 套利、基差、溢价策略。 | +| **基差 / 综合指数 / 多资产模式资产汇率指数 / 查询指数价格成分** | 指数、多腿或套利类策略。 | +| **查询保险基金余额 / 自动减仓风险评级** | 风控展示、极端行情监控。 | +| **一周交易时段** | 若要做「仅在某交易时段内交易」的规则时可接。 | +| **RPI 深度信息** | 文档注明响应不包含 RPI 订单;若不涉及 RPI 订单可忽略。 | +| **季度合约历史结算价** | 仅做季度合约或结算相关逻辑时需要。 | + +--- + +## 四、落地优先级建议(结合当前项目) + +1. **优先** + - **深度 (depth)**:用 WS depth 做本地盘口,提升滑点估算与限价参考,减少对单一 book 的依赖。 + - **最新标记价格和资金费率**:若前端/风控要展示「标记价、资金费率」或按资金费过滤开仓,再接即可。 + +2. **其次** + - **资金费率历史/信息**、**未平仓合约数/持仓量历史**:用于过滤或信号增强。 + - **大户多空比 / 主动买卖量**:作为可选过滤或权重,不改变主流程。 + +3. **按需** + - 标记价格 K 线、连续合约 K 线、溢价/指数类、保险基金/自动减仓、交易时段等,在明确产品需求(如套利、风控大屏、时段规则)后再接。 + +如果你愿意,我可以按「深度 + 标记价/资金费率」先给出具体接入方案(WS 订阅方式、数据结构、在现有 `binance_client` / `position_manager` 里怎么用)。 diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index 5220bdc..1b53d4a 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -736,6 +736,144 @@ class BinanceClient: logger.error(f"批量获取24小时行情失败: {e}") return {} + # ------------------------- 公开行情接口(文档:行情接口REST.txt)------------------------- + + async def _public_futures_get(self, path: str, params: Optional[Dict[str, Any]] = None, timeout_sec: int = 10) -> Any: + """公开 GET 请求(无需签名),path 如 'fapi/v1/depth' 或 'futures/data/openInterestHist'。""" + import aiohttp + base = self._futures_base_url() + url = f"{base}/{path}" if not path.startswith("/") else f"{base}{path}" + params = {k: v for k, v in (params or {}).items() if v is not None} + try: + async with aiohttp.ClientSession() as session: + async with session.get(url, params=params, timeout=aiohttp.ClientTimeout(total=timeout_sec)) as resp: + text = await resp.text() + if resp.status != 200: + logger.debug(f"公开行情 GET 失败: {path} status={resp.status} body={text[:200]}") + return None + if not text or not text.strip(): + return None + return json.loads(text) + except asyncio.TimeoutError: + logger.debug(f"公开行情 GET 超时: {path}") + return None + except Exception as e: + logger.debug(f"公开行情 GET 异常 {path}: {e}") + return None + + async def get_depth(self, symbol: str, limit: int = 50) -> Optional[Dict[str, Any]]: + """ + 深度信息 GET /fapi/v1/depth + limit 可选 5,10,20,50,100,500,1000;权重 2~20。 + Returns: { lastUpdateId, E, T, bids: [[price, qty], ...], asks: [...] } + """ + symbol = self._resolve_api_symbol(symbol) + if limit not in (5, 10, 20, 50, 100, 500, 1000): + limit = 50 + return await self._rate_limited_request( + f"depth_{symbol}", + self._public_futures_get("fapi/v1/depth", {"symbol": symbol, "limit": limit}), + ) + + async def get_premium_index(self, symbol: Optional[str] = None) -> Any: + """ + 最新标记价格和资金费率 GET /fapi/v1/premiumIndex + 带 symbol 权重 1,不带 10。返回单对象或数组。 + """ + params = {} if symbol is None else {"symbol": self._resolve_api_symbol(symbol)} + return await self._rate_limited_request( + "premiumIndex", + self._public_futures_get("fapi/v1/premiumIndex", params), + ) + + async def get_funding_rate(self, symbol: Optional[str] = None, limit: int = 100, + start_time: Optional[int] = None, end_time: Optional[int] = None) -> List[Dict]: + """ + 资金费率历史 GET /fapi/v1/fundingRate + limit 默认 100 最大 1000;与 fundingInfo 共享 500/5min/IP。 + """ + params = {"limit": limit} + if symbol: + params["symbol"] = self._resolve_api_symbol(symbol) + if start_time is not None: + params["startTime"] = start_time + if end_time is not None: + params["endTime"] = end_time + out = await self._public_futures_get("fapi/v1/fundingRate", params) + return out if isinstance(out, list) else [] + + async def get_open_interest(self, symbol: str) -> Optional[Dict[str, Any]]: + """获取未平仓合约数 GET /fapi/v1/openInterest 权重 1。""" + symbol = self._resolve_api_symbol(symbol) + return await self._rate_limited_request( + f"openInterest_{symbol}", + self._public_futures_get("fapi/v1/openInterest", {"symbol": symbol}), + ) + + async def _futures_data_get(self, endpoint: str, params: Dict[str, Any]) -> Any: + """GET /futures/data/,权重多为 0,IP 限频 1000/5min。""" + return await self._public_futures_get(f"futures/data/{endpoint}", params) + + async def get_open_interest_hist(self, symbol: str, period: str = "1h", limit: int = 30, + start_time: Optional[int] = None, end_time: Optional[int] = None) -> List[Dict]: + """合约持仓量历史 GET /futures/data/openInterestHist。period: 5m,15m,30m,1h,2h,4h,6h,12h,1d。""" + symbol = self._resolve_api_symbol(symbol) + params = {"symbol": symbol, "period": period, "limit": limit} + if start_time is not None: + params["startTime"] = start_time + if end_time is not None: + params["endTime"] = end_time + out = await self._futures_data_get("openInterestHist", params) + return out if isinstance(out, list) else [] + + async def get_top_long_short_position_ratio(self, symbol: str, period: str = "1h", limit: int = 30, + start_time: Optional[int] = None, end_time: Optional[int] = None) -> List[Dict]: + """大户持仓量多空比 GET /futures/data/topLongShortPositionRatio。""" + symbol = self._resolve_api_symbol(symbol) + params = {"symbol": symbol, "period": period, "limit": limit} + if start_time is not None: + params["startTime"] = start_time + if end_time is not None: + params["endTime"] = end_time + out = await self._futures_data_get("topLongShortPositionRatio", params) + return out if isinstance(out, list) else [] + + async def get_top_long_short_account_ratio(self, symbol: str, period: str = "1h", limit: int = 30, + start_time: Optional[int] = None, end_time: Optional[int] = None) -> List[Dict]: + """大户账户数多空比 GET /futures/data/topLongShortAccountRatio。""" + symbol = self._resolve_api_symbol(symbol) + params = {"symbol": symbol, "period": period, "limit": limit} + if start_time is not None: + params["startTime"] = start_time + if end_time is not None: + params["endTime"] = end_time + out = await self._futures_data_get("topLongShortAccountRatio", params) + return out if isinstance(out, list) else [] + + async def get_global_long_short_account_ratio(self, symbol: str, period: str = "1h", limit: int = 30, + start_time: Optional[int] = None, end_time: Optional[int] = None) -> List[Dict]: + """多空持仓人数比 GET /futures/data/globalLongShortAccountRatio。""" + symbol = self._resolve_api_symbol(symbol) + params = {"symbol": symbol, "period": period, "limit": limit} + if start_time is not None: + params["startTime"] = start_time + if end_time is not None: + params["endTime"] = end_time + out = await self._futures_data_get("globalLongShortAccountRatio", params) + return out if isinstance(out, list) else [] + + async def get_taker_long_short_ratio(self, symbol: str, period: str = "1h", limit: int = 30, + start_time: Optional[int] = None, end_time: Optional[int] = None) -> List[Dict]: + """合约主动买卖量 GET /futures/data/takerlongshortRatio。""" + symbol = self._resolve_api_symbol(symbol) + params = {"symbol": symbol, "period": period, "limit": limit} + if start_time is not None: + params["startTime"] = start_time + if end_time is not None: + params["endTime"] = end_time + out = await self._futures_data_get("takerlongshortRatio", params) + return out if isinstance(out, list) else [] + async def get_account_balance(self) -> Dict[str, float]: """ 获取U本位合约账户余额 diff --git a/trading_system/config.py b/trading_system/config.py index 76f4ec7..9a71d91 100644 --- a/trading_system/config.py +++ b/trading_system/config.py @@ -213,7 +213,8 @@ DEFAULT_TRADING_CONFIG = { 'ATR_MULTIPLIER_MIN': 1.5, # 动态ATR倍数最小值(回归盈利期设置) 'ATR_MULTIPLIER_MAX': 2.5, # 动态ATR倍数最大值(回归盈利期设置) 'SCAN_INTERVAL': 900, # 扫描间隔15分钟(900秒),快速验证模式:提高扫描频率以增加交易机会 - 'SCAN_SYMBOL_ANALYSIS_TIMEOUT_SEC': 18, # 单个交易对「详细分析」超时(秒),超时则跳过该交易对;网络慢可调大(如 25) + 'SCAN_SYMBOL_ANALYSIS_TIMEOUT_SEC': 12, # 单个交易对「详细分析」超时(秒);已并行拉取主周期/确认周期K线,12秒通常够用;网络慢可调大(18~25) + 'SCAN_KLINE_FETCH_TIMEOUT_SEC': 8, # K线拉取单独超时(秒);超时则返回降级结果(仅涨跌幅/成交量),不拖满整分析超时 'KLINE_INTERVAL': '1h', 'PRIMARY_INTERVAL': '4h', # 主周期4小时,过滤噪音 'CONFIRM_INTERVAL': '1d', # 确认周期日线,看大趋势 diff --git a/trading_system/kline_stream.py b/trading_system/kline_stream.py index d625bf5..9ecbdb2 100644 --- a/trading_system/kline_stream.py +++ b/trading_system/kline_stream.py @@ -109,6 +109,13 @@ class KlineStream: _kline_cache_limit[key] = limit logger.debug(f"KlineStream: 已订阅 {symbol} {interval}") return True + except (ConnectionResetError, OSError) as e: + msg = str(e).lower() + if "closing transport" in msg or "cannot write" in msg: + logger.debug("KlineStream: 连接关闭中,订阅 %s %s 跳过(重连后将自动重试)", symbol, interval) + else: + logger.warning(f"KlineStream: 订阅 {symbol} {interval} 失败: {e}") + return False except Exception as e: logger.warning(f"KlineStream: 订阅 {symbol} {interval} 失败: {e}") return False diff --git a/trading_system/market_scanner.py b/trading_system/market_scanner.py index 68a5da7..c8a1be6 100644 --- a/trading_system/market_scanner.py +++ b/trading_system/market_scanner.py @@ -303,24 +303,63 @@ class MarketScanner: except Exception: ticker_ts = None - # 获取更多K线数据用于技术指标计算(使用配置的主周期) + # 获取更多K线数据用于技术指标计算(主周期 + 确认周期并行请求;单独超时避免整分析拖到 18s) primary_interval = config.TRADING_CONFIG.get('PRIMARY_INTERVAL', '1h') - klines = await self.client.get_klines( - symbol=symbol, - interval=primary_interval, - limit=50 # 获取更多数据用于计算指标 - ) - - if len(klines) < 2: - return None - - # 获取4H周期数据用于多周期共振检查 confirm_interval = config.TRADING_CONFIG.get('CONFIRM_INTERVAL', '4h') - klines_4h = await self.client.get_klines( - symbol=symbol, - interval=confirm_interval, - limit=50 # 获取4H周期数据 - ) + cfg = dict(config.TRADING_CONFIG or {}) + klines_timeout = float(cfg.get('SCAN_KLINE_FETCH_TIMEOUT_SEC', 8) or 8) + if klines_timeout < 3: + klines_timeout = 3.0 + elif klines_timeout > 20: + klines_timeout = 20.0 + klines, klines_4h = [], [] + try: + klines, klines_4h = await asyncio.wait_for( + asyncio.gather( + self.client.get_klines(symbol=symbol, interval=primary_interval, limit=50), + self.client.get_klines(symbol=symbol, interval=confirm_interval, limit=50), + ), + timeout=klines_timeout, + ) + except asyncio.TimeoutError: + logger.debug(f"{symbol} K线拉取超时({klines_timeout:.0f}秒),使用降级结果(仅涨跌幅/成交量)") + klines, klines_4h = [], [] + + if not klines or len(klines) < 2: + # 降级:仍有 ticker 时返回仅涨跌幅/成交量的结果,不直接跳过,避免整轮扫描被拖慢 + try: + change_pct = float(ticker.get('changePercent', 0) or 0) + vol = float(ticker.get('volume', 0) or ticker.get('quoteVolume', 0) or 0) + price = ticker_price if ticker_price is not None else float(ticker.get('lastPrice', 0) or ticker.get('price', 0) or 0) + return { + 'symbol': symbol, + 'price': price, + 'kline_close_price': price, + 'ticker_price': ticker_price, + 'ticker_ts': ticker_ts, + 'prevPrice': None, + 'kline_change_percent': change_pct, + 'changePercent': change_pct, + 'volume24h': vol, + 'direction': 'UP' if change_pct > 0 else 'DOWN', + 'rsi': None, + 'macd': None, + 'bollinger': None, + 'atr': None, + 'ema20': None, + 'ema50': None, + 'ema20_4h': None, + 'price_4h': None, + 'marketRegime': 'unknown', + 'signalScore': 0, + 'signal_strength': 0, + 'trend_4h': None, + 'klines': [], + 'klines_4h': [], + } + except Exception as e: + logger.debug(f"{symbol} 降级结果构建失败: {e}") + return None # 提取价格数据(主周期) close_prices = [float(k[4]) for k in klines] # 收盘价 @@ -341,8 +380,6 @@ class MarketScanner: # ⚠️ 优化:检查技术指标计算结果缓存(基于K线数据的最后更新时间) # 如果K线数据没有更新,可以直接使用缓存的技术指标 - primary_interval = config.TRADING_CONFIG.get('PRIMARY_INTERVAL', '1h') - confirm_interval = config.TRADING_CONFIG.get('CONFIRM_INTERVAL', '4h') cache_key_indicators = f"indicators:{symbol}:{primary_interval}:{confirm_interval}" last_kline_time = int(klines[-1][0]) if klines else 0 # 最后一根K线的时间戳 diff --git a/trading_system/position_manager.py b/trading_system/position_manager.py index ef57f17..672c7c8 100644 --- a/trading_system/position_manager.py +++ b/trading_system/position_manager.py @@ -1607,6 +1607,20 @@ class PositionManager: if mark_price and float(mark_price) > 0: current_price = float(mark_price) logger.debug(f"{symbol} 从持仓获取标记价格: {current_price}") + # 3) REST:深度最优档中点(权重低)→ 24h ticker + if current_price is None: + depth = await self.client.get_depth(symbol, limit=5) + if depth: + bids = depth.get("bids") or [] + asks = depth.get("asks") or [] + if bids and asks and len(bids[0]) >= 1 and len(asks[0]) >= 1: + try: + mid = (float(bids[0][0]) + float(asks[0][0])) / 2 + if mid > 0: + current_price = mid + logger.debug(f"{symbol} 从 depth REST 获取当前价格: {current_price}") + except (ValueError, TypeError, IndexError): + pass if current_price is None: ticker = await self.client.get_ticker_24h(symbol) if ticker: @@ -1619,7 +1633,7 @@ class PositionManager: # 如果仍然没有当前价格,记录警告 if current_price is None: - logger.warning(f"{symbol} ⚠️ 无法获取当前价格(已尝试 WS bookTicker/ticker24h、持仓、REST),止损单可能无法正确验证触发条件") + logger.warning(f"{symbol} ⚠️ 无法获取当前价格(已尝试 WS bookTicker/ticker24h、持仓、depth、REST ticker),止损单可能无法正确验证触发条件") # 在挂止损单前,检查当前价格是否已经触发止损(避免 -2021 错误) if current_price and stop_loss: diff --git a/行情接口REST.txt b/行情接口REST.txt index 55ca20b..c790e53 100644 --- a/行情接口REST.txt +++ b/行情接口REST.txt @@ -241,3 +241,955 @@ symbol STRING NO 交易对 ] +深度信息 +接口描述 +交易对深度信息 + +HTTP请求 +GET /fapi/v1/depth + +注意: 响应消息不包含RPI订单,其不可见。 + +请求权重 +limit 权重 +5, 10, 20, 50 2 +100 5 +500 10 +1000 20 +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +limit INT NO 默认 500; 可选值:[5, 10, 20, 50, 100, 500, 1000] +响应示例 +{ + "lastUpdateId": 1027024, + "E": 1589436922972, // 消息时间 + "T": 1589436922959, // 撮合引擎时间 + "bids": [ // 买单 + [ + "4.00000000", // 价格 + "431.00000000" // 数量 + ] + ], + "asks": [ // 卖单 + [ + "4.00000200", // 价格 + "12.00000000" // 数量 + ] + ] +} + +RPI深度信息 +接口描述 +交易对深度信息,包含非交叉的RPI订单 + +HTTP请求 +GET /fapi/v1/rpiDepth + +注意: 响应消息包含RPI订单数量。相互交叉的价格档位不可见。 + +请求权重 +limit 权重 +1000 20 +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +limit INT NO 默认 1000; 可选值:[1000] +响应示例 +{ + "lastUpdateId": 1027024, + "E": 1589436922972, // 消息时间 + "T": 1589436922959, // 撮合引擎时间 + "bids": [ // 买单 + [ + "4.00000000", // 价格 + "431.00000000" // 数量 + ] + ], + "asks": [ // 卖单 + [ + "4.00000200", // 价格 + "12.00000000" // 数量 + ] + ] +} + +近期成交 +接口描述 +获取近期订单簿成交 + +HTTP请求 +GET /fapi/v1/trades + +注意: 响应消息不包含RPI订单,其不可见。 + +请求权重 +5 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +limit INT NO 默认:500,最大1000 +仅返回订单簿成交,即不会返回保险基金和自动减仓(ADL)成交 +响应示例 +[ + { + "id": 28457, // 成交ID + "price": "4.00000100", // 成交价格 + "qty": "12.00000000", // 成交量 + "quoteQty": "48.00", // 成交额 + "time": 1499865549590, // 时间 + "isBuyerMaker": true // 买方是否为挂单方 + "isRPITrade": true // Maker方是否为RPI挂单 + } +] + +查询历史成交(MARKET_DATA) +接口描述 +查询订单簿历史成交 + +HTTP请求 +GET /fapi/v1/historicalTrades + +请求权重 +20 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +limit INT NO 默认值:100 最大值:500. +fromId LONG NO 从哪一条成交id开始返回. 缺省返回最近的成交记录 +仅返回订单簿成交,即不会返回保险基金和自动减仓(ADL)成交 +仅支持返回最近3个月的数据 +响应示例 +[ + { + "id": 28457, // 成交ID + "price": "4.00000100", // 成交价格 + "qty": "12.00000000", // 成交量 + "quoteQty": "48.00", // 成交额 + "time": 1499865549590, // 时间 + "isBuyerMaker": true // 买方是否为挂单方 + "isRPITrade": true // Maker方是否为RPI挂单 + } +] + +近期成交(归集) +接口描述 +归集交易与逐笔交易的区别在于,同一价格、同一方向、同一时间(100ms计算)的订单簿trade会被聚合为一条 + +HTTP请求 +GET /fapi/v1/aggTrades + +注意: 响应消息聚合RPI订单数据,但无任何特殊标签区别。 + +权重: 20 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +fromId LONG NO 从包含fromID的成交开始返回结果 +startTime LONG NO 从该时刻之后的成交记录开始返回结果 +endTime LONG NO 返回该时刻为止的成交记录 +limit INT NO 默认 500; 最大 1000. +接口仅支持查询最近1年的交易数据 +如果同时发送startTime和endTime,间隔必须小于一小时 +如果没有发送任何筛选参数(fromId, startTime, endTime),默认返回最近的成交记录 +保险基金和自动减仓(ADL)成交不属于订单簿成交,故不会被归并聚合 +同时发送startTime/endTime和fromId可能导致请求超时,建议仅发送fromId或仅发送startTime和endTime +响应示例 +[ + { + "a": 26129, // 归集成交ID + "p": "0.01633102", // 成交价 + "q": "4.70443515", // 成交量 + "f": 27781, // 被归集的首个成交ID + "l": 27781, // 被归集的末个成交ID + "T": 1498793709153, // 成交时间 + "m": true, // 是否为主动卖出单 + } +] + + +K线数据 +接口描述 +每根K线的开盘时间可视为唯一ID + +HTTP请求 +GET /fapi/v1/klines + +请求权重 +取决于请求中的LIMIT参数 + +LIMIT参数 权重 +[1,100) 1 +[100, 500) 2 +[500, 1000] 5 +> 1000 10 +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +interval ENUM YES 时间间隔 +startTime LONG NO 起始时间 +endTime LONG NO 结束时间 +limit INT NO 默认值:500 最大值:1500. +缺省返回最近的数据 +响应示例 +[ + [ + 1499040000000, // 开盘时间 + "0.01634790", // 开盘价 + "0.80000000", // 最高价 + "0.01575800", // 最低价 + "0.01577100", // 收盘价(当前K线未结束的即为最新价) + "148976.11427815", // 成交量 + 1499644799999, // 收盘时间 + "2434.19055334", // 成交额 + 308, // 成交笔数 + "1756.87402397", // 主动买入成交量 + "28.46694368", // 主动买入成交额 + "17928899.62484339" // 请忽略该参数 + ] +] + + +连续合约K线数据 +接口描述 +每根K线的开盘时间可视为唯一ID + +HTTP请求 +GET /fapi/v1/continuousKlines + +请求权重 +取决于请求中的LIMIT参数 + +LIMIT参数 权重 +[1,100) 1 +[100, 500) 2 +[500, 1000] 5 +> 1000 10 +请求参数 +名称 类型 是否必需 描述 +pair STRING YES 标的交易对 +contractType ENUM YES 合约类型 +interval ENUM YES 时间间隔 +startTime LONG NO 起始时间 +endTime LONG NO 结束时间 +limit INT NO 默认值:500 最大值:1500 +缺省返回最近的数据 + +合约类型: + +PERPETUAL 永续合约 +CURRENT_QUARTER 当季交割合约 +NEXT_QUARTER 次季交割合约 +TRADIFI_PERPETUAL 传统金融合约 +响应示例 +[ + [ + 1607444700000, // 开盘时间 + "18879.99", // 开盘价 + "18900.00", // 最高价 + "18878.98", // 最低价 + "18896.13", // 收盘价(当前K线未结束的即为最新价) + "492.363", // 成交量 + 1607444759999, // 收盘时间 + "9302145.66080", // 成交额 + 1874, // 成交笔数 + "385.983", // 主动买入成交量 + "7292402.33267", // 主动买入成交额 + "0" // 请忽略该参数 + ] +] + + +价格指数K线数据 +接口描述 +价格指数K线数据,每根K线的开盘时间可视为唯一ID + +HTTP请求 +GET /fapi/v1/indexPriceKlines + +请求权重 +取决于请求中的LIMIT参数 + +LIMIT参数 权重 +[1,100) 1 +[100, 500) 2 +[500, 1000] 5 +> 1000 10 +请求参数 +名称 类型 是否必需 描述 +pair STRING YES 标的交易对 +interval ENUM YES 时间间隔 +startTime LONG NO 起始时间 +endTime LONG NO 结束时间 +limit INT NO 默认值:500 最大值:1500 +缺省返回最近的数据 +响应示例 +[ + [ + 1591256400000, // 开盘时间 + "9653.69440000", // 开盘价 + "9653.69640000", // 最高价 + "9651.38600000", // 最低价 + "9651.55200000", // 收盘价(当前K线未结束的即为最新价) + "0 ", // 请忽略 + 1591256459999, // 收盘时间 + "0", // 请忽略 + 60, // 请忽略 + "0", // 请忽略 + "0", // 请忽略 + "0" // 请忽略 + ] +] + + +标记价格K线数据 +接口描述 +每根K线的开盘时间可视为唯一ID + +HTTP请求 +GET /fapi/v1/markPriceKlines + +请求权重 +取决于请求中的LIMIT参数 + +LIMIT参数 权重 +[1,100) 1 +[100, 500) 2 +[500, 1000] 5 +> 1000 10 +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +interval ENUM YES 时间间隔 +startTime LONG NO 起始时间 +endTime LONG NO 结束时间 +limit INT NO 默认值:500 最大值:1500 +缺省返回最近的数据 +响应示例 +[ + [ + 1591256400000, // 开盘时间 + "9653.69440000", // 开盘价 + "9653.69640000", // 最高价 + "9651.38600000", // 最低价 + "9651.55200000", // 收盘价(当前K线未结束的即为最新价) + "0 ", // 请忽略 + 1591256459999, // 收盘时间 + "0", // 请忽略 + 60, // 请忽略 + "0", // 请忽略 + "0", // 请忽略 + "0" // 请忽略 + ] +] + + +溢价指数K线数据 +接口描述 +合约溢价指数K线。每根K线的开盘时间可视为唯一ID。 + +HTTP请求 +GET /fapi/v1/premiumIndexKlines + +请求权重 +取决于请求中的LIMIT参数 + +LIMIT参数 权重 +[1,100) 1 +[100, 500) 2 +[500, 1000] 5 +> 1000 10 +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +interval ENUM YES 时间间隔 +startTime LONG NO 起始时间 +endTime LONG NO 结束时间 +limit INT NO 默认值:500 最大值:1500 +缺省返回最近的数据 +响应示例 +[ + [ + 1691603820000, // 开盘时间 + "-0.00042931", // 开盘价 + "-0.00023641", // 最高价 + "-0.00059406", // 最低价 + "-0.00043659", // 收盘价 + "0", // 请忽略 + 1691603879999, // 收盘时间 + "0", // 请忽略 + 12, // 请忽略 + "0", // 请忽略 + "0", // 请忽略 + "0" // 请忽略 + ] +] + + +最新标记价格和资金费率 +接口描述 +采集各大交易所数据加权平均 + +HTTP请求 +GET /fapi/v1/premiumIndex + +请求权重 +带symbol 1, 不带symbol 10 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING NO 交易对 +响应示例 +响应: + +{ + "symbol": "BTCUSDT", // 交易对 + "markPrice": "11793.63104562", // 标记价格 + "indexPrice": "11781.80495970", // 指数价格 + "estimatedSettlePrice": "11781.16138815", // 预估结算价,仅在交割开始前最后一小时有意义 + "lastFundingRate": "0.00038246", // 最近更新的资金费率 + "interestRate": "0.00010000", // 标的资产基础利率 + "nextFundingTime": 1597392000000, // 下次资金费时间 + "time": 1597370495002 // 更新时间 +} + +当不指定symbol时相应 + +[ + { + "symbol": "BTCUSDT", // 交易对 + "markPrice": "11793.63104562", // 标记价格 + "indexPrice": "11781.80495970", // 指数价格 + "estimatedSettlePrice": "11781.16138815", // 预估结算价,仅在交割开始前最后一小时有意义 + "lastFundingRate": "0.00038246", // 最近更新的资金费率 + "interestRate": "0.00010000", // 标的资产基础利率 + "nextFundingTime": 1597392000000, // 下次资金费时间 + "time": 1597370495002 // 更新时间 + } +] + + +查询资金费率历史 +接口描述 +查询资金费率历史 + +HTTP请求 +GET /fapi/v1/fundingRate + +请求权重 +和GET /fapi/v1/fundingInfo共享500/5min/IP + +请求参数 +名称 类型 是否必需 描述 +symbol STRING NO 交易对 +startTime LONG NO 起始时间 +endTime LONG NO 结束时间 +limit INT NO 默认值:100 最大值:1000 +如果 startTime 和 endTime 都未发送, 返回最近200条数据. +如果 startTime 和 endTime 之间的数据量大于 limit, 返回 startTime + limit情况下的数据。 +响应示例 +[ + { + "symbol": "BTCUSDT", // 交易对 + "fundingRate": "-0.03750000", // 资金费率 + "fundingTime": 1570608000000, // 资金费时间 + "markPrice": "34287.54619963" // 资金费对应标记价格 + }, + { + "symbol": "BTCUSDT", + "fundingRate": "0.00010000", + "fundingTime": 1570636800000, + "markPrice": "34287.54619963" // 资金费对应标记价格 + } +] + + +查询资金费率信息 +接口描述 +查询资金费率信息,接口仅返回FundingRateCap/FundingRateFloor/fundingIntervalHours等被特殊调整过的交易对,没调整过的不返回。 + +HTTP请求 +GET /fapi/v1/fundingInfo + +请求权重 +0 + +和GET /fapi/v1/fundingRate共享500/5min/IP + +请求参数 +响应示例 +[ + { + "symbol": "BLZUSDT", + "adjustedFundingRateCap": "0.02500000", + "adjustedFundingRateFloor": "-0.02500000", + "fundingIntervalHours": 8, + "disclaimer": false + } +] + +24hr价格变动情况 +接口描述 +请注意,不携带symbol参数会返回全部交易对数据,不仅数据庞大,而且权重极高 + +HTTP请求 +GET /fapi/v1/ticker/24hr + +请求权重 +带symbol为1, 不带为40 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING NO 交易对 +不发送交易对参数,则会返回所有交易对信息 +响应示例 +{ + "symbol": "BTCUSDT", + "priceChange": "-94.99999800", //24小时价格变动 + "priceChangePercent": "-95.960", //24小时价格变动百分比 + "weightedAvgPrice": "0.29628482", //加权平均价 + "lastPrice": "4.00000200", //最近一次成交价 + "lastQty": "200.00000000", //最近一次成交额 + "openPrice": "99.00000000", //24小时内第一次成交的价格 + "highPrice": "100.00000000", //24小时最高价 + "lowPrice": "0.10000000", //24小时最低价 + "volume": "8913.30000000", //24小时成交量 + "quoteVolume": "15.30000000", //24小时成交额 + "openTime": 1499783499040, //24小时内,第一笔交易的发生时间 + "closeTime": 1499869899040, //24小时内,最后一笔交易的发生时间 + "firstId": 28385, // 首笔成交id + "lastId": 28460, // 末笔成交id + "count": 76 // 成交笔数 +} + +或(当不发送交易对信息) + +[ + { + "symbol": "BTCUSDT", + "priceChange": "-94.99999800", //24小时价格变动 + "priceChangePercent": "-95.960", //24小时价格变动百分比 + "weightedAvgPrice": "0.29628482", //加权平均价 + "lastPrice": "4.00000200", //最近一次成交价 + "lastQty": "200.00000000", //最近一次成交额 + "openPrice": "99.00000000", //24小时内第一次成交的价格 + "highPrice": "100.00000000", //24小时最高价 + "lowPrice": "0.10000000", //24小时最低价 + "volume": "8913.30000000", //24小时成交量 + "quoteVolume": "15.30000000", //24小时成交额 + "openTime": 1499783499040, //24小时内,第一笔交易的发生时间 + "closeTime": 1499869899040, //24小时内,最后一笔交易的发生时间 + "firstId": 28385, // 首笔成交id + "lastId": 28460, // 末笔成交id + "count": 76 // 成交笔数 + } +] + + +最新价格V2 +接口描述 +返回最近价格 + +HTTP请求 +GET /fapi/v2/ticker/price + +请求权重 +单交易对1,无交易对2 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING NO 交易对 +不发送交易对参数,则会返回所有交易对信息 +该接口返回头中的X-MBX-USED-WEIGHT-1M参数不准确,可以忽略 +响应示例 +响应: + +{ + "symbol": "LTCBTC", // 交易对 + "price": "4.00000200", // 价格 + "time": 1589437530011 // 撮合引擎时间 +} + +或(当不发送symbol) + +[ + { + "symbol": "BTCUSDT", // 交易对 + "price": "6000.01", // 价格 + "time": 1589437530011 // 撮合引擎时间 + } +] + +当前最优挂单 +接口描述 +返回当前最优的挂单(最高买单,最低卖单) + +HTTP请求 +GET /fapi/v1/ticker/bookTicker + +注意: 响应消息不包含RPI订单,其不可见。 + +请求权重 +单交易对2,无交易对5 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING NO 交易对 +不发送交易对参数,则会返回所有交易对信息 +该接口返回头中的X-MBX-USED-WEIGHT-1M参数不准确,可以忽略 +响应示例 +{ + "symbol": "BTCUSDT", // 交易对 + "bidPrice": "4.00000000", //最优买单价 + "bidQty": "431.00000000", //挂单量 + "askPrice": "4.00000200", //最优卖单价 + "askQty": "9.00000000", //挂单量 + "time": 1589437530011 // 撮合引擎时间 +} + +或(当不发送symbol) + +[ + { + "symbol": "BTCUSDT", // 交易对 + "bidPrice": "4.00000000", //最优买单价 + "bidQty": "431.00000000", //挂单量 + "askPrice": "4.00000200", //最优卖单价 + "askQty": "9.00000000", //挂单量 + "time": 1589437530011 // 撮合引擎时间 + } +] + + +季度合约历史结算价 +接口描述 +返回季度合约历史结算价 + +HTTP请求 +GET /futures/data/delivery-price + +请求权重 +0 + +请求参数 +名称 类型 是否必需 描述 +pair STRING YES 如BTCUSDT +响应示例 +响应: + +[ + { + "deliveryTime": 1695945600000, + "deliveryPrice": 27103.00000000 + }, + { + "deliveryTime": 1688083200000, + "deliveryPrice": 30733.60000000 + }, + { + "deliveryTime": 1680220800000, + "deliveryPrice": 27814.20000000 + }, + { + "deliveryTime": 1648166400000, + "deliveryPrice": 44066.30000000 + } +] + + +获取未平仓合约数 +接口描述 +获取未平仓合约数 + +HTTP请求 +GET /fapi/v1/openInterest + +请求权重 +1 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES 交易对 +响应示例 +{ + "openInterest": "10659.509", // 未平仓合约数量 + "symbol": "BTCUSDT", // 交易对 + "time": 1589437530011 // 撮合引擎时间 +} + + +合约持仓量历史 +接口描述 +查询合约持仓量历史 + +HTTP请求 +GET /futures/data/openInterestHist + +请求权重 +0 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES +period ENUM YES "5m","15m","30m","1h","2h","4h","6h","12h","1d" +limit LONG NO default 30, max 500 +startTime LONG NO +endTime LONG NO +若无 startime 和 endtime 限制, 则默认返回当前时间往前的limit值 +仅支持最近1个月的数据 +IP限频为1000次/5min +响应示例 +[ + { + "symbol":"BTCUSDT", + "sumOpenInterest":"20403.12345678",// 持仓总数量 + "sumOpenInterestValue": "176196512.12345678", // 持仓总价值 + "CMCCirculatingSupply": "165880.538", // CMC提供的流通供应量 + "timestamp":"1583127900000" + + }, + { + + "symbol":"BTCUSDT", + "sumOpenInterest":"20401.36700000", + "sumOpenInterestValue":"149940752.14464448", + "CMCCirculatingSupply": "165900.14853", + "timestamp":"1583128200000" + }, +] + +大户持仓量多空比 +接口描述 +大户的多头和空头总持仓量占比,大户指保证金余额排名前20%的用户。 多仓持仓量比例 = 大户多仓持仓量 / 大户总持仓量 空仓持仓量比例 = 大户空仓持仓量 / 大户总持仓量 多空持仓量比值 = 多仓持仓量比例 / 空仓持仓量比例 + +HTTP请求 +GET /futures/data/topLongShortPositionRatio + +请求权重 +0 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES +period ENUM YES "5m","15m","30m","1h","2h","4h","6h","12h","1d" +limit LONG NO default 30, max 500 +startTime LONG NO +endTime LONG NO +若无 startime 和 endtime 限制, 则默认返回当前时间往前的limit值 +仅支持最近30天的数据 +IP限频为1000次/5min +响应示例 +[ + { + "symbol":"BTCUSDT", + "longShortRatio":"1.4342",// 大户多空持仓量比值 + "longAccount": "0.5344", // 大户多仓持仓量比例 + "shortAccount":"0.4238", // 大户空仓持仓量比例 + "timestamp":"1583139600000" + + }, + + { + + "symbol":"BTCUSDT", + "longShortRatio":"1.4337", + "longAccount": "0.5891", + "shortAccount":"0.4108", + "timestamp":"1583139900000" + + }, + +] + +大户账户数多空比 +接口描述 +持仓大户的净持仓多头和空头账户数占比,大户指保证金余额排名前20%的用户。一个账户记一次。 多仓账户数比例 = 持多仓大户数 / 总持仓大户数 空仓账户数比例 = 持空仓大户数 / 总持仓大户数 多空账户数比值 = 多仓账户数比例 / 空仓账户数比例 + +HTTP请求 +GET /futures/data/topLongShortAccountRatio + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES +period ENUM YES "5m","15m","30m","1h","2h","4h","6h","12h","1d" +limit LONG NO default 30, max 500 +startTime LONG NO +endTime LONG NO +若无 startime 和 endtime 限制, 则默认返回当前时间往前的limit值 +仅支持最近30天的数据 +IP限频为1000次/5min +响应示例 +[ + { + "symbol":"BTCUSDT", + "longShortRatio":"1.8105",// 大户多空账户数比值 + "longAccount": "0.6442", // 大户多仓账户数比例 + "shortAccount":"0.3558", // 大户空仓账户数比例 + "timestamp":"1583139600000" + }, + { + + "symbol":"BTCUSDT", + "longShortRatio":"1.8233", + "longAccount": "0.5338", + "shortAccount":"0.3454", + "timestamp":"1583139900000" + } +] + + +多空持仓人数比 +接口描述 +多空持仓人数比 + +HTTP请求 +GET /futures/data/globalLongShortAccountRatio + +请求权重 +0 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES +period ENUM YES "5m","15m","30m","1h","2h","4h","6h","12h","1d" +limit LONG NO default 30, max 500 +startTime LONG NO +endTime LONG NO +若无 startime 和 endtime 限制, 则默认返回当前时间往前的limit值 +仅支持最近30天的数据 +IP限频为1000次/5min +响应示例 +[ + { + "symbol":"BTCUSDT", + "longShortRatio":"0.1960", // 多空人数比值 + "longAccount": "0.6622", // 多仓人数比例 + "shortAccount":"0.3378", // 空仓人数比例 + "timestamp":"1583139600000" + + }, + + { + + "symbol":"BTCUSDT", + "longShortRatio":"1.9559", + "longAccount": "0.6617", + "shortAccount":"0.3382", + "timestamp":"1583139900000" + + }, + +] + + +合约主动买卖量 +接口描述 +合约主动买卖量 + +HTTP请求 +GET /futures/data/takerlongshortRatio + +请求权重 +0 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING YES +period ENUM YES "5m","15m","30m","1h","2h","4h","6h","12h","1d" +limit LONG NO default 30, max 500 +startTime LONG NO +endTime LONG NO +若无 startime 和 endtime 限制, 则默认返回当前时间往前的 limit 值 +仅支持最近 30 天的数据 +IP限频为1000次/5min +响应示例 +[ + { + buySellRatio: "1.5586", + buyVol: "387.3300", // 主动买入量 + sellVol: "248.5030", // 主动卖出量 + timestamp: "1585614900000", + }, + + { + buySellRatio: "1.3104", + buyVol: "343.9290", + sellVol: "248.5030", + timestamp: "1583139900000", + }, +] + +基差 +接口描述 +查询期货基差 + +HTTP请求 +GET /futures/data/basis + +请求权重 +0 + +请求参数 +名称 类型 是否必需 描述 +pair STRING YES BTCUSDT +contractType ENUM YES CURRENT_QUARTER, NEXT_QUARTER, PERPETUAL +period ENUM YES "5m","15m","30m","1h","2h","4h","6h","12h","1d" +limit LONG YES Default 30,Max 500 +startTime LONG NO +endTime LONG NO +若无 startime 和 endtime 限制, 则默认返回当前时间往前的limit值 +仅支持最近30天的数据 +响应示例 +[ + { + "indexPrice": "34400.15945055", + "contractType": "PERPETUAL", + "basisRate": "0.0004", + "futuresPrice": "34414.10", + "annualizedBasisRate": "", + "basis": "13.94054945", + "pair": "BTCUSDT", + "timestamp": 1698742800000 + } +] + + +综合指数交易对信息 +接口描述 +获取交易对为综合指数的基础成分信息。 + +HTTP请求 +GET /fapi/v1/indexInfo + +请求权重 +1 + +请求参数 +名称 类型 是否必需 描述 +symbol STRING NO +响应示例 +[ + { + "symbol": "DEFIUSDT", + "time": 1589437530011, // 请求时间 + "component": "baseAsset", //成分资产 + "baseAssetList":[ + { + "baseAsset":"BAL", // 基础资产 + "quoteAsset": "USDT", // 报价资产 + "weightInQuantity":"1.04406228", //权重(数量) + "weightInPercentage":"0.02783900" //权重(比例) + }, + { + "baseAsset":"BAND", + "quoteAsset": "USDT", + "weightInQuantity":"3.53782729", + "weightInPercentage":"0.03935200" + } + ] + } +] +