This commit is contained in:
aaron 2026-03-24 21:02:31 +08:00
parent 40045b39f7
commit 7817632847
2 changed files with 29 additions and 3 deletions

View File

@ -2,6 +2,7 @@
加密货币交易智能体 - 主控制器LLM 驱动版 加密货币交易智能体 - 主控制器LLM 驱动版
""" """
import asyncio import asyncio
import math
from typing import Dict, Any, List, Optional from typing import Dict, Any, List, Optional
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pandas as pd import pandas as pd
@ -2073,6 +2074,18 @@ class CryptoAgent:
# 根据当前价格计算数量 # 根据当前价格计算数量
size = max_position_usd / current_price size = max_position_usd / current_price
# 按 Hyperliquid 要求的精度截断szDecimals
# ETH=3位, BTC=5位 等,必须截断而非四舍五入,避免超出允许仓位
sz_decimals = self.hyperliquid.get_sz_decimals(decision.get('symbol', '').replace('USDT', ''))
factor = 10 ** sz_decimals
size = math.floor(size * factor) / factor # 截断,不四舍五入
# 最小下单量检查
min_size = 1 / factor
if size < min_size:
logger.warning(f"⚠️ 计算仓位 {size} 低于最小下单量 {min_size},取消开仓")
return 0
logger.info(f"💰 仓位计算:") logger.info(f"💰 仓位计算:")
logger.info(f" 账户价值: ${current_balance:.2f}") logger.info(f" 账户价值: ${current_balance:.2f}")
logger.info(f" 可用余额: ${available_balance:.2f}") logger.info(f" 可用余额: ${available_balance:.2f}")
@ -2080,10 +2093,9 @@ class CryptoAgent:
logger.info(f" 当前总杠杆: {current_total_leverage:.2f}x") logger.info(f" 当前总杠杆: {current_total_leverage:.2f}x")
logger.info(f" 计划杠杆: {leverage}x") logger.info(f" 计划杠杆: {leverage}x")
logger.info(f" 最大可开仓金额: ${max_position_usd:.2f} (限制: min(配置${max_by_config:.0f}, 可用${max_by_available:.0f}, 杠杆${max_by_total_leverage:.0f}))") logger.info(f" 最大可开仓金额: ${max_position_usd:.2f} (限制: min(配置${max_by_config:.0f}, 可用${max_by_available:.0f}, 杠杆${max_by_total_leverage:.0f}))")
logger.info(f" 计算数量: {size:.6f} @ ${current_price:.2f}") logger.info(f" 计算数量: {size} (精度: {sz_decimals}位) @ ${current_price:.2f}")
# 四舍五入到合理精度 return size
return round(size, 6)
except Exception as e: except Exception as e:
logger.error(f"计算仓位大小失败: {e}") logger.error(f"计算仓位大小失败: {e}")

View File

@ -537,6 +537,20 @@ class HyperliquidTradingService:
return pos return pos
return None return None
def get_sz_decimals(self, symbol: str) -> int:
"""
获取交易对的数量精度szDecimals
Hyperliquid 要求订单数量必须符合各币种精度否则报 'Order has invalid size'
例如 ETH=3最小 0.001BTC=5最小 0.00001
"""
try:
asset = self.info.name_to_asset(symbol)
return self.info.asset_to_sz_decimals.get(asset, 3)
except Exception:
logger.warning(f"获取 {symbol} szDecimals 失败,使用默认值 3")
return 3
# 单例 # 单例
_hyperliquid_service_instance = None _hyperliquid_service_instance = None