feat(binance_client, position_manager): 增强杠杆设置与异常处理逻辑

在 `binance_client.py` 中为杠杆设置添加了网络超时重试机制,确保在请求超时的情况下能够自动重试,提升了系统的稳定性。同时,在 `position_manager.py` 中优化了临时持仓记录的错误日志,增加了异常信息的详细记录,便于后续调试与问题追踪。这些改进增强了系统的可靠性与可维护性。
This commit is contained in:
薇薇安 2026-02-21 10:44:55 +08:00
parent b588d5b82b
commit 3bfbafbab2
2 changed files with 37 additions and 27 deletions

View File

@ -2641,32 +2641,38 @@ class BinanceClient:
# 必须确保序列中的值小于 target_leverage
fallback_levels = [50, 20, 10, 5, 3, 2, 1]
# 第一次尝试:目标杠杆
try:
await self.client.futures_change_leverage(symbol=symbol, leverage=target_leverage)
logger.info(f"设置杠杆成功: {symbol} {target_leverage}x")
return target_leverage
except BinanceAPIException as e:
error_msg = str(e).lower()
logger.warning(f"设置杠杆 {target_leverage}x 失败: {e},尝试降低杠杆...")
# 如果是 leverage 相关错误,尝试降级
if 'leverage' in error_msg or 'invalid' in error_msg or 'max' in error_msg:
for fallback in fallback_levels:
if fallback >= target_leverage:
continue
try:
await self.client.futures_change_leverage(symbol=symbol, leverage=fallback)
logger.warning(
f"{symbol} 杠杆降级成功: {target_leverage}x -> {fallback}x"
)
return fallback
except BinanceAPIException:
continue
logger.error(f"设置杠杆最终失败: {symbol} (目标: {target_leverage}x)")
return 0
# 第一次尝试:目标杠杆(网络超时重试 2 次)
for attempt in range(3):
try:
await self.client.futures_change_leverage(symbol=symbol, leverage=target_leverage)
logger.info(f"设置杠杆成功: {symbol} {target_leverage}x")
return target_leverage
except (TimeoutError, asyncio.TimeoutError):
if attempt < 2:
wait_sec = (attempt + 1) * 3
logger.warning(f"设置杠杆请求超时 ({symbol} {target_leverage}x){wait_sec} 秒后重试 ({attempt + 1}/2)")
await asyncio.sleep(wait_sec)
else:
logger.error(f"设置杠杆请求超时 ({symbol} {target_leverage}x),已重试 2 次仍失败")
return 0
except BinanceAPIException as e:
error_msg = str(e).lower()
logger.warning(f"设置杠杆 {target_leverage}x 失败: {e},尝试降低杠杆...")
# 如果是 leverage 相关错误,尝试降级
if 'leverage' in error_msg or 'invalid' in error_msg or 'max' in error_msg:
for fallback in fallback_levels:
if fallback >= target_leverage:
continue
try:
await self.client.futures_change_leverage(symbol=symbol, leverage=fallback)
logger.warning(
f"{symbol} 杠杆降级成功: {target_leverage}x -> {fallback}x"
)
return fallback
except (TimeoutError, asyncio.TimeoutError, BinanceAPIException):
continue
logger.error(f"设置杠杆最终失败: {symbol} (目标: {target_leverage}x)")
return 0
def get_realtime_price(self, symbol: str) -> Optional[float]:
"""

View File

@ -3609,7 +3609,11 @@ class PositionManager:
except Exception as e:
logger.warning(f"{symbol} 补挂币安止盈止损失败(不影响监控): {e}")
except Exception as e:
logger.error(f"[账号{self.account_id}] {symbol} 创建临时持仓记录失败: {e}")
err_msg = str(e) or repr(e) or type(e).__name__
logger.error(
f"[账号{self.account_id}] {symbol} 创建临时持仓记录失败: {err_msg}",
exc_info=True,
)
else:
# 已在 active_positions 的持仓:启动前统一补挂/修正交易所 SL/TP识别缺止盈、止损过远等异常并替换
position_info = self.active_positions.get(symbol)