diff --git a/backend/app/models/signal.py b/backend/app/models/signal.py index 1c1787f..e2be392 100644 --- a/backend/app/models/signal.py +++ b/backend/app/models/signal.py @@ -69,6 +69,7 @@ class TradingSignal(Base): 'grade': self.grade, 'confidence': self.confidence, 'entry_price': self.entry_price, + 'entry_zone': self.entry_zone, 'stop_loss': self.stop_loss, 'take_profit': self.take_profit, 'current_price': self.current_price, diff --git a/frontend/signals.html b/frontend/signals.html index 61b0e26..75d1532 100644 --- a/frontend/signals.html +++ b/frontend/signals.html @@ -161,18 +161,6 @@ box-shadow: 0 4px 12px rgba(0, 200, 150, 0.1); } - .signal-card.buy { - border-left: 3px solid #00ff41; - } - - .signal-card.sell { - border-left: 3px solid #ff4444; - } - - .signal-card.hold { - border-left: 3px solid var(--text-secondary); - } - .signal-header { display: flex; justify-content: space-between; @@ -614,10 +602,10 @@ -
-
-
入场价
-
${{ signal.entry_price?.toFixed(2) }}
+
+
+
{{ getEntryPriceLabel(signal) }}
+
${{ getEntryPrice(signal).toFixed(2) }}
止损
@@ -630,7 +618,11 @@
-
+
+
+ 当前价: + ${{ signal.current_price?.toFixed(2) }} +
周期: {{ getSignalTypeText(signal.signal_type_detail) }} @@ -643,12 +635,16 @@ 仓位: {{ getPositionSizeText(signal.position_size) }}
+
+ 情绪: + {{ getNewsSentimentText(signal.news_sentiment) }} +
- -
+ +
分析理由
-
{{ signal.reason }}
+
{{ getCombinedReason(signal) }}
@@ -773,6 +769,54 @@ 'heavy': '重仓' }; return map[size] || size; + }, + + // 获取入场价格(限价单显示挂单价格,市价单显示入场价) + getEntryPrice(signal) { + // 如果是限价单且有挂单价格,优先显示挂单价格 + if (signal.entry_type === 'limit' && signal.entry_zone) { + return signal.entry_zone; + } + // 否则显示普通入场价 + return signal.entry_price; + }, + + // 获取入场价格标签 + getEntryPriceLabel(signal) { + if (signal.entry_type === 'limit' && signal.entry_zone) { + return '挂单价'; + } + return '入场价'; + }, + + // 获取新闻情绪文本 + getNewsSentimentText(sentiment) { + const map = { + 'bullish': '看涨', + 'bearish': '看跌', + 'neutral': '中性', + 'positive': '积极', + 'negative': '消极' + }; + return map[sentiment] || sentiment; + }, + + // 格式化价位数据 + formatLevels(levels) { + if (Array.isArray(levels)) { + return levels.map(l => '$' + l.toFixed(2)).join(', '); + } else if (typeof levels === 'number') { + return '$' + levels.toFixed(2); + } else if (typeof levels === 'string') { + return levels; + } + return ''; + }, + + // 合并理由和分析摘要 + getCombinedReason(signal) { + // 优先使用 analysis_summary,如果不存在则使用 reason + return signal.analysis_summary || signal.reason || ''; } }, mounted() {