This commit is contained in:
aaron 2026-02-24 22:02:37 +08:00
parent 21cca1b504
commit 0555c56d76
2 changed files with 65 additions and 20 deletions

View File

@ -69,6 +69,7 @@ class TradingSignal(Base):
'grade': self.grade, 'grade': self.grade,
'confidence': self.confidence, 'confidence': self.confidence,
'entry_price': self.entry_price, 'entry_price': self.entry_price,
'entry_zone': self.entry_zone,
'stop_loss': self.stop_loss, 'stop_loss': self.stop_loss,
'take_profit': self.take_profit, 'take_profit': self.take_profit,
'current_price': self.current_price, 'current_price': self.current_price,

View File

@ -161,18 +161,6 @@
box-shadow: 0 4px 12px rgba(0, 200, 150, 0.1); 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 { .signal-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -614,10 +602,10 @@
</div> </div>
<!-- 价格信息 --> <!-- 价格信息 -->
<div class="price-section" v-if="signal.entry_price || signal.stop_loss || signal.take_profit"> <div class="price-section" v-if="getEntryPrice(signal) || signal.stop_loss || signal.take_profit">
<div class="price-item" v-if="signal.entry_price"> <div class="price-item" v-if="getEntryPrice(signal)">
<div class="price-label">入场价</div> <div class="price-label">{{ getEntryPriceLabel(signal) }}</div>
<div class="price-value">${{ signal.entry_price?.toFixed(2) }}</div> <div class="price-value">${{ getEntryPrice(signal).toFixed(2) }}</div>
</div> </div>
<div class="price-item" v-if="signal.stop_loss"> <div class="price-item" v-if="signal.stop_loss">
<div class="price-label">止损</div> <div class="price-label">止损</div>
@ -630,7 +618,11 @@
</div> </div>
<!-- 信号详情 --> <!-- 信号详情 -->
<div class="signal-details" v-if="signal.signal_type_detail || signal.entry_type || signal.position_size"> <div class="signal-details" v-if="signal.signal_type_detail || signal.entry_type || signal.position_size || signal.current_price">
<div class="detail-row" v-if="signal.current_price">
<span class="detail-label">当前价:</span>
<span class="detail-value">${{ signal.current_price?.toFixed(2) }}</span>
</div>
<div class="detail-row" v-if="signal.signal_type_detail"> <div class="detail-row" v-if="signal.signal_type_detail">
<span class="detail-label">周期:</span> <span class="detail-label">周期:</span>
<span class="detail-value">{{ getSignalTypeText(signal.signal_type_detail) }}</span> <span class="detail-value">{{ getSignalTypeText(signal.signal_type_detail) }}</span>
@ -643,12 +635,16 @@
<span class="detail-label">仓位:</span> <span class="detail-label">仓位:</span>
<span class="detail-value">{{ getPositionSizeText(signal.position_size) }}</span> <span class="detail-value">{{ getPositionSizeText(signal.position_size) }}</span>
</div> </div>
<div class="detail-row" v-if="signal.news_sentiment">
<span class="detail-label">情绪:</span>
<span class="detail-value">{{ getNewsSentimentText(signal.news_sentiment) }}</span>
</div>
</div> </div>
<!-- 分析理由 --> <!-- 分析理由(合并 reason 和 analysis_summary -->
<div class="signal-reason" v-if="signal.reason"> <div class="signal-reason" v-if="getCombinedReason(signal)">
<div class="reason-label">分析理由</div> <div class="reason-label">分析理由</div>
<div class="reason-text">{{ signal.reason }}</div> <div class="reason-text">{{ getCombinedReason(signal) }}</div>
</div> </div>
<!-- 时间戳 --> <!-- 时间戳 -->
@ -773,6 +769,54 @@
'heavy': '重仓' 'heavy': '重仓'
}; };
return map[size] || size; 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() { mounted() {