feat(P2-B+C): 权威保护加固——per_stock重评24h内其他源不得覆写参数(解决参数覆盖反复出bug)。A+D快照瘦身已前置

This commit is contained in:
xxm
2026-08-19 16:40:25 +08:00
parent 88885eae76
commit 3cbd76f7ee
+26
View File
@@ -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])