From a88e114b4c0d3779d78dbd1f8ab93c3590b3b3a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Sat, 14 Feb 2026 17:20:34 +0800 Subject: [PATCH] 1 --- backend/api/routes/trades.py | 11 ++++----- .../database/cleanup_non_system_trades.sql | 23 +++++++++++++++++++ backend/database/models.py | 17 ++------------ frontend/src/components/TradeList.jsx | 14 ----------- trading_system/binance_client.py | 20 ++++++++++++---- trading_system/position_manager.py | 6 +++-- 6 files changed, 49 insertions(+), 42 deletions(-) create mode 100644 backend/database/cleanup_non_system_trades.sql diff --git a/backend/api/routes/trades.py b/backend/api/routes/trades.py index 87ca479..046de86 100644 --- a/backend/api/routes/trades.py +++ b/backend/api/routes/trades.py @@ -80,7 +80,6 @@ async def get_trades( exit_reason: Optional[str] = Query(None, description="平仓原因筛选: 'stop_loss', 'take_profit', 'trailing_stop', 'manual', 'sync'"), status: Optional[str] = Query(None, description="状态筛选: 'open', 'closed', 'cancelled'"), limit: int = Query(100, ge=1, le=1000, description="返回记录数限制"), - only_system_orders: bool = Query(False, description="仅返回本系统开仓的记录(有开仓订单号),排除同步/手动录入的仓位"), ): """ 获取交易记录 @@ -126,7 +125,7 @@ async def get_trades( except ValueError: logger.warning(f"无效的结束日期格式: {end_date}") - trades = Trade.get_all(start_timestamp, end_timestamp, symbol, status, trade_type, exit_reason, account_id=account_id, only_system_orders=only_system_orders) + trades = Trade.get_all(start_timestamp, end_timestamp, symbol, status, trade_type, exit_reason, account_id=account_id) logger.info(f"查询到 {len(trades)} 条交易记录") # 格式化交易记录,添加平仓类型的中文显示 @@ -167,8 +166,7 @@ async def get_trades( "end_date": datetime.fromtimestamp(end_timestamp).strftime('%Y-%m-%d %H:%M:%S') if end_timestamp else None, "period": period, "symbol": symbol, - "status": status, - "only_system_orders": only_system_orders + "status": status } } @@ -186,11 +184,10 @@ async def get_trade_stats( end_date: Optional[str] = Query(None, description="结束日期 (YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS)"), period: Optional[str] = Query(None, description="快速时间段筛选: '1d', '7d', '30d', 'today', 'week', 'month'"), symbol: Optional[str] = Query(None, description="交易对筛选"), - only_system_orders: bool = Query(False, description="仅统计本系统开仓的记录"), ): """获取交易统计""" try: - logger.info(f"获取交易统计请求: start_date={start_date}, end_date={end_date}, period={period}, symbol={symbol}, only_system_orders={only_system_orders}") + logger.info(f"获取交易统计请求: start_date={start_date}, end_date={end_date}, period={period}, symbol={symbol}") start_timestamp = None end_timestamp = None @@ -223,7 +220,7 @@ async def get_trade_stats( except ValueError: logger.warning(f"无效的结束日期格式: {end_date}") - trades = Trade.get_all(start_timestamp, end_timestamp, symbol, None, account_id=account_id, only_system_orders=only_system_orders) + trades = Trade.get_all(start_timestamp, end_timestamp, symbol, None, account_id=account_id) closed_trades = [t for t in trades if t['status'] == 'closed'] # 辅助函数:计算净盈亏(优先使用 realized_pnl - commission) diff --git a/backend/database/cleanup_non_system_trades.sql b/backend/database/cleanup_non_system_trades.sql new file mode 100644 index 0000000..f6e8fb2 --- /dev/null +++ b/backend/database/cleanup_non_system_trades.sql @@ -0,0 +1,23 @@ +-- 清理「非交易系统下单」的交易记录(无开仓订单号的记录) +-- 本系统开仓会在成交后保存 entry_order_id;无该字段或为 0 的为同步补录/其它来源,可安全删除。 +-- 执行前请先备份数据库或至少备份 trades 表。 +-- 若表结构较旧、没有 entry_order_id 列,请先执行 add_order_ids.sql 或跳过本脚本。 + +-- 1) 查看将要删除的记录数(按账号) +SELECT account_id, status, COUNT(*) AS cnt +FROM trades +WHERE entry_order_id IS NULL OR entry_order_id = 0 +GROUP BY account_id, status +ORDER BY account_id, status; + +-- 2) 查看将要删除的总数 +SELECT COUNT(*) AS will_delete FROM trades +WHERE entry_order_id IS NULL OR entry_order_id = 0; + +-- 3) 确认无误后执行删除(建议先备份:mysqldump -u user -p db_name trades > trades_backup.sql) +-- DELETE FROM trades +-- WHERE entry_order_id IS NULL OR entry_order_id = 0; + +-- 若只清理指定账号,可加上条件,例如: +-- DELETE FROM trades +-- WHERE (entry_order_id IS NULL OR entry_order_id = 0) AND account_id = 1; diff --git a/backend/database/models.py b/backend/database/models.py index d80a1ca..05d9a8a 100644 --- a/backend/database/models.py +++ b/backend/database/models.py @@ -700,18 +700,8 @@ class Trade: ) @staticmethod - def get_all(start_timestamp=None, end_timestamp=None, symbol=None, status=None, trade_type=None, exit_reason=None, account_id: int = None, only_system_orders: bool = False): - """获取交易记录 - - Args: - start_timestamp: 开始时间(Unix时间戳秒数,可选) - end_timestamp: 结束时间(Unix时间戳秒数,可选) - symbol: 交易对(可选) - status: 状态(可选) - trade_type: 交易类型(可选) - exit_reason: 平仓原因(可选) - only_system_orders: 若为 True,仅返回本系统开仓的记录(entry_order_id 非空) - """ + def get_all(start_timestamp=None, end_timestamp=None, symbol=None, status=None, trade_type=None, exit_reason=None, account_id: int = None): + """获取交易记录(仅包含本系统开仓的记录已通过清理脚本维护,不再在查询里筛选)""" query = "SELECT * FROM trades WHERE 1=1" params = [] @@ -723,9 +713,6 @@ class Trade: except Exception: pass - if only_system_orders and _table_has_column("trades", "entry_order_id"): - query += " AND entry_order_id IS NOT NULL AND entry_order_id != 0" - if start_timestamp is not None: query += " AND created_at >= %s" params.append(start_timestamp) diff --git a/frontend/src/components/TradeList.jsx b/frontend/src/components/TradeList.jsx index 6e7ddf7..576cd6f 100644 --- a/frontend/src/components/TradeList.jsx +++ b/frontend/src/components/TradeList.jsx @@ -20,7 +20,6 @@ const TradeList = () => { const [useCustomDate, setUseCustomDate] = useState(false) const [tradeType, setTradeType] = useState('') const [exitReason, setExitReason] = useState('') - const [onlySystemOrders, setOnlySystemOrders] = useState(false) useEffect(() => { loadData() @@ -46,7 +45,6 @@ const TradeList = () => { if (status) params.status = status if (tradeType) params.trade_type = tradeType if (exitReason) params.exit_reason = exitReason - if (onlySystemOrders) params.only_system_orders = true const [tradesData, statsData] = await Promise.all([ api.getTrades(params), @@ -82,7 +80,6 @@ const TradeList = () => { setSymbol('') setStatus('') setUseCustomDate(false) - setOnlySystemOrders(false) } // 导出当前订单数据(含入场/离场原因、入场思路等完整字段,便于后续分析) @@ -420,17 +417,6 @@ const TradeList = () => { -
- -
-