feat: sync_strategy_def维护函数——scanner自注册+key_params drift检测(变更→needs_review+version bump)(老莫:策略定义不过期)

This commit is contained in:
xxm
2026-08-18 20:24:59 +08:00
parent 82bdd76b85
commit 9b04fe1943
+53
View File
@@ -2388,3 +2388,56 @@ def read_capital_flow_cache(conn) -> dict:
import json
r = conn.execute("SELECT cache_json FROM capital_flow_cache WHERE id=1 ORDER BY updated_at DESC LIMIT 1").fetchone()
return json.loads(r['cache_json']) if r else {}
def sync_strategy_def(conn, d: dict):
"""upsert 策略定义。d 只含非空字段;prose 缺省时保留旧值;key_params 变化→needs_review。"""
import json, hashlib
name = d.get("strategy_name", "")
if not name:
print(" [SYNC_DEF] strategy_name 为空,跳过")
return
old = conn.execute(
"SELECT key_params, params_hash, version FROM strategy_defs WHERE strategy_name=?", (name,)).fetchone()
kp = d.get("key_params")
hp = hashlib.md5((kp or "").encode()).hexdigest()[:12] if kp else None
now = "2026-08-18 17:40:00" # 用 DB 时间更好,但保持简单
changed = False
if old:
# 已有:只更新非空字段;key_params 变化 → bump
sets, params = [], []
for col in ("display_name", "market", "regime", "family", "summary", "entry_logic",
"exit_logic", "review_focus", "holding_style", "version", "scanner_file", "doc_ref"):
if d.get(col):
sets.append(f"{col}=?")
params.append(d.get(col))
if kp:
if not old[0] or old[1] != hp:
sets.append("key_params=?")
params.append(kp)
sets.append("params_hash=?")
params.append(hp)
sets.append("needs_review=1") # 参数变了要人审
sets.append("version=?")
params.append(d.get("version") or (int((old[2] or "v0")[1:]) + 1 if str(old[2] or "").startswith("v") else "v1"))
changed = True
print(f" [SYNC_DEF] {name} 参数变更 → needs_review=1, version bump")
if sets:
sets.append("updated_at=datetime('now','localtime')")
params.append(name)
conn.execute(f"UPDATE strategy_defs SET {', '.join(sets)} WHERE strategy_name=?", params + [name])
if not changed:
print(f" [SYNC_DEF] {name} 定义一致,无需更新")
else:
# 新增:全量插入
if not d.get("display_name"): d["display_name"] = name
d["params_hash"] = hp or ""
d["needs_review"] = 1 # 新注册需人工确认 prose
d["updated_at"] = "datetime('now','localtime')"
cols = ",".join(d.keys())
ph = ",".join("?" * len(d))
conn.execute(f"INSERT OR IGNORE INTO strategy_defs ({cols}) VALUES ({ph})",
[d[k] for k in d])
print(f" [SYNC_DEF] {name} 新注册(needs_review=1")
conn.commit()
return changed