import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; async function getTrades() { const DB = "/home/fzq1228/polyscout/data/polyscout.db"; const { execSync } = await import("child_process"); const py = `import sqlite3,json; conn=sqlite3.connect('${DB}'); c=conn.cursor(); c.execute("""SELECT market_id, question, bet_direction, entry_price, bet_amount, end_date, status, pnl, created_at FROM paper_trades ORDER BY created_at DESC LIMIT 50"""); print(json.dumps(c.fetchall(), ensure_ascii=False, default=str)); conn.close()`; try { return JSON.parse(execSync(`python3 -c ${JSON.stringify(py)}`, { encoding: "utf8" })); } catch { return []; } } async function getStats() { const DB = "/home/fzq1228/polyscout/data/polyscout.db"; const { execSync } = await import("child_process"); const py = `import sqlite3,json; conn=sqlite3.connect('${DB}'); c=conn.cursor(); c.execute("SELECT status, COUNT(*) FROM paper_trades GROUP BY status"); print(json.dumps(c.fetchall(), ensure_ascii=False)); conn.close()`; try { return JSON.parse(execSync(`python3 -c ${JSON.stringify(py)}`, { encoding: "utf8" })); } 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" }; 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 totalBetAmount = rows.reduce((sum: number, r: any[]) => sum + (Number(r[4]) || 0), 0); 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 (

模拟交易

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

总下注金额
${totalBetAmount.toFixed(2)}
总注单
{rows.length}
进行中
{statsMap["open"] || 0}
已盈利
{statsMap["won"] || 0}
模拟总盈亏
= 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)}
{rows.length === 0 ? ( ) : rows.map((r: any[], i: number) => { const expProfit = calcExpectedProfit(r[2], Number(r[3]), Number(r[4])); return ( ); })}
市场问题 方向 入场价 下注额 预期收益 到期日 状态 盈亏
暂无模拟交易
{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)} ) : -}
); }