This commit is contained in:
aaron 2026-03-14 17:43:13 +08:00
parent 9944d9ea86
commit c0ae7ab8ab
5 changed files with 37 additions and 19 deletions

View File

@ -167,6 +167,7 @@ class Settings(BaseSettings):
real_trading_max_single_position: float = 1000 # 单笔最大持仓金额 (USDT)
real_trading_max_total_ratio: float = 0.5 # 最大总仓位比例账户的50%
real_trading_default_leverage: int = 10 # 实盘默认杠杆(低于模拟)
real_trading_max_total_leverage: float = 10 # 实盘总杠杆上限(持仓+挂单,倍数)
real_trading_risk_per_trade: float = 0.02 # 每笔交易风险比例2%
real_trading_max_orders: int = 5 # 实盘最大同时持仓数

View File

@ -47,13 +47,19 @@ class CryptoAgent:
# 新架构:市场信号分析器 + 交易决策器
self.market_analyzer = MarketSignalAnalyzer()
self.decision_maker = TradingDecisionMaker()
self.decision_maker = None # 延迟初始化,需要 paper_trading 的杠杆配置
self.signal_db = get_signal_db_service() # 信号数据库服务
# 模拟交易服务(始终启用)
self.paper_trading = get_paper_trading_service()
# 初始化决策器(需要杠杆配置)
self.decision_maker = TradingDecisionMaker(
leverage=self.paper_trading.leverage,
max_total_leverage=self.paper_trading.max_total_leverage
)
# 状态管理
self.last_signals: Dict[str, Dict[str, Any]] = {}
self.signal_cooldown: Dict[str, datetime] = {}
@ -709,10 +715,12 @@ class CryptoAgent:
logger.info(f" 动作: {decision.get('action', 'N/A')}")
logger.info(f" 仓位: {decision.get('position_size', 'N/A')}")
# quantity 是保证金,显示持仓价值 = 保证金 × 20
# quantity 是保证金,显示持仓价值 = 保证金 × 杠杆
quantity = decision.get('quantity', 0)
if isinstance(quantity, (int, float)) and quantity > 0:
logger.info(f" 持仓价值: ${quantity * 20:,.2f} (保证金 ${quantity:.2f})")
leverage = self.paper_trading.leverage # 使用实际的杠杆配置
position_value = quantity * leverage
logger.info(f" 持仓价值: ${position_value:,.2f} (保证金 ${quantity:.2f})")
else:
logger.info(f" 数量: ${decision.get('quantity', 'N/A')}")
@ -1109,7 +1117,7 @@ class CryptoAgent:
# 添加价格信息(如果有)
quantity = decision.get('quantity', 0)
if isinstance(quantity, (int, float)) and quantity > 0:
leverage = 20 # 固定20倍杠杆
leverage = self.paper_trading.leverage # 使用实际的杠杆配置
position_value = quantity * leverage
content_parts.append(f"💰 **持仓价值**: ${position_value:,.2f} (保证金 ${quantity:.2f})")
@ -1235,7 +1243,7 @@ class CryptoAgent:
# 构建卡片内容
# quantity 是保证金金额,需要显示持仓价值 = 保证金 × 杠杆
margin = quantity if quantity != 'N/A' else 0
leverage = 20 # 模拟交易固定 20x 杠杆
leverage = self.paper_trading.leverage # 使用实际的杠杆配置(而非硬编码 20
position_value = margin * leverage if isinstance(margin, (int, float)) else 'N/A'
position_value_display = f"${position_value:,.2f}" if isinstance(position_value, (int, float)) else "N/A"
@ -1340,8 +1348,9 @@ class CryptoAgent:
# 记录订单
order = result.get('order')
if order:
# quantity 是保证金金额,持仓价值 = 保证金 × 20
position_value = quantity * 20
# quantity 是保证金金额,持仓价值 = 保证金 × 杠杆
leverage = self.paper_trading.leverage # 使用实际的杠杆配置
position_value = quantity * leverage
logger.info(f" ✅ 已创建订单: {order.order_id} | 仓位: {position_size} | 持仓价值: ${position_value:.2f}")
logger.info(f" 订单状态: {order.status.value} | 入场价: ${order.entry_price:,.2f}")
else:

