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 = (