From 104cb63802aedb7e8a30c78a1e5bdb821896bfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Wed, 25 Feb 2026 11:02:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(recommendations):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=90=88=E7=BA=A6=E6=8E=A8=E8=8D=90=E6=8F=90=E7=A4=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E4=BB=A5=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7=E6=8E=92?= =?UTF-8?q?=E6=9F=A5=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在后端API中新增合约推荐为空时的提示信息,指导用户检查推荐服务和策略运行状态。前端组件更新以显示该提示,提升用户体验并帮助用户更有效地进行问题排查。此改动增强了系统的可用性与用户友好性。 --- backend/api/routes/recommendations.py | 11 ++++++++++- frontend/src/components/Recommendations.jsx | 10 +++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/api/routes/recommendations.py b/backend/api/routes/recommendations.py index 16aadc9..f89afa5 100644 --- a/backend/api/routes/recommendations.py +++ b/backend/api/routes/recommendations.py @@ -366,7 +366,15 @@ async def get_recommendations( # 限制返回数量 recommendations = recommendations[:limit] - + # 合约推荐为空时给出排查提示(与现货独立:现货来自定时扫描,合约来自策略/推荐服务) + hint = None + if len(recommendations) == 0: + hint = ( + "合约推荐来自策略扫描:需信号强度≥5且方向明确才会写入。" + "若长期为空,请检查:1) 推荐服务(recommendations_main)或主策略(main)是否在运行;" + "2) 扫描日志中是否有「信号:N」≥5 的标的;3) 是否有推荐被时间/价格偏离过滤掉(见 meta.dropped)。" + ) + return { "success": True, "count": len(recommendations), @@ -384,6 +392,7 @@ async def get_recommendations( "price_drift": dropped_drift, "invalid": dropped_invalid, }, + "hint": hint, }, "data": recommendations } diff --git a/frontend/src/components/Recommendations.jsx b/frontend/src/components/Recommendations.jsx index e6b1420..71b65b8 100644 --- a/frontend/src/components/Recommendations.jsx +++ b/frontend/src/components/Recommendations.jsx @@ -22,7 +22,8 @@ function Recommendations() { const [bookmarking, setBookmarking] = useState({}) // 记录正在标记的推荐ID const [ordering, setOrdering] = useState({}) // 记录正在下单的推荐ID const [marketType, setMarketType] = useState('futures') // 'futures' | 'spot' - + const [recommendationMeta, setRecommendationMeta] = useState(null) // 合约实时推荐的 meta(含 hint/dropped) + // 获取默认下单保证金(按账号存储,单位:USDT);现货时表示下单金额(USDT) const getDefaultOrderSize = () => { try { @@ -108,6 +109,7 @@ function Recommendations() { const result = await api.getSpotRecommendations({ limit: 50 }) const data = result.data || [] setRecommendations(data) + setRecommendationMeta(null) } else { const params = { type: typeFilter } if (typeFilter === 'bookmarked') { @@ -122,6 +124,7 @@ function Recommendations() { const result = await api.getRecommendations(params) const data = result.data || [] setRecommendations(data) + setRecommendationMeta(result.meta || null) } } catch (err) { setError(err.message) @@ -541,6 +544,11 @@ function Recommendations() { ) : recommendations.length === 0 ? (

暂无推荐记录

+ {marketType === 'futures' && typeFilter === 'realtime' && recommendationMeta?.hint && ( +

+ {recommendationMeta.hint} +

+ )}