From c0ae7ab8ab70312f965a2b9a324bfaf7c1280c06 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sat, 14 Mar 2026 17:43:13 +0800 Subject: [PATCH] update --- backend/app/config.py | 1 + backend/app/crypto_agent/crypto_agent.py | 23 +++++++++++++------ .../crypto_agent/trading_decision_maker.py | 18 +++++++++++---- backend/app/models/paper_trading.py | 4 ++-- backend/app/services/real_trading_service.py | 10 ++++---- 5 files changed, 37 insertions(+), 19 deletions(-) diff --git a/backend/app/config.py b/backend/app/config.py index 4dca54f..1cbd10a 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -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 # 实盘最大同时持仓数 diff --git a/backend/app/crypto_agent/crypto_agent.py b/backend/app/crypto_agent/crypto_agent.py index 56066d1..93b2220 100644 --- a/backend/app/crypto_agent/crypto_agent.py +++ b/backend/app/crypto_agent/crypto_agent.py @@ -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: diff --git a/backend/app/crypto_agent/trading_decision_maker.py b/backend/app/crypto_agent/trading_decision_maker.py index 4bd4f1b..950876a 100644 --- a/backend/app/crypto_agent/trading_decision_maker.py +++ b/backend/app/crypto_agent/trading_decision_maker.py @@ -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 是保证金金额,需要乘以杠杆得到持仓价值 diff --git a/backend/app/models/paper_trading.py b/backend/app/models/paper_trading.py index c10872d..3e3c012 100644 --- a/backend/app/models/paper_trading.py +++ b/backend/app/models/paper_trading.py @@ -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, diff --git a/backend/app/services/real_trading_service.py b/backend/app/services/real_trading_service.py index da5ca06..3e11d3f 100644 --- a/backend/app/services/real_trading_service.py +++ b/backend/app/services/real_trading_service.py @@ -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: