update
This commit is contained in:
parent
9944d9ea86
commit
c0ae7ab8ab
@ -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 # 实盘最大同时持仓数
|
||||
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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 是保证金金额,需要乘以杠杆得到持仓价值
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user