From 06272b6922755ea3247300f70a71eb0a16620a81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Thu, 22 Jan 2026 18:51:26 +0800 Subject: [PATCH] a --- frontend/src/components/TradeList.jsx | 109 +++++++++++++++----------- 1 file changed, 64 insertions(+), 45 deletions(-) diff --git a/frontend/src/components/TradeList.jsx b/frontend/src/components/TradeList.jsx index b010c3e..f39a9d1 100644 --- a/frontend/src/components/TradeList.jsx +++ b/frontend/src/components/TradeList.jsx @@ -6,7 +6,7 @@ const TradeList = () => { const [trades, setTrades] = useState([]) const [stats, setStats] = useState(null) const [loading, setLoading] = useState(true) - + // 筛选状态 const [period, setPeriod] = useState('today') // '1d', '7d', '30d', 'today', 'week', 'month', null const [startDate, setStartDate] = useState('') @@ -19,13 +19,13 @@ const TradeList = () => { useEffect(() => { loadData() - + // 监听账号切换事件,自动重新加载数据 const handleAccountChange = () => { loadData() } window.addEventListener('ats:account:changed', handleAccountChange) - + return () => { window.removeEventListener('ats:account:changed', handleAccountChange) } @@ -37,7 +37,7 @@ const TradeList = () => { const params = { limit: 100 } - + // 如果使用快速时间段筛选 if (!useCustomDate && period) { params.period = period @@ -46,12 +46,12 @@ const TradeList = () => { if (startDate) params.start_date = startDate if (endDate) params.end_date = endDate } - + if (symbol) params.symbol = symbol if (status) params.status = status if (tradeType) params.trade_type = tradeType if (exitReason) params.exit_reason = exitReason - + const [tradesData, statsData] = await Promise.all([ api.getTrades(params), api.getTradeStats(params) @@ -96,49 +96,49 @@ const TradeList = () => {

说明:每条记录代表一笔完整的交易(开仓+平仓),统计总盈亏时每条记录只计算一次

- + {/* 筛选面板 */}
- - - - - - -
) } - + {stats && (
@@ -324,9 +344,8 @@ const TradeList = () => {
平均盈利 / 平均亏损(期望 3:1)
= 3 ? 'positive' : '' - }`} + className={`stat-value ${typeof stats.avg_win_loss_ratio === 'number' && stats.avg_win_loss_ratio >= 3 ? 'positive' : '' + }`} > {typeof stats.avg_win_loss_ratio === 'number' ? `${stats.avg_win_loss_ratio.toFixed(2)} : 1` @@ -380,19 +399,19 @@ const TradeList = () => { const notional = trade.notional_usdt !== undefined && trade.notional_usdt !== null ? parseFloat(trade.notional_usdt) : ( - trade.entry_value_usdt !== undefined && trade.entry_value_usdt !== null - ? parseFloat(trade.entry_value_usdt) - : (parseFloat(trade.quantity || 0) * parseFloat(trade.entry_price || 0)) - ) + trade.entry_value_usdt !== undefined && trade.entry_value_usdt !== null + ? parseFloat(trade.entry_value_usdt) + : (parseFloat(trade.quantity || 0) * parseFloat(trade.entry_price || 0)) + ) const leverage = parseFloat(trade.leverage || 10) const margin = trade.margin_usdt !== undefined && trade.margin_usdt !== null ? parseFloat(trade.margin_usdt) : (leverage > 0 ? notional / leverage : 0) - + // 计算盈亏比例(盈亏/保证金) const pnl = parseFloat(trade.pnl || 0) const pnlPercent = margin > 0 ? (pnl / margin) * 100 : 0 - + // 格式化时间为北京时间 // 支持Unix时间戳(秒数)或日期字符串 const formatTime = (timeValue) => { @@ -418,7 +437,7 @@ const TradeList = () => { return String(timeValue) } } - + // 格式化订单号显示 const formatOrderIds = () => { const entry = trade.entry_order_id || '-' @@ -429,7 +448,7 @@ const TradeList = () => { } return entry !== '-' ? `开仓: ${entry}` : `平仓: ${exit}` } - + return ( #{trade.id} @@ -458,7 +477,7 @@ const TradeList = () => { })} - + {/* 移动端卡片 */}
{trades.map(trade => { @@ -466,17 +485,17 @@ const TradeList = () => { const notional = trade.notional_usdt !== undefined && trade.notional_usdt !== null ? parseFloat(trade.notional_usdt) : ( - trade.entry_value_usdt !== undefined && trade.entry_value_usdt !== null - ? parseFloat(trade.entry_value_usdt) - : (parseFloat(trade.quantity || 0) * parseFloat(trade.entry_price || 0)) - ) + trade.entry_value_usdt !== undefined && trade.entry_value_usdt !== null + ? parseFloat(trade.entry_value_usdt) + : (parseFloat(trade.quantity || 0) * parseFloat(trade.entry_price || 0)) + ) const leverage = parseFloat(trade.leverage || 10) const margin = trade.margin_usdt !== undefined && trade.margin_usdt !== null ? parseFloat(trade.margin_usdt) : (leverage > 0 ? notional / leverage : 0) const pnl = parseFloat(trade.pnl || 0) const pnlPercent = margin > 0 ? (pnl / margin) * 100 : 0 - + // 格式化时间为北京时间 // 支持Unix时间戳(秒数)或日期字符串 const formatTime = (timeValue) => { @@ -501,7 +520,7 @@ const TradeList = () => { return String(timeValue) } } - + return (
@@ -562,17 +581,17 @@ const TradeList = () => { )}
-
- 入场: - {formatTime(trade.entry_time)} -
- {trade.exit_time && (
- 平仓: - {formatTime(trade.exit_time)} + 入场: + {formatTime(trade.entry_time)}
- )} -
+ {trade.exit_time && ( +
+ 平仓: + {formatTime(trade.exit_time)} +
+ )} +
) })}