diff --git a/backend/signal_engine.py b/backend/signal_engine.py index a193071..4731df5 100644 --- a/backend/signal_engine.py +++ b/backend/signal_engine.py @@ -1088,6 +1088,15 @@ def paper_open_trade( tp1 = price - tp1_multiplier * atr tp2 = price - tp2_multiplier * atr + # SL 合理性校验:实际距离必须在 risk_distance 的 80%~120% 范围内 + actual_sl_dist = abs(sl - price) + if actual_sl_dist < risk_distance * 0.8 or actual_sl_dist > risk_distance * 1.2: + logger.error( + f"[{symbol}] ⚠️ SL校验失败,拒绝开仓: direction={direction} price={price:.4f} " + f"sl={sl:.4f} actual_dist={actual_sl_dist:.4f} expected={risk_distance:.4f} atr={atr:.4f}" + ) + return + with get_sync_conn() as conn: with conn.cursor() as cur: cur.execute( diff --git a/frontend/app/paper-v53/page.tsx b/frontend/app/paper-v53/page.tsx index 3969679..f9679fb 100644 --- a/frontend/app/paper-v53/page.tsx +++ b/frontend/app/paper-v53/page.tsx @@ -207,6 +207,9 @@ function ActivePositions() { TP2: ${fmtPrice(p.tp2_price)} SL: ${fmtPrice(p.sl_price)} +
+ 入场时间: {p.entry_ts ? new Date(p.entry_ts).toLocaleString("zh-CN", {hour12:false, month:"2-digit", day:"2-digit", hour:"2-digit", minute:"2-digit", second:"2-digit"} as any) : "-"} +
); })}