From 58d7d34cf1c5089c2c2f0ff613078fea59bed294 Mon Sep 17 00:00:00 2001 From: hmo Date: Mon, 27 Jul 2026 11:38:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(authority):=20=E7=B3=BB=E7=BB=9F=E4=BB=93?= =?UTF-8?q?=E4=BD=8D=E5=90=AB'=E7=B3=BB=E7=BB=9F=E6=8C=89'=E6=B0=B8?= =?UTF-8?q?=E4=B9=85=E4=BF=9D=E6=8A=A4(=E4=BF=AE=E5=A4=8Dreassessed=5Fat?= =?UTF-8?q?=3DNone=E6=97=B6=E6=9D=83=E5=A8=81=E5=A4=B1=E6=95=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mofin_db.py | 58 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/mofin_db.py b/mofin_db.py index b8ecfdcf..7ad43b2c 100644 --- a/mofin_db.py +++ b/mofin_db.py @@ -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维买入分析同框矛盾。