auto_trade_sys/BINANCE_IP_BAN_1003.md
薇薇安 154f1fbf1d 1
2026-02-15 08:26:22 +08:00

69 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 币安 API -1003 限频/封禁说明
## 错误含义
- **APIError(code=-1003)**: `Way too many requests; IP ... banned until 1771041059726`
- 表示当前 IP 请求过于频繁,被**临时封禁**,直到指定时间戳(毫秒)后自动解除。
## 如何查看「还要等多久」
时间戳 `1771041059726` 是**毫秒**,表示封禁**解除时间**Unix 时间戳,毫秒)。
在项目根目录执行:
```bash
python3 -c "
from datetime import datetime, timezone
ts_ms = 1771041059726 # 替换成你日志里的时间戳
utc = datetime.fromtimestamp(ts_ms/1000, tz=timezone.utc)
now = datetime.now(timezone.utc)
delta = utc - now
print('解封时间(UTC):', utc.strftime('%Y-%m-%d %H:%M:%S'))
print('当前时间(UTC):', now.strftime('%Y-%m-%d %H:%M:%S'))
if delta.total_seconds() > 0:
print('还需等待:', delta.days, '天', delta.seconds//3600, '小时', (delta.seconds%3600)//60, '分钟')
else:
print('已过解封时间,可重试;若仍报错可等几分钟或换网络。')
"
```
把上面脚本里的 `1771041059726` 换成你实际日志中的 `banned until` 后面的数字即可。
## 如何减少再次被限/封禁
1. **拉大扫描间隔**:全局配置里把 `SCAN_INTERVAL` 调大(如 900 → 1200 或 1800降低整体请求频率。
2. **缩小扫描范围**:适当减小 `MAX_SCAN_SYMBOLS`、`TOP_N_SYMBOLS`,减少单次扫描的 API 调用量。
3. **并发已做限制**`market_scanner` 已用信号量限制并发(如 3避免同时打爆若仍触限可再减小并发或增加批次间延迟。
4. **错误提示**日志里「分析超时10秒」多是因为当时已被限频/封禁导致请求挂起或失败,解封后一般会恢复。
解封后若仍偶发 -1003可先等 12 分钟再跑,或临时增大 `SCAN_INTERVAL` 再观察。
---
## 获取持仓/成交超时TimeoutError
若日志出现「获取持仓信息最终失败 (已重试 7 次): TimeoutError」或「获取成交记录失败 XXX (已重试 5 次): TimeoutError」
1. **网络/限频**:与 -1003 类似,可能是当时网络抖动或请求排队,重试已用 60 秒超时 × 多轮;过几分钟通常恢复。
2. **适当拉长只读超时**(可选):在运行交易进程的环境里设置环境变量
`READ_ONLY_REQUEST_TIMEOUT=90`(默认 60 秒),只读接口(持仓、成交、交易对信息)单次等待时间会变长,**不影响下单/止损止盈的快速失败**。
3. **本次已做**:获取交易对信息(如 ENAUSDT增加 60 秒超时 + 3 次重试;获取成交记录后几次重试间隔改为 2 秒;开仓失败时会打出完整异常与堆栈,便于排查。
---
## 近期改动是否增加请求量?
**不会。** 近期「止损/止盈按保证金封顶」USE_MARGIN_CAP_FOR_SL、USE_MARGIN_CAP_FOR_TP只改动了 **risk_manager 里 SL/TP 价格的计算方式**,没有新增任何对币安 API 的调用。
-1003 来自**原有**的请求:如 `get_open_positions`、`get_account_balance`、`sync_positions_with_binance`、策略轮询、持仓/挂单同步等。要降低 -1003 概率,请拉大 `SCAN_INTERVAL`、减小扫描/同步频率(见上文「如何减少再次被限/封禁」),或改用 WebSocket 获取行情/持仓(若已接入)。
---
## 拿不到余额时,止盈止损还能正常执行吗?
**能。** 只要止损/止盈已经以**条件单**形式挂在币安STOP_MARKET / TAKE_PROFIT_MARKET触发与成交都由**币安撮合引擎**执行,不依赖本机是否还能调 API、能否拿到余额或持仓。
- **已挂在交易所的 SL/TP**:即使本机拿不到余额、持仓接口报错或 IP 被临时封禁,价格触及后仍会按交易所订单正常触发、平仓。
- **依赖本机的部分**:若在封禁期间**新开仓**或需要**补挂** SL/TP会因请求失败而无法下单已存在仓位若之前已成功调用 `_ensure_exchange_sltp_orders` 并挂上保护单,则不受影响。
**结论**:拿不到余额/持仓只影响「本机展示与同步、新开仓、补挂单」;**已挂在币安上的止盈止损单会照常执行**,可放心。