diff --git a/backend/main.py b/backend/main.py
index 36f6632..7dbc0ad 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -449,7 +449,14 @@ async def get_market_indicators(user: dict = Depends(get_current_user)):
ind_type,
)
if row:
- indicators[ind_type] = {"value": row["value"], "ts": row["timestamp_ms"]}
+ val = row["value"]
+ if isinstance(val, str):
+ import json as _json
+ try:
+ val = _json.loads(val)
+ except Exception:
+ pass
+ indicators[ind_type] = {"value": val, "ts": row["timestamp_ms"]}
result[sym.replace("USDT", "")] = indicators
return result
diff --git a/frontend/app/signals/page.tsx b/frontend/app/signals/page.tsx
index a23e32c..52a16a3 100644
--- a/frontend/app/signals/page.tsx
+++ b/frontend/app/signals/page.tsx
@@ -115,11 +115,18 @@ function MarketIndicatorsCards({ symbol }: { symbol: Symbol }) {
if (!data) return
等待市场指标数据...
;
- // value是JSONB对象,需要取具体字段
- const lsVal = data.long_short_ratio?.value as Record | undefined;
- const topVal = data.top_trader_position?.value as Record | undefined;
- const oiVal = data.open_interest_hist?.value as Record | undefined;
- const premVal = data.coinbase_premium?.value as Record | undefined;
+ // value可能是JSON字符串或对象,统一解析
+ const parseVal = (v: unknown): Record => {
+ if (!v) return {};
+ if (typeof v === "string") { try { return JSON.parse(v); } catch { return {}; } }
+ if (typeof v === "object") return v as Record;
+ return {};
+ };
+
+ const lsVal = parseVal(data.long_short_ratio?.value);
+ const topVal = parseVal(data.top_trader_position?.value);
+ const oiVal = parseVal(data.open_interest_hist?.value);
+ const premVal = parseVal(data.coinbase_premium?.value);
const longPct = Number(lsVal?.longAccount ?? 0.5) * 100;
const shortPct = Number(lsVal?.shortAccount ?? 0.5) * 100;