"use client"; import { useEffect, useState, useCallback } from "react"; import { authFetch } from "@/lib/auth"; import { useAuth } from "@/lib/auth"; import Link from "next/link"; import { ComposedChart, Area, Line, XAxis, YAxis, Tooltip, ResponsiveContainer, ReferenceLine, CartesianGrid, Legend } from "recharts"; type Symbol = "BTC" | "ETH" | "XRP" | "SOL"; interface IndicatorRow { ts: number; cvd_fast: number; cvd_mid: number; cvd_day: number; atr_5m: number; vwap_30m: number; price: number; score: number; signal: string | null; } interface LatestIndicator { ts: number; cvd_fast: number; cvd_mid: number; cvd_day: number; cvd_fast_slope: number; atr_5m: number; atr_percentile: number; vwap_30m: number; price: number; p95_qty: number; p99_qty: number; score: number; display_score?: number; // v53_btc: alt_score_ref(参考分) gate_passed?: boolean; // v53_btc顶层字段 signal: string | null; tier?: "light" | "standard" | "heavy" | null; factors?: { track?: string; direction?: { score?: number; max?: number; cvd_resonance?: number; p99_flow?: number; accel_bonus?: number; accel_independent_score?: number }; crowding?: { score?: number; max?: number; lsr_contrarian?: number; top_trader_position?: number }; environment?: { score?: number; max?: number; obi_bonus?: number; oi_base?: number }; auxiliary?: { score?: number; max?: number; coinbase_premium?: number }; // BTC gate fields gate_passed?: boolean; block_reason?: string; // BTC用 gate_block?: string; // ALT用 obi_raw?: number; spot_perp_div?: number; whale_cvd_ratio?: number; atr_pct_price?: number; alt_score_ref?: number; } | null; } const WINDOWS = [ { label: "1h", value: 60 }, { label: "4h", value: 240 }, { label: "12h", value: 720 }, { label: "24h", value: 1440 }, ]; function bjtStr(ms: number) { const d = new Date(ms + 8 * 3600 * 1000); return `${String(d.getUTCHours()).padStart(2, "0")}:${String(d.getUTCMinutes()).padStart(2, "0")}`; } function bjtFull(ms: number) { const d = new Date(ms + 8 * 3600 * 1000); return `${String(d.getUTCMonth() + 1).padStart(2, "0")}-${String(d.getUTCDate()).padStart(2, "0")} ${String(d.getUTCHours()).padStart(2, "0")}:${String(d.getUTCMinutes()).padStart(2, "0")}:${String(d.getUTCSeconds()).padStart(2, "0")}`; } function fmt(v: number, decimals = 1): string { if (Math.abs(v) >= 1000000) return `${(v / 1000000).toFixed(1)}M`; if (Math.abs(v) >= 1000) return `${(v / 1000).toFixed(1)}K`; return v.toFixed(decimals); } function LayerScore({ label, score, max, colorClass }: { label: string; score: number; max: number; colorClass: string }) { const ratio = Math.max(0, Math.min((score / max) * 100, 100)); return (
🔒 {symbol} Gate-Control
{passed ? "✅ Gate通过" : "❌ 否决"}波动率
{((factors.atr_pct_price ?? 0) * 100).toFixed(3)}%
需 ≥{thresholds.vol}
OBI
= 0 ? "text-emerald-600" : "text-red-500"}`}> {((factors.obi_raw ?? 0) * 100).toFixed(2)}%
否决±{thresholds.obi}
期现背离
= 0 ? "text-emerald-600" : "text-red-500"}`}> {((factors.spot_perp_div ?? 0) * 10000).toFixed(2)}bps
否决±{thresholds.spd}
鲸鱼阈值
{thresholds.whale}
大单门槛
否决原因: {blockReason}
)}⚡ BTC Gate-Control
{factors.gate_passed ? "✅ Gate通过" : "❌ 否决"}波动率
{((factors.atr_pct_price ?? 0) * 100).toFixed(3)}%
需 ≥0.2%
OBI
= 0 ? "text-emerald-600" : "text-red-500"}`}> {((factors.obi_raw ?? 0) * 100).toFixed(2)}%
盘口失衡
期现背离
= 0 ? "text-emerald-600" : "text-red-500"}`}> {((factors.spot_perp_div ?? 0) * 10000).toFixed(2)}bps
spot-perp
巨鲸CVD
= 0 ? "text-emerald-600" : "text-red-500"}`}> {((factors.whale_cvd_ratio ?? 0) * 100).toFixed(2)}%
>$100k
否决原因: {factors.block_reason}
)}CVD_fast (30m)
= 0 ? "text-emerald-600" : "text-red-500"}`}> {fmt(data.cvd_fast)}
斜率: = 0 ? "text-emerald-600" : "text-red-500"}> {data.cvd_fast_slope >= 0 ? "↑" : "↓"}{fmt(Math.abs(data.cvd_fast_slope))}
CVD_mid (4h)
= 0 ? "text-emerald-600" : "text-red-500"}`}> {fmt(data.cvd_mid)}
{data.cvd_mid > 0 ? "多" : "空"}头占优
CVD共振
= 0 && data.cvd_mid >= 0 ? "text-emerald-600" : data.cvd_fast < 0 && data.cvd_mid < 0 ? "text-red-500" : "text-slate-400"}`}> {data.cvd_fast >= 0 && data.cvd_mid >= 0 ? "✅ 多头共振" : data.cvd_fast < 0 && data.cvd_mid < 0 ? "✅ 空头共振" : "⚠️ 分歧"}
V5.3核心信号
ATR
${fmt(data.atr_5m, 2)}
60 ? "text-amber-600 font-semibold" : "text-slate-400"}> {data.atr_percentile.toFixed(0)}%{data.atr_percentile > 60 ? "🔥" : ""}
VWAP
${data.vwap_30m.toLocaleString("en-US", { maximumFractionDigits: 1 })}
价格在 data.vwap_30m ? "text-emerald-600" : "text-red-500"}>{priceVsVwap}
P95
{data.p95_qty.toFixed(4)}
大单阈值
P99
{data.p99_qty.toFixed(4)}
超大单
{isBTC ? "BTC Gate-Control" : "ALT 四层评分"} {" · "}{"v53"}
{data.signal === "LONG" ? "🟢 做多" : data.signal === "SHORT" ? "🔴 做空" : "⚪ 无信号"}
{data.display_score ?? data.factors?.alt_score_ref ?? data.score}/100 参考分
{(data.gate_passed ?? data.factors?.gate_passed) ? (data.tier === "standard" ? "标准" : "不开仓") : "Gate否决"}
> ) : ( <>{data.score}/100
{data.tier === "heavy" ? "加仓" : data.tier === "standard" ? "标准" : "不开仓"}
> )}⚡ accel独立触发 +{data.factors.direction.accel_independent_score}
)}📊 OBI正向 +{data.factors?.environment?.obi_bonus}
)}请先登录查看信号数据
CVD 5m/30m · OBI正向加分 · accel独立触发 · 实验变体 · {symbol === "BTC" ? " 🔵 BTC轨(gate-control)" : " 🟣 ALT轨(ETH/XRP/SOL)"}
蓝=fast(30m) · 紫=mid(4h) · 橙=价格
1️⃣ 方向层(55分) — CVD共振30分(fast+mid同向)+ P99大单对齐20分 + 加速奖励5分。删除独立确认层,解决CVD双重计分问题。
2️⃣ 拥挤层(25分) — LSR反向拥挤15分(散户过度拥挤=信号)+ 大户持仓方向10分。
3️⃣ 环境层(15分) — OI变化率,新资金进场vs撤离,判断趋势持续性。
4️⃣ 辅助层(5分) — Coinbase Premium,美系机构动向。
波动率门控:ATR/Price ≥ 0.2%,低波动行情拒绝开仓
OBI否决:订单簿失衡超阈值且与信号方向冲突时否决(实时100ms)
期现背离否决:spot与perp价差超阈值时否决(实时1s)
巨鲸CVD:>$100k成交额净CVD,15分钟滚动窗口实时计算