diff --git a/ChanPivotMonitor.py b/ChanPivotMonitor.py index 296704d..778ae2a 100644 --- a/ChanPivotMonitor.py +++ b/ChanPivotMonitor.py @@ -27,7 +27,7 @@ class ChanPivotMonitor: self._current_bi_count: int = 0 self._current_is_sure: bool = False self._current_state: Optional[dict] = None - self._duration_added_for_zs: set = set() # 已加入窗口的中枢 ID + self._duration_added_for_zs: set = set() # 已加入窗口的中枢 ID(上限 200) # ------------------------------------------------------------------ # Public API @@ -87,7 +87,7 @@ class ChanPivotMonitor: "gg": round(zs.gg, 6), "dd": round(zs.dd, 6), **features, - "start_time": str(zs.start_time) if hasattr(zs, "start_time") and zs.start_time else None, + "start_time": str(t) if (t := getattr(zs, "start_time", None)) else None, } # 中枢刚变为已确认时,将其 duration 加入滚动窗口 diff --git a/bsp_monitor/main.py b/bsp_monitor/main.py index fb997f5..c2fa77f 100644 --- a/bsp_monitor/main.py +++ b/bsp_monitor/main.py @@ -48,6 +48,19 @@ def _bi_id(bi) -> Optional[tuple]: return (bi.start_klc.start_time,) +def _push_bsp(engine: ChanEngine, bsp, symbol: str, name: str) -> bool: + """推送 BSP 到 Telegram(带去重)。""" + if bsp.klc is None: + return False + key = f"{symbol}_{bsp.type}_{bsp.klc.end_time}" + msg = engine.format_bsp_detail(bsp, symbol) + msg = _escape_html(msg) + if send_bsp_alert(msg, bsp_key=key): + logger.info(f"[{name}] ✅ BSP: {key}") + return True + return False + + @dataclass class SymbolState: symbol: str @@ -120,11 +133,7 @@ class BSPMonitor: bsp = engine.get_bsp_for_bi(last_confirmed) if bsp: - key = f"{symbol}_{bsp.type}_{bsp.klc.end_time}" - msg = engine.format_bsp_detail(bsp, symbol) - msg = _escape_html(msg) - if send_bsp_alert(msg, bsp_key=key): - logger.info(f"[{name}] ✅ BSP: {key}") + _push_bsp(engine, bsp, symbol, name) logger.info( f"[{name}] 首次完成 — {len(confirmed)} 笔, " @@ -145,11 +154,7 @@ class BSPMonitor: # 7. 检查刚被分型确认这笔的终点是否为 BSP bsp = engine.get_bsp_for_bi(last_confirmed) if bsp: - key = f"{symbol}_{bsp.type}_{bsp.klc.end_time}" - msg = engine.format_bsp_detail(bsp, symbol) - msg = _escape_html(msg) - if send_bsp_alert(msg, bsp_key=key): - logger.info(f"[{name}] ✅ BSP: {key}") + _push_bsp(engine, bsp, symbol, name) # 8. 中枢特征更新 pivot_state = st.pivot_monitor.update(engine.bi_zs_list) @@ -207,7 +212,7 @@ class BSPMonitor: logger.info(f"Telegram: {'已配置' if BOT_TOKEN and CHAT_ID else '⚠️ 未配置'}") logger.info("=" * 50) - logger.info("首次运行(初始化,不推送)...") + logger.info("首次运行(初始化)...") await self.tick() while True: