feat: sync_strategy_def维护函数——scanner自注册+key_params drift检测(变更→needs_review+version bump)(老莫:策略定义不过期)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user