From 340d8eb3a13903fa98a4be3b2829b95bb18d274d Mon Sep 17 00:00:00 2001 From: root Date: Sat, 28 Feb 2026 05:33:40 +0000 Subject: [PATCH] feat: V5.1 frontend - 5-layer scoring display + market indicators panel --- backend/__pycache__/main.cpython-310.pyc | Bin 3914 -> 0 bytes backend/main.py | 24 ++++- frontend/app/signals/page.tsx | 123 +++++++++++++++++++++-- 3 files changed, 133 insertions(+), 14 deletions(-) delete mode 100644 backend/__pycache__/main.cpython-310.pyc diff --git a/backend/__pycache__/main.cpython-310.pyc b/backend/__pycache__/main.cpython-310.pyc deleted file mode 100644 index dc1700c275afd56eca66173432c4a7bc7848319b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3914 zcmdT{UvC@75#QZA-W`vmNYS(<*^VPLX=|pn7&mU+q^e_$q{5DkPA_avQk zf0(^hZ4o5kQ~~TfI6z(-6_6hF1^NZrhkk~AEl`xtDT*R>oX+f#loSVPi}s~=*tyxc z*}dJ_`Tce;DV1CT*TJmO8PqxoNyYFh&E}&nv7zdg+^pHO|2VY zu9*Xy8CsFmv?9A{5A06U@hQ)7>oINS{rraOo7`TbqvAZq9`elscX?rrHH&_Juf&V{ zl$ZF}2V{pf$F!vkmI@!&ma?`~!E%Dvw56ggC&6-xPiV_HHx@~KvJYb?b*Ai_UMlDA z-d3esOG|fe+;91986iJmD{Zv%@{<%OLVq9wqlf>2+#zVkMBm zTl1%H#A`w9PeXUmJ|_bi`ij0(H&n?B!{pv_A_8zohtj@uK*L{!sBJE7COW96e zYcy89b}+LN#9rL;XIe?54UJ!2RQ9!{`L`CYFDd)R(k)avg$DRGpodVdw{U7lF9RyS zhmzJnyiYlmWRLEXJ+=>vwaXwJ#)4wWCd|-Er6;%2Y<{3e?Ybdy&`eodvK1%yR6a

(NJKgGl-bOcjPkyEMQ+v5(n%dc`}XMqBt%uoc~oxqly4emh!8Limc+ z_JkLu2TU1jzEs6)w-@FX=5H+DguDhLn|WE$6#ZIZ;Kwpc0$fMs&W1rMAyeB|&f;ir zXfKk^bI{GQUeB4?Fll*VdIglBXaA4j)&CnzsZ+g{CHu55L?Wgk&8Fdlg)AqRTM74- z#eL}op)z&;6P1rVv3XYnEnm3-P9)RIA;9|PR?LHV?M=ueRgV4pL&Fjx*u+@YEinaO z7vDv30mTf81`41)QZJ|+qVc{e%%$6LYhKS-*^BSIaqZ6Qi^}%U8YIeE^W?fOl+g*= z;ygA-&?$2xO=4vWza4ro!rW?@c(QH-H+bnLpiKB_JBd?2RTijQp;QJegEG;sOkf*N z8Jqrg7UFMUw>r-GQ9yC@>9;_z2d7w-R_Xbtrdg#fXbvq>#$3={YQbIn%yh&YxOR#e zS-=7$V*41xFpowM`zursVv-_L>>0oovgot&d!j1s*IwHdgB0LM9A?`x&;%6u{fKBl#>Us;S0CTR2B*HN1y-if%-2oHR@K9zT z{V0nVuBJws4%>C8rGv0p))SZ3sQJ0|MZK(y0O$|97UL-Jg90HWE~5AzidRrvLh*eR zIQK(-5I@A~We`9_uc7`U6tgIPjN%H4t0?r4UPnzcK;g)ey$n`O{Om!EoujAN7-c!@ zA65JO-%U5;f+8}2r5WJo;62!4kynpzu_bsp!v7zDlK*e;zwqDTAGT;KeZb55uIw5^ zK9J?E1zUCny-Kz95OlN5bgXQFbE=T5lT7< zLNkcdgS{x@iyb=P2&&Ovry20k|EoZa+nzq3OcH^oDLABCk?+NqxpKWY-txkr<8zg3 zC0nuV!)`!=2>kjSv_4|IkB1v&z)4*ELThjo7jJ`BXZn#@p*@_c>L-Mb)Bl7j;E1pl zDI@e_l@l;JE}p}$mJSI-<#c4fL?PgfM`~r_G_%p!E3&l=vsE_yiD<<^3p&7t0w(SH zCF;?K5B&jL_Vg-2^{4jx24uh}&q(HgC=3U!~FIkAZ|s49CEPHpfb zBQUnv32I_snu$h#V(=>@QemQt=2;z8O}ogm%JAB4HRf@?eAq;sL+@8mV6gOmhCT}k zq(lArBT1qstZCMnjS{{U`d2VTQamMAND)p}6(}w<8H35;Z9Oq +

+ {label} + {score}/{max} +
+
+
+
+
+ ); +} + +function MarketIndicatorsCards({ symbol }: { symbol: Symbol }) { + const [data, setData] = useState(null); + + useEffect(() => { + const fetch = async () => { + try { + const res = await authFetch("/api/signals/market-indicators"); + if (!res.ok) return; + const json = await res.json(); + setData(json[symbol] || null); + } catch {} + }; + fetch(); + const iv = setInterval(fetch, 5000); + return () => clearInterval(iv); + }, [symbol]); + + if (!data) return
等待市场指标数据...
; + + const ls = Number(data.long_short_ratio?.value ?? 1); + const top = Number(data.top_trader_position?.value ?? 0.5); + const oi = Number(data.open_interest_hist?.value ?? 0); + const premium = Number(data.coinbase_premium?.value ?? 0); + + return ( +
+
+

多空比 (L/S)

+

Long: {(ls / (1 + ls) * 100).toFixed(1)}%

+

Short: {(100 - (ls / (1 + ls) * 100)).toFixed(1)}%

+
+
+

大户持仓

+

大户做多: {(top * 100).toFixed(1)}%

+

方向: {top >= 0.55 ? "多头占优" : top <= 0.45 ? "空头占优" : "中性"}

+
+
+

OI变化

+

{pct(oi, 2)}

+

活跃度: {oi >= 0.03 ? "高" : oi > 0 ? "中" : "低"}

+
+
+

Coinbase Premium

+

= 0 ? "text-emerald-600" : "text-red-500"}`}>{premium >= 0 ? "+" : ""}{pct(premium, 2)}

+

机构: {premium > 0.0005 ? "偏多" : premium < -0.0005 ? "偏空" : "中性"}

+
+
+ ); +} + // ─── 实时指标卡片 ──────────────────────────────────────────────── function IndicatorCards({ symbol }: { symbol: Symbol }) { @@ -149,8 +238,8 @@ function IndicatorCards({ symbol }: { symbol: Symbol }) { - {/* 信号状态 */} -
-

加分

-

{data.score}/60

+

总分

+

{data.score}/100

+

档位: {data.tier === "heavy" ? "加仓" : data.tier === "standard" ? "标准" : data.tier === "light" ? "轻仓" : "不开仓"}

+
+ + + + + +
{data.signal && ( -
+
{core1} CVD_fast方向 {core2} CVD_mid方向 {core3} VWAP位置 @@ -275,8 +372,8 @@ export default function SignalsPage() { {/* 标题 */}
-

V5 信号引擎

-

CVD三轨 + ATR + VWAP + 大单阈值 → 做多/做空信号

+

V5.1 信号引擎

+

五层100分评分 + 市场拥挤度 + 环境确认

{(["BTC", "ETH"] as Symbol[]).map(s => ( @@ -291,6 +388,12 @@ export default function SignalsPage() { {/* 实时指标卡片 */} + {/* Market Indicators */} +
+

Market Indicators

+ +
+ {/* CVD三轨图 */}
@@ -313,9 +416,9 @@ export default function SignalsPage() {
{/* 说明 */} -
-

信号逻辑:CVD_fast方向 + CVD_mid方向 + VWAP位置 = 核心3条件。加分:ATR扩张(+25) + 无反向大单(+20) + 资金费率(+15)。

-

仓位:0-15分→2%仓 / 20-40分→5%仓 / 45-60分→8%仓。冷却10分钟,时间止损30分钟。

+
+

V5.1评分逻辑:方向层45分 + 拥挤层20分 + 环境层15分 + 确认层15分 + 辅助层5分(方向加速可额外+5)。

+

开仓档位:<60不开仓,60-74轻仓,75-84标准仓位,≥85允许加仓;信号冷却10分钟。

);