import{r as o,j as e,c as U,R as V}from"./client-DYDkQYN6.js";const L=["Bitget","Binance","OKX"];function f(r){return r==null||r<=0?"-":r>=100?r.toFixed(2):r>=1?r.toFixed(4):r.toFixed(6)}function Y(){const[r,h]=o.useState("--:--:--"),[l,n]=o.useState("● 未连接"),[d,t]=o.useState(!1),[a,p]=o.useState({}),[b,s]=o.useState([]),[g,i]=o.useState(""),[_,m]=o.useState([]),[u,T]=o.useState([]),[ce,W]=o.useState([]),[H,K]=o.useState([]),[X,G]=o.useState([]),[I,D]=o.useState([]),[w,B]=o.useState([]),[q,M]=o.useState([]),[P,A]=o.useState([]),E=o.useRef({});o.useEffect(()=>{const c=()=>h(new Date().toLocaleTimeString("zh-CN",{hour12:!1}));c();const x=setInterval(c,1e3);return()=>clearInterval(x)},[]),o.useEffect(()=>{let c=new EventSource("/events");return c.addEventListener("connected",()=>{n("● 已连接"),t(!0)}),c.onerror=()=>{n("● 已断开 (重连中...)"),t(!1),setTimeout(()=>{c=new EventSource("/events")},3e3)},c.onmessage=x=>{try{const j=JSON.parse(x.data);switch(j.event){case"prices":R(j.data);break;case"spread_3ex":m(j.data||[]);break;case"momentum":T(j.data||[]);break;case"trend":W(j.data||[]);break;case"cumulative":K(j.data||[]);break;case"trend_filter":D(j.data||[]);break;case"trend_signal":B(N=>[j.data,...N].slice(0,100));break;case"surge":M(j.data||[]);break;case"surge_event":A(N=>[j.data,...N].slice(0,200));break;case"status":j.data&&j.data.connections&&p(j.data.connections);break}}catch{}},()=>c.close()},[]);const k=o.useCallback(async()=>{try{const x=await(await fetch("/api/cm-history")).json();G(x.events||[])}catch{}},[]);o.useEffect(()=>{k();const c=setInterval(k,5e3);return()=>clearInterval(c)},[k]);const S=o.useCallback(async()=>{try{const x=await(await fetch("/api/trend-signals")).json();x.signals&&B(x.signals)}catch{}},[]);o.useEffect(()=>{S();const c=setInterval(S,5e3);return()=>clearInterval(c)},[S]);const C=o.useCallback(async()=>{try{const x=await(await fetch("/api/surge-events?limit=100")).json();x.events&&A(x.events)}catch{}},[]);o.useEffect(()=>{C();const c=setInterval(C,1e4);return()=>clearInterval(c)},[C]);function R(c){if(!c||c.length===0)return;s(c),i(new Date().toLocaleTimeString("zh-CN",{hour12:!1}));const x=E.current;for(const j of c)for(const N of L){const F=j.coin+"."+N,O=j[N]||0;x[F]?x[F].last=O:x[F]={last:O}}}function $(){const c=new Set,x=[];if(!b)return x;for(const j of b)c.has(j.coin)||(c.add(j.coin),x.push(j.coin));return x}function v(c,x){var j;return(j=E.current[c+"."+x])==null?void 0:j.last}function J(c,x){return c==null||x==null?"":x>c?"text-green":x`${c}:${x}`).join(" ");return e.jsxs("div",{id:"app",children:[e.jsxs("header",{children:[e.jsx("h1",{children:"⚡ 三所价差异动监控"}),e.jsxs("div",{className:"header-meta",children:[e.jsx("span",{children:r}),e.jsx("span",{className:"sep",children:"|"}),e.jsx("span",{className:d?"status-online":"status-offline",children:l}),z&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"sep",children:"|"}),e.jsx("span",{style:{fontSize:11},children:z})]})]})]}),e.jsxs("div",{className:"grid",children:[e.jsx(ie,{filterData:I}),e.jsx(re,{signals:w}),e.jsx(le,{signals:w}),e.jsx(se,{data:H}),e.jsx(ne,{history:X}),e.jsx(Z,{coins:Q,prices:b,getPrevPrice:v,priceClass:J,pricesAge:g}),e.jsx(y,{data:_}),e.jsx(ee,{snapshots:q,events:P}),e.jsx(te,{momentum:u})]})]})}function Z({coins:r,prices:h,getPrevPrice:l,priceClass:n,pricesAge:d}){return e.jsxs("section",{className:"card",id:"prices-card",children:[e.jsxs("h2",{children:["💰 实时价格 ",e.jsx("span",{className:"text-dim",style:{fontSize:11},children:d})]}),e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{id:"price-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"币种"}),e.jsx("th",{children:"Bitget"}),e.jsx("th",{children:"Binance"}),e.jsx("th",{children:"OKX"}),e.jsx("th",{children:"三所价差"})]})}),e.jsx("tbody",{id:"price-body",children:r.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"5",className:"loading",children:"等待数据..."})}):r.map(t=>{const a=h.find(g=>g.coin===t);if(!a)return e.jsxs("tr",{children:[e.jsx("td",{children:t}),e.jsx("td",{className:"text-dim",children:"-"}),e.jsx("td",{className:"text-dim",children:"-"}),e.jsx("td",{className:"text-dim",children:"-"}),e.jsx("td",{className:"text-dim",children:"-"})]},t);const p=L.map(g=>{const i=a[g],_=l(t,g),m=_?n(_,i||0):"";return e.jsx("td",{className:m,children:f(i)},g)}),b=a.spread_3ex,s=b>.3?"text-green":b>.1?"text-yellow":"text-dim";return e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("strong",{children:t})}),p,e.jsx("td",{className:s,children:b!=null?b.toFixed(4)+"%":"-"})]},t)})})]})})]})}function y({data:r}){function h(l){return l==null?"":l>.3?"text-green":l>.1?"text-yellow":"text-dim"}return e.jsxs("section",{className:"card",id:"spread-card",children:[e.jsx("h2",{children:"📊 三所价差扫描 (BN/OKX/BG)"}),e.jsx("div",{className:"table-wrap",children:e.jsxs("table",{id:"spread-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"币种"}),e.jsx("th",{children:"价差%"}),e.jsx("th",{children:"BN价格"}),e.jsx("th",{children:"OKX价格"}),e.jsx("th",{children:"BG价格"}),e.jsx("th",{children:"最高所"}),e.jsx("th",{children:"最低所"})]})}),e.jsx("tbody",{children:!r||r.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"7",className:"text-dim",children:"等待扫描数据..."})}):r.slice(0,50).map((l,n)=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("strong",{children:l.coin})}),e.jsx("td",{className:"text-right "+h(l.spread_pct),children:e.jsx("strong",{children:l.spread_pct!=null?l.spread_pct.toFixed(4)+"%":"-"})}),e.jsx("td",{className:"text-right",children:l.bn_price?f(l.bn_price):"-"}),e.jsx("td",{className:"text-right",children:l.okx_price?f(l.okx_price):"-"}),e.jsx("td",{className:"text-right",children:l.bg_price?f(l.bg_price):"-"}),e.jsx("td",{children:l.max_ex||"-"}),e.jsx("td",{children:l.min_ex||"-"})]},l.coin||n))})]})})]})}function ee({snapshots:r,events:h}){const[l,n]=o.useState("snapshot");function d(t,a){return t==null||a==null?"":t>=a?"text-green":"text-dim"}return e.jsxs("section",{className:"card card-wide",id:"surge-card",children:[e.jsxs("h2",{children:["🚀 Surge异动检测",e.jsxs("span",{style:{marginLeft:12,fontSize:12,fontWeight:400},children:[e.jsx("button",{className:"tab-btn"+(l==="snapshot"?" active":""),onClick:()=>n("snapshot"),children:"实时基线"}),e.jsxs("button",{className:"tab-btn"+(l==="events"?" active":""),onClick:()=>n("events"),children:["事件记录 (",h.length,")"]})]})]}),l==="snapshot"&&e.jsx("div",{className:"table-wrap",style:{maxHeight:350},children:e.jsxs("table",{id:"surge-snapshot-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"币种"}),e.jsx("th",{children:"当前价差%"}),e.jsx("th",{children:"基线%"}),e.jsx("th",{children:"阈值%"}),e.jsx("th",{children:"窗口样本"})]})}),e.jsx("tbody",{children:r.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"5",className:"text-dim",style:{textAlign:"center",padding:20},children:"收集基线数据中... (需要至少 10 个样本)"})}):r.slice(0,50).map((t,a)=>{const p=t.direction;return e.jsxs("tr",{className:p?"surge-active":"",children:[e.jsx("td",{children:e.jsx("strong",{children:t.coin})}),e.jsxs("td",{className:"text-right "+d(t.spread_pct,t.threshold_pct),style:{fontWeight:700},children:[t.spread_pct!=null?t.spread_pct.toFixed(4)+"%":"-",p?" ⚡":""]}),e.jsx("td",{className:"text-right text-dim",children:t.baseline_pct!=null?t.baseline_pct.toFixed(4)+"%":"-"}),e.jsx("td",{className:"text-right text-dim",children:t.threshold_pct!=null?t.threshold_pct.toFixed(4)+"%":"-"}),e.jsx("td",{className:"text-right text-dim",children:t.window_size||0})]},t.coin||a)})})]})}),l==="events"&&e.jsx("div",{className:"table-wrap",style:{maxHeight:400},children:e.jsxs("table",{id:"surge-events-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"时间"}),e.jsx("th",{children:"币种"}),e.jsx("th",{children:"方向"}),e.jsx("th",{children:"价差%"}),e.jsx("th",{children:"基线%"}),e.jsx("th",{children:"阈值%"}),e.jsx("th",{children:"比率"}),e.jsx("th",{children:"BN价格"}),e.jsx("th",{children:"OKX价格"}),e.jsx("th",{children:"BG价格"}),e.jsx("th",{children:"领先所"})]})}),e.jsx("tbody",{children:h.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"11",className:"text-dim",style:{textAlign:"center",padding:20},children:"暂无Surge事件记录"})}):h.slice(0,100).map((t,a)=>{const p=t.timestamp?new Date(t.timestamp).toLocaleTimeString("zh-CN",{hour12:!1}):"-";return e.jsxs("tr",{className:t.direction==="up"?"surge-up":"surge-down",children:[e.jsx("td",{className:"text-dim",children:p}),e.jsx("td",{children:e.jsx("strong",{children:t.coin})}),e.jsx("td",{className:t.direction==="up"?"text-green":"text-red",style:{fontWeight:600,textAlign:"center"},children:t.direction==="up"?"↑ 涨":"↓ 跌"}),e.jsx("td",{className:"text-right",style:{fontWeight:700},children:t.spread_pct!=null?t.spread_pct.toFixed(4)+"%":"-"}),e.jsx("td",{className:"text-right text-dim",children:t.baseline_pct!=null?t.baseline_pct.toFixed(4)+"%":"-"}),e.jsx("td",{className:"text-right text-dim",children:t.threshold_pct!=null?t.threshold_pct.toFixed(4)+"%":"-"}),e.jsx("td",{className:"text-right",children:t.ratio!=null?t.ratio.toFixed(1)+"x":"-"}),e.jsx("td",{className:"text-right",children:t.bn_price?f(t.bn_price):"-"}),e.jsx("td",{className:"text-right",children:t.okx_price?f(t.okx_price):"-"}),e.jsx("td",{className:"text-right",children:t.bg_price?f(t.bg_price):"-"}),e.jsx("td",{children:t.leading_exchange||"-"})]},t.timestamp+"-"+t.coin+"-"+a)})})]})})]})}function te({momentum:r}){const[h,l]=o.useState("score"),[n,d]=o.useState("desc");function t(i){h===i?d(n==="asc"?"desc":"asc"):(l(i),d("desc"))}function a(i){return h!==i?"":n==="asc"?" ▲":" ▼"}const p=[...r].sort((i,_)=>{let m,u;switch(h){case"coin":m=i.coin,u=_.coin;break;case"bg_1s":m=i.bg_1s||0,u=_.bg_1s||0;break;case"bg_5s":m=i.bg_5s||0,u=_.bg_5s||0;break;case"bg_15s":m=i.bg_15s||0,u=_.bg_15s||0;break;case"bn_1s":m=i.bn_1s||0,u=_.bn_1s||0;break;case"bn_5s":m=i.bn_5s||0,u=_.bn_5s||0;break;case"bn_15s":m=i.bn_15s||0,u=_.bn_15s||0;break;case"okx_1s":m=i.okx_1s||0,u=_.okx_1s||0;break;case"okx_5s":m=i.okx_5s||0,u=_.okx_5s||0;break;case"okx_15s":m=i.okx_15s||0,u=_.okx_15s||0;break;default:m=i.score||0,u=_.score||0}return typeof m=="string"?n==="asc"?m.localeCompare(u):u.localeCompare(m):n==="asc"?m-u:u-m});function b(i){switch(i){case"up":return"↑";case"down":return"↓";case"flat":return"→";case"mixed":return"↕";default:return"-"}}function s(i){switch(i){case"up":return"text-green";case"down":return"text-red";case"mixed":return"text-yellow";default:return""}}function g(i){return i==null||i===0?"":i>0?"text-green":"text-red"}return e.jsxs("section",{className:"card card-wide",id:"momentum-card",children:[e.jsx("h2",{children:"⚡ 动量扫描 (价格变动%)"}),e.jsx("div",{className:"table-wrap",style:{maxHeight:400},children:e.jsxs("table",{id:"momentum-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsxs("th",{onClick:()=>t("coin"),style:{cursor:"pointer"},children:["币种",a("coin")]}),e.jsxs("th",{onClick:()=>t("score"),style:{cursor:"pointer"},children:["分数",a("score")]}),e.jsx("th",{children:"方向"}),e.jsxs("th",{onClick:()=>t("bg_1s"),style:{cursor:"pointer"},children:["BG 1s",a("bg_1s")]}),e.jsxs("th",{onClick:()=>t("bg_5s"),style:{cursor:"pointer"},children:["BG 5s",a("bg_5s")]}),e.jsxs("th",{onClick:()=>t("bg_15s"),style:{cursor:"pointer"},children:["BG 15s",a("bg_15s")]}),e.jsxs("th",{onClick:()=>t("bn_1s"),style:{cursor:"pointer"},children:["BN 1s",a("bn_1s")]}),e.jsxs("th",{onClick:()=>t("bn_5s"),style:{cursor:"pointer"},children:["BN 5s",a("bn_5s")]}),e.jsxs("th",{onClick:()=>t("bn_15s"),style:{cursor:"pointer"},children:["BN 15s",a("bn_15s")]}),e.jsxs("th",{onClick:()=>t("okx_1s"),style:{cursor:"pointer"},children:["OKX 1s",a("okx_1s")]}),e.jsxs("th",{onClick:()=>t("okx_5s"),style:{cursor:"pointer"},children:["OKX 5s",a("okx_5s")]}),e.jsxs("th",{onClick:()=>t("okx_15s"),style:{cursor:"pointer"},children:["OKX 15s",a("okx_15s")]})]})}),e.jsx("tbody",{children:p.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"12",className:"text-dim",style:{textAlign:"center",padding:20},children:"正在收集动量数据... (需要至少 15 秒数据)"})}):p.slice(0,50).map(i=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("strong",{children:i.coin})}),e.jsxs("td",{className:"text-right",style:{fontWeight:700},children:[i.score.toFixed(4),"%"]}),e.jsx("td",{className:s(i.direction),style:{textAlign:"center",fontSize:18},children:b(i.direction)}),e.jsx("td",{className:"text-right "+g(i.bg_1s),children:i.bg_1s!=null?i.bg_1s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.bg_5s),children:i.bg_5s!=null?i.bg_5s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.bg_15s),children:i.bg_15s!=null?i.bg_15s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.bn_1s),children:i.bn_1s!=null?i.bn_1s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.bn_5s),children:i.bn_5s!=null?i.bn_5s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.bn_15s),children:i.bn_15s!=null?i.bn_15s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.okx_1s),children:i.okx_1s!=null?i.okx_1s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.okx_5s),children:i.okx_5s!=null?i.okx_5s.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+g(i.okx_15s),children:i.okx_15s!=null?i.okx_15s.toFixed(3)+"%":"-"})]},i.coin))})]})})]})}function se({data:r}){function h(t){switch(t){case"rising":return"↑ 上涨";case"falling":return"↓ 下跌";default:return"− 中性"}}function l(t){switch(t){case"rising":return"text-green";case"falling":return"text-red";default:return"text-dim"}}function n(t){return t==="up"?"text-green":"text-red"}function d(t){return t==null||t===0?"":t>0?"text-green":"text-red"}return e.jsxs("section",{className:"card card-wide",id:"cm-card",children:[e.jsx("h2",{children:"📊 累积变动 (1min 共识)"}),e.jsx("div",{className:"table-wrap",style:{maxHeight:300},children:e.jsxs("table",{id:"cm-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"币种"}),e.jsx("th",{children:"状态"}),e.jsx("th",{children:"方向"}),e.jsx("th",{children:"分数"}),e.jsx("th",{children:"均值%"}),e.jsx("th",{children:"一致"}),e.jsx("th",{children:"BG 1m"}),e.jsx("th",{children:"BN 1m"}),e.jsx("th",{children:"OKX 1m"}),e.jsx("th",{children:"BG 5m"}),e.jsx("th",{children:"BN 5m"}),e.jsx("th",{children:"OKX 5m"}),e.jsx("th",{colSpan:3,style:{borderLeft:"2px solid var(--border)"},children:"1h 趋势"}),e.jsx("th",{children:"BG 1h"}),e.jsx("th",{children:"BN 1h"}),e.jsx("th",{children:"OKX 1h"})]})}),e.jsx("tbody",{children:!r||r.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"17",className:"text-dim",style:{textAlign:"center",padding:20},children:"等待累积数据... (需要至少 1 分钟数据)"})}):r.slice(0,30).map(t=>e.jsxs("tr",{className:l(t.state),children:[e.jsx("td",{children:e.jsx("strong",{children:t.coin})}),e.jsx("td",{children:h(t.state)}),e.jsx("td",{className:n(t.direction),style:{textAlign:"center",fontSize:16},children:t.direction==="up"?"↑":"↓"}),e.jsx("td",{className:"text-right",style:{fontWeight:700},children:(t.score||0).toFixed(2)}),e.jsxs("td",{className:"text-right",children:[(t.avg_1m||0).toFixed(3),"%"]}),e.jsxs("td",{className:"text-right",children:[t.ex_agree||0,"/",t.ex_total||0]}),e.jsx("td",{className:"text-right "+d(t.bg_1m),children:t.bg_1m!=null?t.bg_1m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.bn_1m),children:t.bn_1m!=null?t.bn_1m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.okx_1m),children:t.okx_1m!=null?t.okx_1m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.bg_5m),children:t.bg_5m!=null?t.bg_5m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.bn_5m),children:t.bn_5m!=null?t.bn_5m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.okx_5m),children:t.okx_5m!=null?t.okx_5m.toFixed(3)+"%":"-"}),e.jsxs("td",{className:"text-right "+n(t.direction),style:{fontWeight:600,borderLeft:"2px solid var(--border)"},children:[(t.avg_1h||0).toFixed(2),"%"]}),e.jsx("td",{className:"text-right "+d(t.bg_1h),children:t.bg_1h!=null?t.bg_1h.toFixed(2)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.bn_1h),children:t.bn_1h!=null?t.bn_1h.toFixed(2)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.okx_1h),children:t.okx_1h!=null?t.okx_1h.toFixed(2)+"%":"-"})]},t.coin))})]})})]})}function ne({history:r}){function h(t){switch(t){case"rising":return"↑ 上涨";case"falling":return"↓ 下跌";default:return"− 中性"}}function l(t){switch(t){case"rising":return"text-green";case"falling":return"text-red";default:return"text-dim"}}function n(t){return t==="up"?"text-green":"text-red"}function d(t){return t==null||t===0?"":t>0?"text-green":"text-red"}return e.jsxs("section",{className:"card card-wide",id:"cm-history-card",children:[e.jsx("h2",{children:"📋 累积变动事件记录"}),e.jsx("div",{className:"table-wrap",style:{maxHeight:400},children:e.jsxs("table",{id:"cm-history-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"时间"}),e.jsx("th",{children:"币种"}),e.jsx("th",{children:"转换"}),e.jsx("th",{children:"方向"}),e.jsx("th",{children:"分数"}),e.jsx("th",{children:"均值%"}),e.jsx("th",{children:"一致"}),e.jsx("th",{children:"BG 1m"}),e.jsx("th",{children:"BN 1m"}),e.jsx("th",{children:"OKX 1m"}),e.jsx("th",{children:"BG 5m"}),e.jsx("th",{children:"BN 5m"}),e.jsx("th",{children:"OKX 5m"})]})}),e.jsx("tbody",{children:r.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"13",className:"text-dim",style:{textAlign:"center",padding:20},children:"暂无累积变动事件记录"})}):r.slice(0,100).map((t,a)=>e.jsxs("tr",{children:[e.jsx("td",{className:"text-dim",children:t.created_at?new Date(t.created_at).toLocaleTimeString("zh-CN",{hour12:!1}):"-"}),e.jsx("td",{children:e.jsx("strong",{children:t.coin})}),e.jsxs("td",{className:l(t.new_state),children:[t.prev_state," → ",h(t.new_state)]}),e.jsx("td",{className:n(t.direction),style:{textAlign:"center",fontSize:16},children:t.direction==="up"?"↑":"↓"}),e.jsx("td",{className:"text-right",children:(t.score||0).toFixed(2)}),e.jsxs("td",{className:"text-right",children:[(t.avg_change||0).toFixed(3),"%"]}),e.jsxs("td",{className:"text-right",children:[t.ex_agree||0,"/",t.ex_total||0]}),e.jsx("td",{className:"text-right "+d(t.bg_1m),children:t.bg_1m!=null?t.bg_1m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.bn_1m),children:t.bn_1m!=null?t.bn_1m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.okx_1m),children:t.okx_1m!=null?t.okx_1m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.bg_5m),children:t.bg_5m!=null?t.bg_5m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.bn_5m),children:t.bn_5m!=null?t.bn_5m.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right "+d(t.okx_5m),children:t.okx_5m!=null?t.okx_5m.toFixed(3)+"%":"-"})]},(t.id||a)+"-cm"))})]})})]})}function ie({filterData:r}){const h=r.filter(s=>s.passes_filter).length,l=r.filter(s=>s.signal_score>=80).length,n=r.filter(s=>s.signal_score>=50&&s.signal_score<80).length,d=r.filter(s=>s.fresh_anomaly).length;let t=`高分${l} 中分${n}`;d>0?(t+=` | ${d}币异动中`,h>0&&(t+=` → ${h}通过!`)):t+=" | 等待异动信号";function a(s){return s==null?"":s>=80?"text-green":s>=50?"text-yellow":"text-dim"}function p(s){return s==null||s<=1.5?"":s>3?"text-red":"text-orange"}function b(s){return s==null||s===0?"":s>0?"text-green":"text-red"}return e.jsxs("section",{className:"card card-wide",id:"trend-filter-card",children:[e.jsxs("h2",{children:["趋势过滤 (",h,"通过 / ",r.length,") ",e.jsx("span",{className:"text-dim",style:{fontSize:12,fontWeight:400},children:t})]}),e.jsx("div",{className:"table-wrap",style:{maxHeight:400},children:e.jsxs("table",{id:"trend-filter-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"币种"}),e.jsx("th",{children:"分数"}),e.jsx("th",{children:"24h范围"}),e.jsx("th",{children:"基线"}),e.jsx("th",{children:"1h范围"}),e.jsx("th",{children:"成交量比"}),e.jsx("th",{children:"1h变化"}),e.jsx("th",{children:"EMA52"}),e.jsx("th",{children:"EMA斜率"}),e.jsx("th",{children:"现价"}),e.jsx("th",{children:"> EMA"}),e.jsx("th",{children:"安静24h"}),e.jsx("th",{children:"安静1h"}),e.jsx("th",{children:"异动"}),e.jsx("th",{children:"更新于"})]})}),e.jsx("tbody",{children:r.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"15",className:"text-dim",style:{textAlign:"center",padding:20},children:"等待K线数据..."})}):r.map(s=>e.jsxs("tr",{className:s.passes_filter?"filter-pass":"",children:[e.jsx("td",{children:e.jsx("strong",{children:s.coin})}),e.jsx("td",{className:"text-right "+a(s.signal_score),style:{fontWeight:700},children:s.signal_score!=null?s.signal_score.toFixed(0):"-"}),e.jsx("td",{className:"text-right "+(s.quiet_24h?"text-green":""),children:s.range_24h!=null?s.range_24h.toFixed(2)+"%":"-"}),e.jsx("td",{className:"text-right text-dim",children:s.vol_baseline!=null?s.vol_baseline.toFixed(2)+"%":"-"}),e.jsx("td",{className:"text-right "+(s.quiet_1h?"text-green":""),children:s.range_1h!=null?s.range_1h.toFixed(2)+"%":"-"}),e.jsx("td",{className:"text-right "+p(s.volume_ratio),children:s.volume_ratio!=null?s.volume_ratio.toFixed(2)+"x":"-"}),e.jsx("td",{className:"text-right "+(s.change_1h>0?"text-green":s.change_1h<0?"text-red":""),children:s.change_1h!=null?(s.change_1h>0?"+":"")+s.change_1h.toFixed(2)+"%":"-"}),e.jsx("td",{className:"text-right",children:s.ema_52?s.ema_52.toFixed(4):"-"}),e.jsx("td",{className:"text-right "+b(s.ema_slope),children:s.ema_slope!=null?(s.ema_slope>0?"+":"")+s.ema_slope.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-right",children:s.current_price?s.current_price.toFixed(4):"-"}),e.jsx("td",{className:s.price_above_ema?"text-green":"text-red",children:s.price_above_ema!=null?s.price_above_ema?"↑":"↓":"-"}),e.jsx("td",{className:s.quiet_24h?"text-green":"text-dim",children:s.quiet_24h!=null?s.quiet_24h?"✓":"✗":"-"}),e.jsx("td",{className:s.quiet_1h?"text-green":"text-dim",children:s.quiet_1h!=null?s.quiet_1h?"✓":"✗":"-"}),e.jsx("td",{className:s.fresh_anomaly?"text-orange":"text-dim",children:s.fresh_anomaly!=null&&s.fresh_anomaly?"⚠":"-"}),e.jsx("td",{className:"text-dim",children:s.last_updated?new Date(s.last_updated).toLocaleTimeString("zh-CN",{hour12:!1}):"-"})]},s.coin))})]})})]})}function re({signals:r}){const h=r.filter(n=>n.category==="full"),l=h.filter(n=>n.type==="enter").length;return e.jsxs("section",{className:"card card-wide",id:"trend-signal-card",children:[e.jsxs("h2",{children:["完整信号 (异动+分数≥70) ",l>0&&e.jsxs("span",{className:"text-green",style:{fontSize:12,fontWeight:400,marginLeft:8},children:["共",l,"条"]})]}),e.jsx("div",{className:"table-wrap",style:{maxHeight:350},children:e.jsxs("table",{id:"trend-signal-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"时间"}),e.jsx("th",{children:"币种"}),e.jsx("th",{children:"类型"}),e.jsx("th",{children:"分数"}),e.jsx("th",{children:"价格"}),e.jsx("th",{children:"成交量比"}),e.jsx("th",{children:"EMA斜率"}),e.jsx("th",{children:"趋势状态"})]})}),e.jsx("tbody",{children:h.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"8",className:"text-dim",style:{textAlign:"center",padding:20},children:"等待完整信号... (FreshAnomaly + 分数≥70)"})}):h.slice(0,50).map((n,d)=>{const t=n.type==="enter"?"signal-enter":"signal-exit",a=n.timestamp?new Date(n.timestamp).toLocaleTimeString("zh-CN",{hour12:!1}):"-";return e.jsxs("tr",{className:t,children:[e.jsx("td",{className:"text-dim",children:a}),e.jsx("td",{children:e.jsx("strong",{children:n.coin})}),e.jsx("td",{className:n.type==="enter"?"text-green":"text-dim",style:{fontWeight:600},children:n.type==="enter"?"开":"关"}),e.jsx("td",{className:"text-right",style:{fontWeight:700},children:n.signal_score!=null?n.signal_score.toFixed(0):"-"}),e.jsx("td",{className:"text-right",children:n.price?n.price.toFixed(4):"-"}),e.jsx("td",{className:"text-right",children:n.volume_ratio!=null?n.volume_ratio.toFixed(2)+"x":"-"}),e.jsx("td",{className:"text-right",children:n.ema_slope!=null?(n.ema_slope>0?"+":"")+n.ema_slope.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-dim",children:n.state||"-"})]},"full-"+n.timestamp+"-"+n.coin+"-"+d)})})]})})]})}function le({signals:r}){const h=r.filter(n=>n.category==="high"),l=h.filter(n=>n.type==="enter").length;return e.jsxs("section",{className:"card card-wide",id:"high-score-card",children:[e.jsxs("h2",{children:["高分信号 (分数≥90) ",l>0&&e.jsxs("span",{className:"text-green",style:{fontSize:12,fontWeight:400,marginLeft:8},children:["共",l,"条"]})]}),e.jsx("div",{className:"table-wrap",style:{maxHeight:350},children:e.jsxs("table",{id:"high-score-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"时间"}),e.jsx("th",{children:"币种"}),e.jsx("th",{children:"类型"}),e.jsx("th",{children:"分数"}),e.jsx("th",{children:"价格"}),e.jsx("th",{children:"成交量比"}),e.jsx("th",{children:"EMA斜率"}),e.jsx("th",{children:"趋势状态"})]})}),e.jsx("tbody",{children:h.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:"8",className:"text-dim",style:{textAlign:"center",padding:20},children:"等待高分信号... (分数≥90)"})}):h.slice(0,50).map((n,d)=>{const t=n.type==="enter"?"signal-enter":"signal-exit",a=n.timestamp?new Date(n.timestamp).toLocaleTimeString("zh-CN",{hour12:!1}):"-";return e.jsxs("tr",{className:t,children:[e.jsx("td",{className:"text-dim",children:a}),e.jsx("td",{children:e.jsx("strong",{children:n.coin})}),e.jsx("td",{className:n.type==="enter"?"text-green":"text-dim",style:{fontWeight:600},children:n.type==="enter"?"开":"关"}),e.jsx("td",{className:"text-right",style:{fontWeight:700},children:n.signal_score!=null?n.signal_score.toFixed(0):"-"}),e.jsx("td",{className:"text-right",children:n.price?n.price.toFixed(4):"-"}),e.jsx("td",{className:"text-right",children:n.volume_ratio!=null?n.volume_ratio.toFixed(2)+"x":"-"}),e.jsx("td",{className:"text-right",children:n.ema_slope!=null?(n.ema_slope>0?"+":"")+n.ema_slope.toFixed(3)+"%":"-"}),e.jsx("td",{className:"text-dim",children:n.state||"-"})]},"high-"+n.timestamp+"-"+n.coin+"-"+d)})})]})})]})}U.createRoot(document.getElementById("root")).render(e.jsx(V.StrictMode,{children:e.jsx(Y,{})}));