""" Streamlit 의 매 rerun 마다 메인 스크립트는 새 namespace 에서 재실행되어 모듈 최상단의 mutable state 가 모두 초기화된다 (`globals()` 가드도 우회됨). 이 파일은 별도 모듈로 단 한 번만 import 되므로 (Python 의 sys.modules 캐싱) state 가 process lifetime 동안 보존된다. 알림 dedup, 진입 추적, 스레드 기동 가드 등 다중 rerun 환경에서 살아남아야 하는 모든 mutable 상태는 여기에 둔다. 알림 스레드는 multi-TF (1m/3m/5m/15m/30m/1h) 동시 모니터링 모드라 dedup 과 진입 추적은 모두 (interval, key) 또는 interval 별로 분리된다. """ import threading # (interval, key) 별 마지막 알림 시각 (cooldown 용). default 0. # 키가 없으면 dict.get 으로 0 fallback. last_alert = {} # (interval, key) 별 마지막으로 알림 보낸 candle open_time (per-candle dedup). last_fired_candle = {} # interval 별 진입 추적. value = entry_record dict 또는 None. long_entry = {} short_entry = {} # forming candle 에서 발사된 알림은 캔들 마감 후 신호 재검증을 받는다. # 마감 시점에 신호가 사라졌으면 [취소 알림] 을 보낸다. # 항목 형식: {"interval", "direction", "candle_time", "msg", "sig_cols"} pending_groups = [] alert_symbol = "BTCUSDT" alert_interval = "5m" # UI 표시용; 알림 스레드는 multi-TF 모니터링이라 무시 alert_lock = threading.Lock() alert_started = False daily_report_started = False last_report_date = None