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

View File

@ -3609,7 +3609,11 @@ class PositionManager:
except Exception as e: except Exception as e:
logger.warning(f"{symbol} 补挂币安止盈止损失败(不影响监控): {e}") logger.warning(f"{symbol} 补挂币安止盈止损失败(不影响监控): {e}")
except Exception as 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: else:
# 已在 active_positions 的持仓:启动前统一补挂/修正交易所 SL/TP识别缺止盈、止损过远等异常并替换 # 已在 active_positions 的持仓:启动前统一补挂/修正交易所 SL/TP识别缺止盈、止损过远等异常并替换
position_info = self.active_positions.get(symbol) position_info = self.active_positions.get(symbol)