From 3cbd76f7ee8434d6eb6520669a7626fd712eb271 Mon Sep 17 00:00:00 2001 From: xxm Date: Wed, 19 Aug 2026 16:40:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(P2-B+C):=20=E6=9D=83=E5=A8=81=E4=BF=9D?= =?UTF-8?q?=E6=8A=A4=E5=8A=A0=E5=9B=BA=E2=80=94=E2=80=94per=5Fstock?= =?UTF-8?q?=E9=87=8D=E8=AF=8424h=E5=86=85=E5=85=B6=E4=BB=96=E6=BA=90?= =?UTF-8?q?=E4=B8=8D=E5=BE=97=E8=A6=86=E5=86=99=E5=8F=82=E6=95=B0(?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=8F=82=E6=95=B0=E8=A6=86=E7=9B=96=E5=8F=8D?= =?UTF-8?q?=E5=A4=8D=E5=87=BAbug)=E3=80=82A+D=E5=BF=AB=E7=85=A7=E7=98=A6?= =?UTF-8?q?=E8=BA=AB=E5=B7=B2=E5=89=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/profile-scripts/mofin_db.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/deploy/profile-scripts/mofin_db.py b/deploy/profile-scripts/mofin_db.py index ca45480f..b3262770 100644 --- a/deploy/profile-scripts/mofin_db.py +++ b/deploy/profile-scripts/mofin_db.py @@ -2099,6 +2099,32 @@ def write_holding_strategy(conn, code: str, name: str, data: dict, _op = conn.execute( "SELECT entry_low, entry_high, stop_loss, take_profit FROM holding_strategies WHERE code=? AND status='active'", (code,)).fetchone() + # ── per_stock 重评保护(2026-08-19 老莫:参数覆写保护)── + # per_stock_reassess 重评后 24h 内,其他 source_trigger 不得覆写参数 + # 判断:最近的 per_stock_12d 快照时间戳(source_trigger='per_stock_12d') + _ps = conn.execute( + "SELECT snapshotted_at FROM strategy_history WHERE code=? AND source_trigger='per_stock_12d' ORDER BY snapshotted_at DESC LIMIT 1", + (code,)).fetchone() + if _ps and _ps[0]: + try: + from datetime import datetime as _ddt, timedelta as _dtd + _ps_dt = _ddt.fromisoformat(str(_ps[0])[:19]) + if (_ddt.now() - _ps_dt) < _dtd(hours=24): + # 24h 内重评过 → 保护参数不被覆写 + _op2 = conn.execute( + "SELECT entry_low, entry_high, stop_loss, take_profit, rr_ratio FROM holding_strategies WHERE code=? AND status='active'", + (code,)).fetchone() + if _op2 and _op2[0] and _op2[0] > 0: + # 参数保护:当前值保留(除非调用方是 per_stock_12d 本身) + if source_trigger != 'per_stock_12d': + data['entry_low'] = float(_op2[0]) + data['entry_high'] = float(_op2[1]) if _op2[1] else _op2[0] + data['stop_loss'] = float(_op2[2]) if _op2[2] else data.get('stop_loss') + data['take_profit'] = float(_op2[3]) if _op2[3] else data.get('take_profit') + data['rr_ratio'] = float(_op2[4]) if _op2[4] else data.get('rr_ratio') + print(f" [AUTHORITY-24H] {code} per_stock重评24h内,保留参数(区{_op2[0]}~{_op2[1]} 损{_op2[2]})", flush=True) + except Exception: + pass if _op and float(_op[0] or 0) > 0: data['entry_low'] = float(_op[0]) data['entry_high'] = float(_op[1])