View File

@ -471,8 +471,16 @@ class TradingDecisionMaker:
记住你是仓位管理者不是信号执行器你的首要任务是管理好现有仓位
"""
def __init__(self):
pass
def __init__(self, leverage: int = 20, max_total_leverage: float = 10):
"""
初始化交易决策器
Args:
leverage: 单笔订单杠杆倍数
max_total_leverage: 总杠杆上限持仓+挂单倍数
"""
self.leverage = leverage
self.max_total_leverage = max_total_leverage
async def make_decision(self,
market_signal: Dict[str, Any],
@ -553,8 +561,8 @@ class TradingDecisionMaker:
total_position_value = float(account.get('total_position_value', 0))
used_margin = float(account.get('used_margin', 0))
# 当前杠杆(全仓模式
max_leverage = 20
# 当前杠杆(使用配置的杠杆值
max_leverage = self.leverage
max_position_value = balance * max_leverage # 最大仓位金额
current_leverage = (total_position_value / balance) if balance > 0 else 0
available_position_value = max(0, max_position_value - total_position_value) # 剩余可用仓位金额
@ -1055,7 +1063,7 @@ class TradingDecisionMaker:
if decision.get('decision') in ['OPEN', 'ADD']:
balance = float(account.get('current_balance', 0))
total_position_value = float(account.get('total_position_value', 0))
max_leverage = 20
max_leverage = self.leverage # 使用配置的杠杆值
max_position_value = balance * max_leverage
# quantity 是保证金金额,需要乘以杠杆得到持仓价值

View File

@ -117,8 +117,8 @@ class PaperOrder(Base):
'filled_price': self.filled_price,
'exit_price': self.exit_price,
'quantity': self.quantity, # 持仓价值
'margin': getattr(self, 'margin', self.quantity / 20), # 保证金
'leverage': getattr(self, 'leverage', 20), # 杠杆倍数
'margin': getattr(self, 'margin', self.quantity / 20), # 保证金回退值20倍杠杆
'leverage': getattr(self, 'leverage', 20), # 杠杆倍数回退值20倍
'signal_grade': self.signal_grade.value if self.signal_grade else None,
'signal_type': self.signal_type,
'confidence': self.confidence,

View File

@ -28,6 +28,7 @@ class RealTradingService:
self.max_single_position = self.settings.real_trading_max_single_position
self.max_total_ratio = self.settings.real_trading_max_total_ratio
self.default_leverage = self.settings.real_trading_default_leverage
self.max_total_leverage = self.settings.real_trading_max_total_leverage # 总杠杆上限
self.risk_per_trade = self.settings.real_trading_risk_per_trade
self.max_orders = self.settings.real_trading_max_orders
@ -330,10 +331,9 @@ class RealTradingService:
}
# === 使用 LLM 建议的仓位大小计算仓位 ===
# 全仓模式:总杠杆不超过 20 倍
# 检查当前杠杆,确保加仓后不超过 20 倍
# 检查当前杠杆,确保加仓后不超过配置的总杠杆上限
current_leverage = (total_position_value / balance) if balance > 0 else 0
max_total_leverage = 20 # 全仓模式最大 20 倍
max_total_leverage = self.max_total_leverage # 使用配置的总杠杆上限
available_leverage = max_total_leverage - current_leverage
if available_leverage <= 0:
@ -351,7 +351,7 @@ class RealTradingService:
position_value = margin * self.default_leverage
logger.info(f"使用 LLM 决策保证金: ${margin:.2f}, 持仓价值: ${position_value:.2f}")
# 验证:加仓后的总杠杆不超过 20 倍
# 验证:加仓后的总杠杆不超过配置的上限
new_total_value = total_position_value + position_value
new_leverage = new_total_value / balance if balance > 0 else 0
if new_leverage > max_total_leverage:
@ -385,7 +385,7 @@ class RealTradingService:
'message': '无法开仓:仓位计算失败或已达杠杆限制'
}
# 再次验证:加仓后的总杠杆不超过 20 倍
# 再次验证:加仓后的总杠杆不超过配置的上限
new_total_value = total_position_value + position_value
new_leverage = new_total_value / balance if balance > 0 else 0
if new_leverage > max_total_leverage: