From bbff65fe52178b755cd4f3d2f0e9e5f24456f928 Mon Sep 17 00:00:00 2001
From: byronwang2005
Date: Tue, 2 Dec 2025 16:26:41 +0800
Subject: [PATCH 1/6] show on leaderboard
---
frontend/src/app/rank/board.tsx | 7 +++++++
frontend/src/types/system.ts | 1 +
2 files changed, 8 insertions(+)
diff --git a/frontend/src/app/rank/board.tsx b/frontend/src/app/rank/board.tsx
index 793c9ed60..4a82b98ca 100644
--- a/frontend/src/app/rank/board.tsx
+++ b/frontend/src/app/rank/board.tsx
@@ -213,6 +213,13 @@ export default function RankBoard() {
Max Leverage
{strategyDetail.max_leverage}x
+ Decision Interval
+
+ {strategyDetail.decide_interval !== undefined
+ ? `${strategyDetail.decide_interval}s`
+ : "-"}
+
+
Trading Symbols
{strategyDetail.symbols.join(", ")}
diff --git a/frontend/src/types/system.ts b/frontend/src/types/system.ts
index 1db398301..9234febcc 100644
--- a/frontend/src/types/system.ts
+++ b/frontend/src/types/system.ts
@@ -35,6 +35,7 @@ export interface StrategyDetail {
llm_model_id: string;
max_leverage: number;
initial_capital: number;
+ decide_interval?: number;
prompt: string;
}
From 2f2aca3c5f72fde3dbbf43ca23f97906db5cae92 Mon Sep 17 00:00:00 2001
From: byronwang2005
Date: Tue, 2 Dec 2025 16:31:02 +0800
Subject: [PATCH 2/6] show on strategy page
---
.../agent/components/strategy-items/trade-strategy-group.tsx | 1 +
frontend/src/app/rank/board.tsx | 2 +-
frontend/src/types/strategy.ts | 1 +
3 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
index 24b8c6fd7..dfbf30261 100644
--- a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
+++ b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
@@ -85,6 +85,7 @@ const TradeStrategyCard: FC = ({
{strategy.model_id}
{strategy.exchange_id}
+
{(strategy.decide_interval ?? 60)}s
{/* PnL, Trading Mode, and Status */}
diff --git a/frontend/src/app/rank/board.tsx b/frontend/src/app/rank/board.tsx
index 4a82b98ca..59941ba1c 100644
--- a/frontend/src/app/rank/board.tsx
+++ b/frontend/src/app/rank/board.tsx
@@ -217,7 +217,7 @@ export default function RankBoard() {
{strategyDetail.decide_interval !== undefined
? `${strategyDetail.decide_interval}s`
- : "-"}
+ : "60s"}
Trading Symbols
diff --git a/frontend/src/types/strategy.ts b/frontend/src/types/strategy.ts
index e070be6d0..9622e1716 100644
--- a/frontend/src/types/strategy.ts
+++ b/frontend/src/types/strategy.ts
@@ -12,6 +12,7 @@ export interface Strategy {
created_at: string;
exchange_id: string;
model_id: string;
+ decide_interval?: number;
}
// Strategy Performance types
From 71947f64534ec6576d6ddefd081072d1ec74626a Mon Sep 17 00:00:00 2001
From: byronwang2005
Date: Tue, 2 Dec 2025 16:34:50 +0800
Subject: [PATCH 3/6] fix
---
frontend/src/app/rank/board.tsx | 8 +++++---
python/valuecell/server/api/routers/strategy.py | 4 ++++
python/valuecell/server/api/schemas/strategy.py | 3 +++
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/frontend/src/app/rank/board.tsx b/frontend/src/app/rank/board.tsx
index 59941ba1c..725c26d4b 100644
--- a/frontend/src/app/rank/board.tsx
+++ b/frontend/src/app/rank/board.tsx
@@ -215,9 +215,11 @@ export default function RankBoard() {
Decision Interval
- {strategyDetail.decide_interval !== undefined
- ? `${strategyDetail.decide_interval}s`
- : "60s"}
+ {`${Number(
+ (strategyDetail as any).decide_interval ??
+ (strategyDetail as any).decideInterval ??
+ 60,
+ )}s`}
Trading Symbols
diff --git a/python/valuecell/server/api/routers/strategy.py b/python/valuecell/server/api/routers/strategy.py
index 001c63ea9..d81c27ece 100644
--- a/python/valuecell/server/api/routers/strategy.py
+++ b/python/valuecell/server/api/routers/strategy.py
@@ -150,6 +150,7 @@ def normalize_strategy_type(
for s in strategies:
meta = s.strategy_metadata or {}
cfg = s.config or {}
+ tr = (cfg.get("trading_config") or {})
status = map_status(s.status)
stop_reason_display = ""
if status == "stopped":
@@ -189,6 +190,9 @@ def normalize_strategy_type(
or cfg.get("model_id")
or cfg.get("llm_model_id")
),
+ decide_interval=(
+ int(tr.get("decide_interval")) if tr.get("decide_interval") is not None else None
+ ),
)
strategy_data_list.append(item)
diff --git a/python/valuecell/server/api/schemas/strategy.py b/python/valuecell/server/api/schemas/strategy.py
index 5ba53d5b6..702eff62a 100644
--- a/python/valuecell/server/api/schemas/strategy.py
+++ b/python/valuecell/server/api/schemas/strategy.py
@@ -39,6 +39,9 @@ class StrategySummaryData(BaseModel):
None, description="Associated exchange identifier"
)
model_id: Optional[str] = Field(None, description="Associated model identifier")
+ decide_interval: Optional[int] = Field(
+ None, description="Decision interval in seconds"
+ )
class StrategyListData(BaseModel):
From 0ecc07e8fb0e37683ae6173d1f76aaa6324a787a Mon Sep 17 00:00:00 2001
From: byronwang2005
Date: Tue, 2 Dec 2025 16:40:24 +0800
Subject: [PATCH 4/6] change style
---
.../agent/components/strategy-items/trade-strategy-group.tsx | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
index dfbf30261..7e499f29b 100644
--- a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
+++ b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
@@ -79,13 +79,15 @@ const TradeStrategyCard: FC = ({
{strategy.trading_mode === "live" ? "Live" : "Virtual"}
+
+ {(strategy.decide_interval ?? 60)}s
+
{/* Model and Exchange Info */}
{strategy.model_id}
{strategy.exchange_id}
-
{(strategy.decide_interval ?? 60)}s
{/* PnL, Trading Mode, and Status */}
From 9dc1cfac0cb946788e9e3cc69ff26807b61bc2b9 Mon Sep 17 00:00:00 2001
From: byronwang2005
Date: Tue, 2 Dec 2025 16:49:29 +0800
Subject: [PATCH 5/6] fix biome/python error
---
.../strategy-items/trade-strategy-group.tsx | 2 +-
frontend/src/app/rank/board.tsx | 12 +++++++++---
python/valuecell/server/api/routers/strategy.py | 13 ++++++-------
3 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
index 7e499f29b..3e7072af5 100644
--- a/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
+++ b/frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx
@@ -80,7 +80,7 @@ const TradeStrategyCard: FC = ({
{strategy.trading_mode === "live" ? "Live" : "Virtual"}
- {(strategy.decide_interval ?? 60)}s
+ {strategy.decide_interval ?? 60}s
diff --git a/frontend/src/app/rank/board.tsx b/frontend/src/app/rank/board.tsx
index 725c26d4b..57a27512b 100644
--- a/frontend/src/app/rank/board.tsx
+++ b/frontend/src/app/rank/board.tsx
@@ -216,9 +216,15 @@ export default function RankBoard() {
Decision Interval
{`${Number(
- (strategyDetail as any).decide_interval ??
- (strategyDetail as any).decideInterval ??
- 60,
+ strategyDetail.decide_interval ??
+ ("decideInterval" in strategyDetail
+ ? (
+ strategyDetail as unknown as {
+ decideInterval?: number;
+ }
+ ).decideInterval
+ : undefined) ??
+ 60,
)}s`}
diff --git a/python/valuecell/server/api/routers/strategy.py b/python/valuecell/server/api/routers/strategy.py
index d81c27ece..21a0ff958 100644
--- a/python/valuecell/server/api/routers/strategy.py
+++ b/python/valuecell/server/api/routers/strategy.py
@@ -150,7 +150,7 @@ def normalize_strategy_type(
for s in strategies:
meta = s.strategy_metadata or {}
cfg = s.config or {}
- tr = (cfg.get("trading_config") or {})
+ tr = cfg.get("trading_config") or {}
status = map_status(s.status)
stop_reason_display = ""
if status == "stopped":
@@ -162,11 +162,8 @@ def normalize_strategy_type(
) or "..."
total_pnl, total_pnl_pct = 0.0, 0.0
- if (
- portfolio_summary
- := await StrategyService.get_strategy_portfolio_summary(
- s.strategy_id
- )
+ if portfolio_summary := await StrategyService.get_strategy_portfolio_summary(
+ s.strategy_id
):
total_pnl = to_optional_float(portfolio_summary.total_pnl) or 0.0
total_pnl_pct = (
@@ -191,7 +188,9 @@ def normalize_strategy_type(
or cfg.get("llm_model_id")
),
decide_interval=(
- int(tr.get("decide_interval")) if tr.get("decide_interval") is not None else None
+ int(tr.get("decide_interval"))
+ if tr.get("decide_interval") is not None
+ else None
),
)
strategy_data_list.append(item)
From 259f95cfe8b2ecf52a9b86ef8523a450f7b45bc4 Mon Sep 17 00:00:00 2001
From: byronwang2005
Date: Tue, 2 Dec 2025 17:05:29 +0800
Subject: [PATCH 6/6] ruff format
---
python/valuecell/server/api/routers/strategy.py | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/python/valuecell/server/api/routers/strategy.py b/python/valuecell/server/api/routers/strategy.py
index 21a0ff958..408300726 100644
--- a/python/valuecell/server/api/routers/strategy.py
+++ b/python/valuecell/server/api/routers/strategy.py
@@ -162,8 +162,11 @@ def normalize_strategy_type(
) or "..."
total_pnl, total_pnl_pct = 0.0, 0.0
- if portfolio_summary := await StrategyService.get_strategy_portfolio_summary(
- s.strategy_id
+ if (
+ portfolio_summary
+ := await StrategyService.get_strategy_portfolio_summary(
+ s.strategy_id
+ )
):
total_pnl = to_optional_float(portfolio_summary.total_pnl) or 0.0
total_pnl_pct = (