diff --git a/alert_state.py b/alert_state.py index 801f746..37e33b5 100644 --- a/alert_state.py +++ b/alert_state.py @@ -28,6 +28,11 @@ short_entry = {} # 항목 형식: {"interval", "direction", "candle_time", "msg", "sig_cols"} pending_groups = [] +# 재시작 후 첫 polling 시 alert_state 가 비어있어 tail(3) 의 역사적 신호들이 +# 한꺼번에 발사되는 burst 차단. 첫 처리 시 dedup 상태만 동기화하고 알림은 +# skip. interval 별로 각각 한 번씩 sync. +synced_intervals = set() + alert_symbol = "BTCUSDT" alert_interval = "5m" # UI 표시용; 알림 스레드는 multi-TF 모니터링이라 무시 alert_lock = threading.Lock() diff --git a/app_streamlit.py b/app_streamlit.py index 99fb014..1286558 100644 --- a/app_streamlit.py +++ b/app_streamlit.py @@ -97,6 +97,18 @@ def check_and_alert(df, symbol, interval): return forming_ct = df.iloc[-1]["open_time"] + # 재시작 후 첫 polling — 역사적 신호 burst 차단을 위해 dedup 만 silent sync + if interval not in alert_state.synced_intervals: + for sig, key, _, _ in SIG_DEFS: + if sig not in df.columns: + continue + triggered = df[df[sig].fillna(False)] + if not triggered.empty: + alert_state.last_fired_candle[(interval, key)] = triggered.iloc[-1]["open_time"] + alert_state.synced_intervals.add(interval) + print(f"[알림스레드] {interval} 초기 sync 완료 — 이후 polling 부터 새 신호만 발사") + return + # Phase 1 — pending_groups 검증. forming candle 이라도 매 polling 마다 신호 # 상태 확인. 사라지면 즉시 [취소 알림] (캔들 마감까지 기다리지 않음). new_pending = []