feat: add ALT gate-control card to signals-v53 and paper-v53 latest signals
This commit is contained in:
parent
1e982c48f9
commit
f87edc0339
@ -104,6 +104,12 @@ function LatestSignals({ strategy }: { strategy: StrategyTab }) {
|
|||||||
</div>
|
</div>
|
||||||
{fc && strategy === "v53_alt" && (
|
{fc && strategy === "v53_alt" && (
|
||||||
<div className="flex gap-1 mt-1 flex-wrap">
|
<div className="flex gap-1 mt-1 flex-wrap">
|
||||||
|
<span className={`text-[9px] px-1 py-0.5 rounded ${(fc.gate_passed ?? true) ? "bg-emerald-100 text-emerald-700" : "bg-red-100 text-red-600"}`}>
|
||||||
|
{(fc.gate_passed ?? true) ? "✅ Gate通过" : "❌ 否决"}
|
||||||
|
</span>
|
||||||
|
{fc.gate_block && (
|
||||||
|
<span className="text-[9px] px-1 py-0.5 rounded bg-orange-50 text-orange-700">{fc.gate_block}</span>
|
||||||
|
)}
|
||||||
<span className="text-[9px] px-1 py-0.5 rounded bg-blue-50 text-blue-700">方向{fc.direction?.score ?? 0}/55</span>
|
<span className="text-[9px] px-1 py-0.5 rounded bg-blue-50 text-blue-700">方向{fc.direction?.score ?? 0}/55</span>
|
||||||
<span className="text-[9px] px-1 py-0.5 rounded bg-violet-50 text-violet-700">拥挤{fc.crowding?.score ?? 0}/25</span>
|
<span className="text-[9px] px-1 py-0.5 rounded bg-violet-50 text-violet-700">拥挤{fc.crowding?.score ?? 0}/25</span>
|
||||||
<span className="text-[9px] px-1 py-0.5 rounded bg-emerald-50 text-emerald-700">环境{fc.environment?.score ?? 0}/15</span>
|
<span className="text-[9px] px-1 py-0.5 rounded bg-emerald-50 text-emerald-700">环境{fc.environment?.score ?? 0}/15</span>
|
||||||
|
|||||||
@ -46,7 +46,8 @@ interface LatestIndicator {
|
|||||||
auxiliary?: { score?: number; max?: number; coinbase_premium?: number };
|
auxiliary?: { score?: number; max?: number; coinbase_premium?: number };
|
||||||
// BTC gate fields
|
// BTC gate fields
|
||||||
gate_passed?: boolean;
|
gate_passed?: boolean;
|
||||||
block_reason?: string;
|
block_reason?: string; // BTC用
|
||||||
|
gate_block?: string; // ALT用
|
||||||
obi_raw?: number;
|
obi_raw?: number;
|
||||||
spot_perp_div?: number;
|
spot_perp_div?: number;
|
||||||
whale_cvd_ratio?: number;
|
whale_cvd_ratio?: number;
|
||||||
@ -91,6 +92,62 @@ function LayerScore({ label, score, max, colorClass }: { label: string; score: n
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ─── ALT Gate 状态卡片 ──────────────────────────────────────────
|
||||||
|
|
||||||
|
const ALT_GATE_THRESHOLDS: Record<string, { vol: string; obi: string; spd: string; whale: string }> = {
|
||||||
|
ETH: { vol: "0.3%", obi: "0.35", spd: "0.5%", whale: "$50k" },
|
||||||
|
XRP: { vol: "0.4%", obi: "0.40", spd: "0.6%", whale: "$30k" },
|
||||||
|
SOL: { vol: "0.6%", obi: "0.45", spd: "0.8%", whale: "$20k" },
|
||||||
|
};
|
||||||
|
|
||||||
|
function ALTGateCard({ symbol, factors }: { symbol: Symbol; factors: LatestIndicator["factors"] }) {
|
||||||
|
if (!factors || symbol === "BTC") return null;
|
||||||
|
const thresholds = ALT_GATE_THRESHOLDS[symbol] ?? ALT_GATE_THRESHOLDS["ETH"];
|
||||||
|
const passed = factors.gate_passed ?? true;
|
||||||
|
const blockReason = factors.gate_block;
|
||||||
|
return (
|
||||||
|
<div className={`rounded-xl border px-3 py-2 mt-2 ${passed ? "border-purple-200 bg-purple-50" : "border-red-200 bg-red-50"}`}>
|
||||||
|
<div className="flex items-center justify-between mb-1.5">
|
||||||
|
<p className="text-[10px] font-semibold text-purple-800">🔒 {symbol} Gate-Control</p>
|
||||||
|
<span className={`text-[10px] font-bold px-2 py-0.5 rounded ${passed ? "bg-emerald-100 text-emerald-700" : "bg-red-100 text-red-600"}`}>
|
||||||
|
{passed ? "✅ Gate通过" : "❌ 否决"}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-4 gap-1.5">
|
||||||
|
<div className="bg-white rounded px-2 py-1">
|
||||||
|
<p className="text-[10px] text-slate-400">波动率</p>
|
||||||
|
<p className="text-xs font-mono text-slate-800">{((factors.atr_pct_price ?? 0) * 100).toFixed(3)}%</p>
|
||||||
|
<p className="text-[9px] text-slate-400">需 ≥{thresholds.vol}</p>
|
||||||
|
</div>
|
||||||
|
<div className="bg-white rounded px-2 py-1">
|
||||||
|
<p className="text-[10px] text-slate-400">OBI</p>
|
||||||
|
<p className={`text-xs font-mono ${(factors.obi_raw ?? 0) >= 0 ? "text-emerald-600" : "text-red-500"}`}>
|
||||||
|
{((factors.obi_raw ?? 0) * 100).toFixed(2)}%
|
||||||
|
</p>
|
||||||
|
<p className="text-[9px] text-slate-400">否决±{thresholds.obi}</p>
|
||||||
|
</div>
|
||||||
|
<div className="bg-white rounded px-2 py-1">
|
||||||
|
<p className="text-[10px] text-slate-400">期现背离</p>
|
||||||
|
<p className={`text-xs font-mono ${(factors.spot_perp_div ?? 0) >= 0 ? "text-emerald-600" : "text-red-500"}`}>
|
||||||
|
{((factors.spot_perp_div ?? 0) * 10000).toFixed(2)}bps
|
||||||
|
</p>
|
||||||
|
<p className="text-[9px] text-slate-400">否决±{thresholds.spd}</p>
|
||||||
|
</div>
|
||||||
|
<div className="bg-white rounded px-2 py-1">
|
||||||
|
<p className="text-[10px] text-slate-400">鲸鱼阈值</p>
|
||||||
|
<p className="text-xs font-mono text-slate-800">{thresholds.whale}</p>
|
||||||
|
<p className="text-[9px] text-slate-400">大单门槛</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{blockReason && (
|
||||||
|
<p className="text-[10px] text-red-600 mt-1.5 bg-red-50 rounded px-2 py-1">
|
||||||
|
否决原因: <span className="font-mono">{blockReason}</span>
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// ─── BTC Gate 状态卡片 ───────────────────────────────────────────
|
// ─── BTC Gate 状态卡片 ───────────────────────────────────────────
|
||||||
|
|
||||||
function BTCGateCard({ factors }: { factors: LatestIndicator["factors"] }) {
|
function BTCGateCard({ factors }: { factors: LatestIndicator["factors"] }) {
|
||||||
@ -266,6 +323,9 @@ function IndicatorCards({ symbol }: { symbol: Symbol }) {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* ALT Gate 卡片 */}
|
||||||
|
{!isBTC && data.factors && <ALTGateCard symbol={symbol} factors={data.factors} />}
|
||||||
|
|
||||||
{/* BTC Gate 卡片 */}
|
{/* BTC Gate 卡片 */}
|
||||||
{isBTC && data.factors && <BTCGateCard factors={data.factors} />}
|
{isBTC && data.factors && <BTCGateCard factors={data.factors} />}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user