From b2411fe74599b537f4e42f7ae6c760897199cb14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sat, 17 Jan 2026 09:50:11 +0800 Subject: [PATCH] a --- frontend/src/components/StatsDashboard.css | 38 ++++++++++++++++++++++ trading_system/position_manager.py | 24 +++++++++++--- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/StatsDashboard.css b/frontend/src/components/StatsDashboard.css index f7d0c30..40e5025 100644 --- a/frontend/src/components/StatsDashboard.css +++ b/frontend/src/components/StatsDashboard.css @@ -274,9 +274,47 @@ .stop-loss-info, .take-profit-info { font-size: 0.85rem; + display: flex; + flex-direction: column; + gap: 0.25rem; + padding: 0.5rem; + margin-bottom: 0.5rem; + border-radius: 4px; +} + +.stop-loss-info { + background-color: #fff5f5; + border-left: 3px solid #dc3545; +} + +.take-profit-info { + background-color: #f0fff4; + border-left: 3px solid #28a745; +} + +.stop-header, +.take-header { display: flex; align-items: center; gap: 0.5rem; + font-weight: 600; +} + +.stop-details, +.take-details { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + font-size: 0.8rem; + color: #666; +} + +.stop-explanation, +.take-explanation { + font-size: 0.75rem; + color: #888; + font-style: italic; + margin-top: 0.25rem; } .stop-loss-info .negative, diff --git a/trading_system/position_manager.py b/trading_system/position_manager.py index 02808e1..2b8b6d2 100644 --- a/trading_system/position_manager.py +++ b/trading_system/position_manager.py @@ -1466,14 +1466,30 @@ class PositionManager: stop_loss_pct_margin = (stop_loss_amount / margin * 100) if margin > 0 else 0 + # 每5%亏损记录一次诊断日志(帮助排查问题) + if pnl_percent_margin <= -5.0: + should_log = (int(abs(pnl_percent_margin)) % 5 == 0) or (pnl_percent_margin <= -10.0 and pnl_percent_margin > -10.5) + if should_log: + trigger_condition = pnl_percent_margin <= -stop_loss_pct_margin + logger.warning( + f"{symbol} [实时监控] 诊断: 亏损{pnl_percent_margin:.2f}% of margin | " + f"当前价: {current_price_float:.4f} | " + f"入场价: {entry_price:.4f} | " + f"止损价: {stop_loss:.4f} (目标: -{stop_loss_pct_margin:.2f}% of margin) | " + f"方向: {position_info['side']} | " + f"是否触发: {trigger_condition} | " + f"监控状态: {'运行中' if symbol in self._monitor_tasks else '未启动'}" + ) + # 直接比较当前盈亏百分比与止损目标(基于保证金) if pnl_percent_margin <= -stop_loss_pct_margin: should_close = True exit_reason = 'trailing_stop' if position_info.get('trailingStopActivated') else 'stop_loss' logger.warning( - f"{symbol} [实时监控] 触发止损(基于保证金): " + f"{symbol} [实时监控] ⚠⚠⚠ 触发止损(基于保证金): " f"当前盈亏={pnl_percent_margin:.2f}% of margin <= 止损目标=-{stop_loss_pct_margin:.2f}% of margin | " - f"当前价={current_price_float:.4f}, 止损价={stop_loss:.4f}" + f"当前价={current_price_float:.4f}, 止损价={stop_loss:.4f} | " + f"保证金={margin:.4f} USDT, 亏损金额={pnl_amount:.4f} USDT" ) # 检查止盈(基于保证金收益比) @@ -1541,9 +1557,9 @@ class PositionManager: exit_price=current_price_float, exit_reason=exit_reason, pnl=pnl, - pnl_percent=pnl_percent + pnl_percent=pnl_percent_margin # 修复:使用 pnl_percent_margin 而不是 pnl_percent ) - logger.info(f"{symbol} [自动平仓] ✓ 数据库记录已更新 (盈亏: {pnl:.2f} USDT)") + logger.info(f"{symbol} [自动平仓] ✓ 数据库记录已更新 (盈亏: {pnl:.2f} USDT, {pnl_percent_margin:.2f}% of margin)") except Exception as e: logger.error(f"{symbol} [自动平仓] ❌ 更新数据库记录失败: {e}") import traceback