From 956469460c64affc299d3caf5bdce6898ee9d3cc Mon Sep 17 00:00:00 2001 From: root Date: Thu, 26 Feb 2026 10:11:22 +0000 Subject: [PATCH] feat: improve trades page with amount/profit/deadline --- app/trades/page.tsx | 119 ++++++++++++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 44 deletions(-) diff --git a/app/trades/page.tsx b/app/trades/page.tsx index fce79cd..1d1f35c 100644 --- a/app/trades/page.tsx +++ b/app/trades/page.tsx @@ -17,6 +17,11 @@ async function getStats() { catch { return []; } } +function calcExpectedProfit(direction: string, entryPrice: number, betAmount: number): number { + const price = direction === "YES" ? entryPrice : 1 - entryPrice; + return betAmount * (1 / price - 1); +} + const statusMap: Record = { open: "进行中", won: "盈利 ✅", lost: "亏损 ❌" }; const statusVariant: Record = { open: "secondary", won: "default", lost: "destructive" @@ -26,6 +31,9 @@ export default async function TradesPage() { const [rows, stats] = await Promise.all([getTrades(), getStats()]); const statsMap = Object.fromEntries(stats.map((s: any[]) => [s[0], s[1]])); const totalPnl = rows.reduce((sum: number, r: any[]) => sum + (r[7] || 0), 0); + const expectedTotalProfit = rows + .filter((r: any[]) => r[6] === "open") + .reduce((sum: number, r: any[]) => sum + calcExpectedProfit(r[2], Number(r[3]), Number(r[4])), 0); return (
@@ -34,30 +42,38 @@ export default async function TradesPage() {

信号验证 — 模拟下注记录(每注 $1)

-
+
- -
总注单
+ +
总注单
{rows.length}
- -
进行中
-
{statsMap['open'] || 0}
+ +
进行中
+
{statsMap["open"] || 0}
- -
已盈利
-
{statsMap['won'] || 0}
+ +
已盈利
+
{statsMap["won"] || 0}
- -
模拟总盈亏
-
= 0 ? 'text-green-400' : 'text-red-400'}`}> - {totalPnl >= 0 ? '+' : ''}{totalPnl.toFixed(2)} + +
模拟总盈亏
+
= 0 ? "text-green-400" : "text-red-400"}`}> + {totalPnl >= 0 ? "+" : ""}{totalPnl.toFixed(2)} +
+
+ + + +
预期总收益
+
= 0 ? "text-blue-400" : "text-red-400"}`}> + {expectedTotalProfit >= 0 ? "+$" : "-$"}{Math.abs(expectedTotalProfit).toFixed(2)}
@@ -66,43 +82,58 @@ export default async function TradesPage() {
- +
- - - - - - - + + + + + + + + + {rows.length === 0 ? ( - - ) : rows.map((r: any[], i: number) => ( - - - - - - - + ) : rows.map((r: any[], i: number) => { + const expProfit = calcExpectedProfit(r[2], Number(r[3]), Number(r[4])); + return ( + + + - - ))} + + + + + + + + + ); + })}
市场方向入场价到期日状态盈亏
市场问题方向入场价下注额预期收益到期日状态盈亏
暂无模拟交易
-
{String(r[0]).slice(0, 8)}
-
{r[1]}
-
- - {r[2]} - - {(Number(r[3]) * 100).toFixed(1)}¢{String(r[5]).slice(0, 10)}{statusMap[r[6]] ?? r[6]} - {r[7] != null ? ( - = 0 ? 'text-green-400' : 'text-red-400'}> - {r[7] >= 0 ? '+' : ''}{Number(r[7]).toFixed(2)} +
暂无模拟交易
+
{r[1]}
+
{String(r[0]).slice(0, 8)}
+
+ + {r[2]} - ) : -} -
{(Number(r[3]) * 100).toFixed(1)}¢${Number(r[4]).toFixed(2)} + {r[6] === "open" ? ( + +${expProfit.toFixed(2)} + ) : -} + {String(r[5]).slice(0, 10)} + + {statusMap[r[6]] ?? r[6]} + + + {r[7] != null ? ( + = 0 ? "text-green-400" : "text-red-400"}> + {r[7] >= 0 ? "+" : ""}{Number(r[7]).toFixed(2)} + + ) : -} +