diff --git a/ANCHOR.md b/ANCHOR.md index a884194..1d8ecee 100644 --- a/ANCHOR.md +++ b/ANCHOR.md @@ -3,24 +3,26 @@ ## 项目概览 - 名称:Nof1 Bottom Board - 主要组件:`AlphaBoard.js` -- 当前版本:`v1.5.1`(bugfix) +- 当前版本:`v1.7.0`(feature) ## 当前目标 -- 当前任务:修复浏览器切回前台标签页时面板未自动折叠的问题。 -- 行为约束:仅在面板所在标签页位于前台时执行实时更新(含折叠/展开状态下的时间与数据刷新);保持主次面板既有交互。 -- 兼容策略:保留行情卡原有渲染字段(price/change/percent/ts),仅替换数据源与交易对。 +- 当前任务:按评审意见移除 AXS 卡片,改为 OPENAI 卡片,并继续由欧易(OKX)提供该卡片行情。 +- 行为约束:保持主次面板既有交互与前台轮询门控;新 source 接入需兼容现有 price/change/percent/ts 渲染字段。 +- 兼容策略:Binance 与 OKX 行情统一映射为 `price/change/percent/ts`,渲染层无感知切换。 ## 约束 - 遵循 `AGENTS.md` 中列出的沟通、流程与审计要求。 - 维护轻量、可读的前端代码结构。 -- 版本号按 `v主.次.修` 维护;本次属于 bugfix,升级到 `v1.5.1`。 +- 版本号按 `v主.次.修` 维护;本次属于 feature,升级到 `v1.7.0`。 ## 设计笔记 -- 复用现有 `visibilitychange` 前台补偿逻辑,在标签页恢复可见时优先执行自动最小化,保证回到前台后默认折叠。 -- 自动折叠时同步收起次面板(`setFeatureState(false)`),避免下次展开时残留展开状态造成高度突变。 -- 保持原有“仅前台轮询”策略不变:自动折叠后仍立即触发一次数据补偿刷新。 +- 将 `fetchPerpTicker` 升级为按 `source` 分流:`binance` 继续走 `fapi/v1/ticker/24hr`,`okx` 走 `api/v5/market/ticker`。 +- 在 FEATURE_CARDS 中保留 BTC/XAU 使用 Binance,并将第三张卡片由 AXS 调整为 OPENAI(`OPENAI-USDT-SWAP`,OKX)。 +- OKX 返回字段映射:`last` -> `price`;`open24h` 计算 `change`;`sodUtc0` 计算 `percent`,并统一输出比例值。 ## 验证记录 +- 2026-05-11:按评审意见移除 AXS 并新增 OPENAI 卡片(OKX),执行 `node --check AlphaBoard.js`,语法检查通过。 +- 2026-05-11:新增 FEATURE_CARDS 多 source 支持并接入 OKX AXS-SWAP,执行 `node --check AlphaBoard.js`,语法检查通过。 - 2026-02-10:修复切回前台自动折叠行为,执行 `node --check AlphaBoard.js`,语法检查通过。 - 2026-02-10:新增 AXSUSDT 永续卡片并改造折叠态为状态灯入口,执行 `node --check AlphaBoard.js`,语法检查通过。 - 2026-02-10:将 BTC/XAU 改为 USDT 永续合约行情,执行 `node --check AlphaBoard.js`,语法检查通过。 @@ -31,6 +33,6 @@ - 2026-02-10:执行 `node --check AlphaBoard.js`,语法检查通过。 ## 潜在影响 -- 标签页从后台切回前台时,若面板处于展开态会自动折叠;用户需要再次点击状态灯展开。 -- 自动折叠会同时重置次面板为收起态,减少恢复前台后的布局抖动。 -- 前台补偿刷新与状态点更新逻辑保持不变,不影响原有网络退避策略。 +- 新增 `www.okx.com` 访问依赖;若目标环境屏蔽该域名,相关卡片会显示获取失败。 +- OKX 的 `percent` 由日内基准价计算,和 Binance 的 24h 统计口径可能存在轻微差异。 +- 渲染层保持统一字段,不影响既有样式、排序与前台刷新策略。 diff --git a/AlphaBoard.js b/AlphaBoard.js index 94b8aa2..6fa88a7 100644 --- a/AlphaBoard.js +++ b/AlphaBoard.js @@ -1,7 +1,7 @@ // ==UserScript== // @name Alpha Board(链上盈利数据展示/底部横排暂时/可隐藏/柔和玻璃) // @namespace https://greasyfork.org/zh-CN/users/1211909-amazing-fish -// @version 1.5.2 +// @version 1.7.0 // @description 链上实时账户看板 · 默认最小化 · 按模型独立退避 · 轻量玻璃态 UI · 低饱和 P&L · 横排 6 卡片并展示相对更新时间 // @match *://*/* // @grant GM_xmlhttpRequest @@ -9,6 +9,7 @@ // @grant GM_setClipboard // @connect api.hyperliquid.xyz // @connect fapi.binance.com +// @connect www.okx.com // @license MIT // ==/UserScript== @@ -26,9 +27,9 @@ globalScope[INSTALL_FLAG] = true; /** - * Alpha Board 1.5.2 + * Alpha Board 1.7.0 * ------------------ - * - 主面板展示行情卡片(BTC / XAU / AXS) + * - 主面板展示行情卡片(BTC / XAU / OPENAI) * - 次面板展示多模型链上账户价值 * - Hyperliquid 地址轮询:独立退避 + 共享缓存/锁 + 无本地配置持久化 * - 行情轮询:折叠态降频,展开主面板后立即刷新 @@ -73,21 +74,21 @@ badge: 'BTC', name: 'BTCUSDT · 永续', source: '数据源 Binance Futures', - fetcher: fetchBtcPerpTicker, + fetcher: ()=>fetchPerpTicker({ source: 'binance', symbol: 'BTCUSDT' }), }, { key: 'xau', badge: 'XAU', name: 'XAUUSDT · 永续', source: '数据源 Binance Futures', - fetcher: fetchXauPerpTicker, + fetcher: ()=>fetchPerpTicker({ source: 'binance', symbol: 'XAUUSDT' }), }, { - key: 'axs', - badge: 'AXS', - name: 'AXSUSDT · 永续', - source: '数据源 Binance Futures', - fetcher: fetchAxsPerpTicker, + key: 'openai', + badge: 'OAI', + name: 'OPENAIUSDT · 永续', + source: '数据源 OKX Swap', + fetcher: ()=>fetchPerpTicker({ source: 'okx', symbol: 'OPENAI-USDT-SWAP' }), }, ]; @@ -864,8 +865,30 @@ } } - async function fetchPerpTicker(symbol){ + async function fetchPerpTicker({ source, symbol }){ try { + if (source === 'okx') { + const resp = await gmGetJson(`https://www.okx.com/api/v5/market/ticker?instId=${encodeURIComponent(symbol)}`); + const item = Array.isArray(resp?.data) ? resp.data[0] : null; + const priceRaw = item?.last ?? item?.lastPx; + const changeRaw = item?.open24h != null && priceRaw != null + ? (parseFloat(priceRaw) - parseFloat(item.open24h)).toString() + : null; + const pctRaw = item?.sodUtc0 != null && priceRaw != null + ? (((parseFloat(priceRaw) - parseFloat(item.sodUtc0)) / parseFloat(item.sodUtc0)) * 100).toString() + : null; + const price = priceRaw == null ? NaN : parseFloat(priceRaw); + if (!Number.isFinite(price)) return null; + const change = changeRaw == null ? NaN : parseFloat(changeRaw); + const percent = pctRaw == null ? NaN : parseFloat(pctRaw); + return { + price, + change: Number.isFinite(change) ? change : null, + percent: Number.isFinite(percent) ? percent / 100 : null, + ts: Date.now(), + }; + } + const resp = await gmGetJson(`https://fapi.binance.com/fapi/v1/ticker/24hr?symbol=${encodeURIComponent(symbol)}`); const priceRaw = resp?.lastPrice ?? resp?.weightedAvgPrice ?? resp?.price; const changeRaw = resp?.priceChange; @@ -885,18 +908,6 @@ } } - async function fetchBtcPerpTicker(){ - return fetchPerpTicker('BTCUSDT'); - } - - async function fetchXauPerpTicker(){ - return fetchPerpTicker('XAUUSDT'); - } - - async function fetchAxsPerpTicker(){ - return fetchPerpTicker('AXSUSDT'); - } - function tryUseSharedResult(canon, rec){ if (!canon) return false; const payload = getFreshSharedResult(canon); diff --git a/docs/audit.log b/docs/audit.log index 6f2f1a7..acb38af 100644 --- a/docs/audit.log +++ b/docs/audit.log @@ -1,4 +1,8 @@ # 审计日志(倒序) +- 2026-05-11 feature v1.7.0:按评审意见去除 AXS 行情卡并替换为 OPENAI(`OPENAI-USDT-SWAP`,OKX);涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。 + +- 2026-05-11 feature v1.6.0:为 FEATURE_CARDS 新增多交易所 source 分流能力;Binance 维持 BTC/XAU 永续,AXS 卡片切换为欧易 `AXS-USDT-SWAP`;涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。 + - 2026-02-10 bugfix v1.5.1:修复浏览器切回前台标签页时未自动折叠的问题;切回前台若处于展开态则自动最小化并同步收起次面板;涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。 - 2026-02-10 feature v1.5.0:新增 `AXSUSDT` 永续行情卡;折叠态入口去掉“Alpha Board”标题并改为状态灯极简显示(与顶栏状态同步);涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。