Files
tradeing/alert_state.py
T
ILSEON-RYU 1ecd6241f2 Forming candle 진입 신호 안정성 요구 — 2 polls 연속 True 만 발사
## 문제
forming candle 동안 close 변동에 따라 신호 컬럼이 1폴링 동안 True →
다음 폴링 False 로 깜빡이는 케이스 다수. 1회 True 만으로 진입 알림
발사되어 곧바로 [취소 알림] 도착하는 패턴 반복. 사용자 22:04
5m/15m 취소 알림 폭주 사례.

## 수정
신호별 (interval, sig) 키로 연속 True polling 카운트 추적.
- forming candle 의 신호는 count >= 2 (= 60s 안정 유지) 일 때만 발사
- closed candle 의 신호는 1회로 즉시 발사 (data 확정이라 깜빡 X)
- 신호 False 로 바뀌면 count 리셋 (연속성 보장)
- per-candle dedup 와 cooldown 은 그대로 위에 적용

## 효과
- forming 깜빡 1회는 더 이상 알림 발사 X → false alert + 취소 알림 동반
  감소
- 진짜 신호는 2폴링 (60s) 동안 안정 유지하므로 통과 → latency 증가
  최대 30s
- 닫힌 캔들 알림은 latency 변화 없음

## 추적 state (alert_state.signal_seen_count)
{(interval, sig): {"candle_time": ts, "count": int}}
새 candle 진입 시 자동 리셋. False 시 카운트 0 으로 리셋.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 22:12:43 +09:00

47 lines
2.0 KiB
Python

"""
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 = []
# 재시작 후 첫 polling 시 alert_state 가 비어있어 tail(3) 의 역사적 신호들이
# 한꺼번에 발사되는 burst 차단. 첫 처리 시 dedup 상태만 동기화하고 알림은
# skip. interval 별로 각각 한 번씩 sync.
synced_intervals = set()
# (interval, sig) 별 forming candle 의 연속 True polling 카운트.
# 진입 신호가 forming 중 1회 깜빡으로 발사되는 false alert 차단용.
# 항목 형식: {(interval, sig): {"candle_time": ts, "count": int}}
signal_seen_count = {}
alert_symbol = "BTCUSDT"
alert_interval = "5m" # UI 표시용; 알림 스레드는 multi-TF 모니터링이라 무시
alert_lock = threading.Lock()
alert_started = False
daily_report_started = False
last_report_date = None