From 8fd47d0926a4f9bdb8ec425b21794cd118360129 Mon Sep 17 00:00:00 2001 From: ILSEON-RYU Date: Mon, 4 May 2026 13:08:05 +0900 Subject: [PATCH] =?UTF-8?q?Forming=20candle=20=EC=9D=98=20=EC=9D=BC?= =?UTF-8?q?=EC=8B=9C=EC=A0=81=20=EC=8B=A0=ED=98=B8=20=EA=B9=9C=EB=B9=A1?= =?UTF-8?q?=EC=9E=84=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20false=20aler?= =?UTF-8?q?t=20=EC=B0=A8=EB=8B=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 사례 2026-05-04 09:38 KST 에 30분봉 [09:30, 10:00) 형성 중 캔들 기준으로 '일반 숏 진입 신호' 알림이 발사되었으나, 09:30 캔들이 close=78,504.90 으로 마감된 후 동일 캔들에 대해 모든 진입 신호가 False 로 확인됨. 즉, 캔들 형성 중 일시적으로 close 가 MA / BB 기준선 아래로 내려간 순간 short_signal 이 잠깐 True 로 떴다가 close 가 위로 회복되며 False 로 전환된 것을 알림 스레드가 그 순간 잡아 발사함. 이후 손절가 알림 ([손절가알림])까지 trail 되어 잘못된 시그널이 두 번 텔레그램에 도착. ## 수정 check_and_alert 의 검사 윈도우를 df.tail(3) 에서 df.iloc[:-1].tail(3) 로 변경. 마지막 행 (= 현재 형성 중 캔들) 을 제외하고 최근 3 개 닫힌 캔들만 검사. close 가 확정된 데이터만 보므로 forming 깜빡임에 속지 않음. 부작용: 알림이 캔들 마감 후 ~30s (다음 polling 주기) 이내로 자연 미뤄짐. accuracy / latency 트레이드오프에서 accuracy 우선이라고 판단. 손절가 도달 체크는 여전히 df.iloc[-1]['close'] (현재가) 사용해서 real-time 반응성 유지. Co-Authored-By: Claude Opus 4.7 (1M context) --- app_streamlit.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app_streamlit.py b/app_streamlit.py index 75c5e66..b0e929c 100644 --- a/app_streamlit.py +++ b/app_streamlit.py @@ -91,7 +91,9 @@ SIG_DEFS = [ def check_and_alert(df, symbol, interval): now = time.time() - recent = df.tail(3) + # 마지막 행은 형성 중(forming) 캔들 — 지표가 close 변동에 따라 깜빡일 수 있어 + # false alert 의 주범. 닫힌 캔들 (최근 3개) 만 신호 검사 대상으로 사용. + recent = df.iloc[:-1].tail(3) eligible = [] for sig, key, sub_label, direction in SIG_DEFS: