fix(authority): 系统仓位含'系统按'永久保护(修复reassessed_at=None时权威失效)
This commit is contained in:
+39
-19
@@ -1720,25 +1720,45 @@ def write_holding_strategy(conn, code: str, name: str, data: dict,
|
||||
pass
|
||||
# ── 策略参数权威保护(2026-07-27 老爸:技术路径每2分钟覆写12维的Zone/SL/TP/Position→RR波动→盯盘和XMPP不一致)──
|
||||
# 新鲜(<20h)12维分析的技术参数+仓位不允许被技术路径覆写。
|
||||
if source_trigger in _TECHNICAL_PATHS and _old_ra:
|
||||
try:
|
||||
from datetime import datetime as _ddt3, timedelta as _dtd3
|
||||
_ra_dt3 = _ddt3.fromisoformat(str(_old_ra)[:19])
|
||||
if (_ddt3.now() - _ra_dt3) < _dtd3(hours=20):
|
||||
_old_params = conn.execute(
|
||||
"SELECT entry_low, entry_high, stop_loss, take_profit, position_advice FROM holding_strategies WHERE code=? AND status='active'",
|
||||
(code,)).fetchone()
|
||||
if _old_params:
|
||||
_keys = ['entry_low','entry_high','stop_loss','take_profit','position_advice']
|
||||
_vals = [v if v else '' for v in _old_params]
|
||||
for i, k in enumerate(_keys):
|
||||
if i < 4 and float(_vals[i] or 0) > 0:
|
||||
data[k] = float(_vals[i])
|
||||
elif i == 4 and str(_vals[i]).strip():
|
||||
data[k] = str(_vals[i])
|
||||
print(f" [AUTHORITY-PARAM] {code} 保留12维参数(区{_vals[0]}~{_vals[1]} 损{_vals[2]} 盈{_vals[3]} pos={_vals[4]})", flush=True)
|
||||
except Exception:
|
||||
pass
|
||||
# 2026-07-27 坑:_old_ra=None 时权威保护永不触发(很多股票的reassessed_at为空),
|
||||
# 导致系统自动计算的仓位被反复踩回"中等仓位"。加入兜底:仓位含"%(系统按"即永保。
|
||||
if source_trigger in _TECHNICAL_PATHS:
|
||||
# 兜底:系统自动计算的仓位永久保护(不含 %(系统按 的不保护,即只有 LLM 仓和系统仓被保护)
|
||||
_old_pos = conn.execute(
|
||||
"SELECT position_advice FROM holding_strategies WHERE code=? AND status='active'",
|
||||
(code,)).fetchone()
|
||||
_old_pos_val = (_old_pos[0] or '') if _old_pos else ''
|
||||
if _old_pos_val and '系统按' in str(_old_pos_val):
|
||||
data['position_advice'] = _old_pos_val
|
||||
# 被保护仓位触发时顺便保护参数(无论 _old_ra 是否空)
|
||||
_op = conn.execute(
|
||||
"SELECT entry_low, entry_high, stop_loss, take_profit FROM holding_strategies WHERE code=? AND status='active'",
|
||||
(code,)).fetchone()
|
||||
if _op and float(_op[0] or 0) > 0:
|
||||
data['entry_low'] = float(_op[0])
|
||||
data['entry_high'] = float(_op[1])
|
||||
data['stop_loss'] = float(_op[2])
|
||||
data['take_profit'] = float(_op[3])
|
||||
print(f" [AUTHORITY-POS] {code} 保护系统仓位'{_old_pos_val[:30]}'", flush=True)
|
||||
elif _old_ra:
|
||||
try:
|
||||
from datetime import datetime as _ddt3, timedelta as _dtd3
|
||||
_ra_dt3 = _ddt3.fromisoformat(str(_old_ra)[:19])
|
||||
if (_ddt3.now() - _ra_dt3) < _dtd3(hours=20):
|
||||
_old_params = conn.execute(
|
||||
"SELECT entry_low, entry_high, stop_loss, take_profit, position_advice FROM holding_strategies WHERE code=? AND status='active'",
|
||||
(code,)).fetchone()
|
||||
if _old_params:
|
||||
_keys = ['entry_low','entry_high','stop_loss','take_profit','position_advice']
|
||||
_vals = [v if v else '' for v in _old_params]
|
||||
for i, k in enumerate(_keys):
|
||||
if i < 4 and float(_vals[i] or 0) > 0:
|
||||
data[k] = float(_vals[i])
|
||||
elif i == 4 and str(_vals[i]).strip():
|
||||
data[k] = str(_vals[i])
|
||||
print(f" [AUTHORITY-PARAM] {code} 保留12维参数(区{_vals[0]}~{_vals[1]} 损{_vals[2]} 盈{_vals[3]} pos={_vals[4]})", flush=True)
|
||||
except Exception:
|
||||
pass
|
||||
# ── action 权限保护(与信号同一权威层级,2026-07-22)──
|
||||
# 技术路径不得覆盖新鲜(<20h)12维 action。
|
||||
# 根治:技术路径写的"盈亏比不足1:1.5不建议买入"旧 action 与12维买入分析同框矛盾。
|
||||
|
||||
Reference in New Issue
Block a user