# 币安 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,可先等 1~2 分钟再跑,或临时增大 `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` 并挂上保护单,则不受影响。 **结论**:拿不到余额/持仓只影响「本机展示与同步、新开仓、补挂单」;**已挂在币安上的止盈止损单会照常执行**,可放心。