feat(binance_client, market_scanner, position_manager): 增强行情数据获取与处理逻辑

在 `binance_client` 中新增多个公开行情接口,包括深度信息、资金费率和未平仓合约数的获取,优化了 REST API 的调用逻辑。更新 `market_scanner` 以并行请求主周期和确认周期的 K线数据,提升了数据获取效率并引入超时处理。`position_manager` 中增加了从深度信息获取当前价格的逻辑,确保在多种情况下都能准确获取价格,增强了系统的稳定性和可追溯性。
This commit is contained in:
薇薇安 2026-02-16 17:30:05 +08:00
parent 3539180362
commit 249aec917a
7 changed files with 1230 additions and 20 deletions

View File

@ -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` 里怎么用)。

View File

@ -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/<endpoint>,权重多为 0IP 限频 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本位合约账户余额

View File

@ -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', # 确认周期日线,看大趋势

View File

@ -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

View File

@ -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线的时间戳

View File

@ -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:

View File

@ -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"
}
]
}
]