# v4.5.52 锁自动过期移除 (2026-08-16) ## 用户指令原文 "是72小时释放的去掉。" — 用户明确要求移除 72h 自动释放,锁永久生效。 ## 改动位置 `scripts/signal_tracker.py` ### 改动 1: `is_lock_expired()` (line ~514) ```python # 原来: def is_lock_expired(lock): if not lock: return False return _hours_since(lock.get('locked_at', '')) >= LOCK_EXPIRY_HOURS # 72h # 2026-08-16 改: def is_lock_expired(lock): """检查锁是否过期 — 2026-08-16 禁用自动过期,锁永久生效,只能手动解锁""" return False # 锁不过期,永久生效 ``` ### 改动 2: `acquire_lock()` 同 trader 同侧分支 (line ~537) ```python # 原来: elif existing['side'] != side: return False, f"{symbol} 已被 {existing['trader']} 锁..." else: if is_lock_expired(existing): release_lock(symbol, existing['trader'], auto=True) # 过期则释放 else: return False, f"...需等 {LOCK_EXPIRY_HOURS}h 或手动解锁" # 2026-08-16 改: elif existing['side'] != side: return False, f"{symbol} 已被 {existing['trader']} 锁..." else: # 锁永久生效,只能手动解锁 hours = _hours_since(existing['locked_at']) return False, f"{symbol} 已被 {existing['trader']} 锁 ({hours:.1f}h), 需手动解锁" ``` ### 改动 3: `check_signal_lock()` 分支 (line ~628) ```python # 原来: if is_lock_expired(existing): release_lock(symbol, existing['trader'], auto=True) ok, msg = acquire_lock(symbol, trader, side, ...) if ok: return True, f"🔄 {msg}" return False, msg else: return False, f"{symbol} 被 {trader} 锁 ({hours:.1f}h), 需等 {LOCK_EXPIRY_HOURS}h" # 2026-08-16 改: # 锁永久生效,只能手动解锁 hours = _hours_since(existing['locked_at']) return False, f"{symbol} 被 {existing['trader']} 锁 ({hours:.1f}h), 需手动解锁或等其释放" ``` ## 影响 - 锁永久生效,不会被 72h 自动释放 - 同 trader 同方向信号进来 → 直接续期(更新时间戳),不拒绝 - 不同 trader 或反向 trader 信号进来 → 永远拒绝,只能手动 `/unlock` 解锁 - `_hours_since` / `LOCK_EXPIRY_HOURS` 常量保留但不再触发自动释放逻辑 ## 验证命令 ```bash cd ~/.hermes/skills/trading/okx-auto-position/scripts python3 -c "from signal_tracker import is_lock_expired; print(is_lock_expired(None), is_lock_expired({}))" # 输出应该是: False False ```