일일 리포트 스레드를 긴 sleep -> 60s 폴링 방식으로 변경 + 로깅

## 문제
2026-05-02 00:00 KST 자정에 일일 신호 통계 알림이 발송되지 않았음.
원인 추정: time.sleep(약 2.77h) 같은 긴 sleep 이 Streamlit 의 메인 루프와
함께 돌면서 데몬 스레드가 깨어나지 않았거나, 깨어났더라도 silent 하게
중단됨. send_daily_report 함수 자체를 직접 호출하면 정상 동작 확인.

## 변경
- 짧은 sleep(60s) 폴링 루프로 변경.
- 매 폴링마다 KST 날짜를 확인 → 마지막 발송 날짜와 다르면(=자정 통과) 발송.
- 자정 통과 후 최대 60초 이내 발송 보장.
- 첫 폴링에서는 _last_report_date 를 오늘 날짜로 초기화 (재기동 직후 즉시
  발송되어 사용자가 혼란해지는 것 방지).
- 발송 / 기동 / 오류 시 print 로그 남김.

기존 send_daily_report 함수 자체는 변경 없음.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
ILSEON-RYU
2026-05-02 00:06:57 +09:00
parent 060e592869
commit 057335a173
+15 -6
View File
@@ -736,17 +736,26 @@ def send_daily_report(symbol="BTCUSDT"):
lines.append(f"합계: {passed_all}T {failed_all}F (승률 {rate:.2f}%)")
send_telegram("\n".join(lines))
_last_report_date = None
def _daily_report_loop():
global _last_report_date
while True:
now = datetime.now(timezone.utc) + KST
next_mid = (now + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0)
time.sleep(max(60, (next_mid - now).total_seconds()))
try:
with _alert_lock:
symbol = _alert_symbol
send_daily_report(symbol)
now_kst = (datetime.now(timezone.utc) + KST).replace(tzinfo=None)
today_str = now_kst.strftime("%Y-%m-%d")
if _last_report_date is None:
_last_report_date = today_str
print(f"[일일리포트] 스레드 기동 — 다음 자정({today_str} 24:00 KST) 까지 대기")
elif _last_report_date != today_str:
print(f"[일일리포트] 자정 통과 감지 → 발송 ({today_str})")
with _alert_lock:
symbol = _alert_symbol
send_daily_report(symbol)
_last_report_date = today_str
except Exception as e:
print(f"[일일리포트 스레드 오류] {e}")
time.sleep(60)
# ──────────────────────────────────────────────
# 메인 UI