update
This commit is contained in:
parent
21cca1b504
commit
0555c56d76
@ -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,
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user