1
This commit is contained in:
parent
c9f676c68a
commit
a19c716166
|
|
@ -1849,7 +1849,7 @@ class BinanceClient:
|
||||||
logger.debug(f" 堆栈跟踪: {traceback.format_exc()}")
|
logger.debug(f" 堆栈跟踪: {traceback.format_exc()}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def set_leverage(self, symbol: str, leverage: int = 10) -> bool:
|
async def set_leverage(self, symbol: str, leverage: int = 10) -> int:
|
||||||
"""
|
"""
|
||||||
设置杠杆倍数
|
设置杠杆倍数
|
||||||
如果设置失败(比如超过交易对支持的最大杠杆),会自动降低杠杆重试
|
如果设置失败(比如超过交易对支持的最大杠杆),会自动降低杠杆重试
|
||||||
|
|
@ -1859,41 +1859,44 @@ class BinanceClient:
|
||||||
leverage: 杠杆倍数(可为 int 或 float,内部会转为 int)
|
leverage: 杠杆倍数(可为 int 或 float,内部会转为 int)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
是否成功
|
成功设置的杠杆倍数,如果失败返回 0
|
||||||
"""
|
"""
|
||||||
leverage = int(leverage) # 币安 API 要求整数;动态杠杆可能传入 float
|
target_leverage = int(leverage) # 币安 API 要求整数
|
||||||
symbol = self._resolve_api_symbol(symbol)
|
symbol = self._resolve_api_symbol(symbol)
|
||||||
if not symbol:
|
if not symbol:
|
||||||
logger.error(f"❌ 设置杠杆请求 symbol 为空")
|
logger.error(f"❌ 设置杠杆请求 symbol 为空")
|
||||||
import traceback
|
return 0
|
||||||
logger.error(f" 调用堆栈:\n{traceback.format_exc()}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
# 定义降级尝试序列(如果目标杠杆失败,依次尝试这些标准倍数)
|
||||||
|
# 必须确保序列中的值小于 target_leverage
|
||||||
|
fallback_levels = [50, 20, 10, 5, 3, 2, 1]
|
||||||
|
|
||||||
|
# 第一次尝试:目标杠杆
|
||||||
try:
|
try:
|
||||||
await self.client.futures_change_leverage(symbol=symbol, leverage=leverage)
|
await self.client.futures_change_leverage(symbol=symbol, leverage=target_leverage)
|
||||||
logger.info(f"设置杠杆成功: {symbol} {leverage}x")
|
logger.info(f"设置杠杆成功: {symbol} {target_leverage}x")
|
||||||
return True
|
return target_leverage
|
||||||
except BinanceAPIException as e:
|
except BinanceAPIException as e:
|
||||||
error_msg = str(e).lower()
|
error_msg = str(e).lower()
|
||||||
# 如果错误信息包含杠杆相关的内容,尝试降低杠杆
|
logger.warning(f"设置杠杆 {target_leverage}x 失败: {e},尝试降低杠杆...")
|
||||||
if 'leverage' in error_msg or 'invalid' in error_msg:
|
|
||||||
# 尝试降低杠杆(每次降低5倍,最低到1倍)
|
# 如果是 leverage 相关错误,尝试降级
|
||||||
for reduced_leverage in range(leverage - 5, 0, -5):
|
if 'leverage' in error_msg or 'invalid' in error_msg or 'max' in error_msg:
|
||||||
if reduced_leverage < 1:
|
for fallback in fallback_levels:
|
||||||
reduced_leverage = 1
|
if fallback >= target_leverage:
|
||||||
try:
|
|
||||||
await self.client.futures_change_leverage(symbol=symbol, leverage=reduced_leverage)
|
|
||||||
logger.warning(
|
|
||||||
f"{symbol} 杠杆 {leverage}x 设置失败,已自动降低为 {reduced_leverage}x "
|
|
||||||
f"(原因: {e})"
|
|
||||||
)
|
|
||||||
return True
|
|
||||||
except BinanceAPIException:
|
|
||||||
if reduced_leverage <= 1:
|
|
||||||
break
|
|
||||||
continue
|
continue
|
||||||
logger.error(f"设置杠杆失败: {symbol} {leverage}x, 错误: {e}")
|
|
||||||
return False
|
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
|
||||||
|
|
||||||
def get_realtime_price(self, symbol: str) -> Optional[float]:
|
def get_realtime_price(self, symbol: str) -> Optional[float]:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -215,7 +215,16 @@ class PositionManager:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# 设置杠杆(确保为 int,避免动态杠杆传入 float 导致 API/range 报错)
|
# 设置杠杆(确保为 int,避免动态杠杆传入 float 导致 API/range 报错)
|
||||||
await self.client.set_leverage(symbol, int(leverage))
|
actual_leverage = await self.client.set_leverage(symbol, int(leverage))
|
||||||
|
|
||||||
|
if actual_leverage <= 0:
|
||||||
|
logger.error(f"{symbol} 无法设置有效杠杆,跳过开仓")
|
||||||
|
return None
|
||||||
|
|
||||||
|
# 使用实际生效的杠杆(可能被降级)
|
||||||
|
if actual_leverage != int(leverage):
|
||||||
|
logger.warning(f"{symbol} 杠杆被调整: {int(leverage)}x -> {actual_leverage}x")
|
||||||
|
leverage = actual_leverage
|
||||||
|
|
||||||
# 计算仓位大小(传入实际使用的杠杆)
|
# 计算仓位大小(传入实际使用的杠杆)
|
||||||
# ⚠️ 优化:先估算止损价格,用于固定风险百分比计算
|
# ⚠️ 优化:先估算止损价格,用于固定风险百分比计算
|
||||||
|
|
@ -299,8 +308,11 @@ class PositionManager:
|
||||||
if quantity is not None and adjusted_leverage is not None and adjusted_leverage != leverage:
|
if quantity is not None and adjusted_leverage is not None and adjusted_leverage != leverage:
|
||||||
logger.info(f"{symbol} 风险控制调整杠杆: {leverage}x -> {adjusted_leverage}x (适应宽止损)")
|
logger.info(f"{symbol} 风险控制调整杠杆: {leverage}x -> {adjusted_leverage}x (适应宽止损)")
|
||||||
try:
|
try:
|
||||||
await self.client.set_leverage(symbol, int(adjusted_leverage))
|
new_lev = await self.client.set_leverage(symbol, int(adjusted_leverage))
|
||||||
leverage = adjusted_leverage
|
if new_lev > 0:
|
||||||
|
leverage = new_lev
|
||||||
|
else:
|
||||||
|
logger.warning(f"{symbol} 调整杠杆失败,保持 {leverage}x")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"{symbol} 调整杠杆失败: {e},将使用原杠杆 {leverage}x 继续")
|
logger.error(f"{symbol} 调整杠杆失败: {e},将使用原杠杆 {leverage}x 继续")
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user