From 138bf494db3f4d7d65cb83d676b1d049964d0aa9 Mon Sep 17 00:00:00 2001 From: shuim Date: Mon, 23 Feb 2026 09:02:30 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 3 ++- .gitignore | 1 + backend/app/main.py | 2 +- backend/app/services/loss_tracker.py | 10 +++++----- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 2a21c1e..6b34a99 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -18,7 +18,8 @@ "Bash(pip install:*)", "Bash(python -c:*)", "Bash(git pull:*)", - "Bash(git stash:*)" + "Bash(git stash:*)", + "Bash(git -C /Users/commylife/myproject/java/workspace/auto-stock ls-files)" ] }, "enableAllProjectMcpServers": true, diff --git a/.gitignore b/.gitignore index 2ffb878..8b642e5 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,4 @@ summary_output.json # Virtual environments .venv/ +.venv/ diff --git a/backend/app/main.py b/backend/app/main.py index d5d4256..1364eb7 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -205,7 +205,7 @@ async def lifespan(app: FastAPI): try: from app.models.models import StockAnalysis, TradeHistory, Portfolio from sqlalchemy import delete - from datetime import date, timedelta + from datetime import datetime, date, timedelta async with AsyncSessionLocal() as session: _kst = pytz.timezone("Asia/Seoul") diff --git a/backend/app/services/loss_tracker.py b/backend/app/services/loss_tracker.py index e3687c3..6ef6f00 100644 --- a/backend/app/services/loss_tracker.py +++ b/backend/app/services/loss_tracker.py @@ -5,7 +5,7 @@ 재시작 후에도 ban 상태 유지: DB(stock_bans 테이블) 영속화. """ import logging -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from typing import Dict, Optional logger = logging.getLogger(__name__) @@ -39,7 +39,7 @@ class ConsecutiveLossTracker: if is_loss: entry["consecutive_losses"] += 1 if entry["consecutive_losses"] >= self.ban_count: - entry["ban_until"] = datetime.now() + timedelta(days=self.ban_calendar_days) + entry["ban_until"] = datetime.now(timezone.utc) + timedelta(days=self.ban_calendar_days) logger.warning( f"{stock_code}: {entry['consecutive_losses']}회 연속 손실 → " f"{entry['ban_until'].strftime('%Y-%m-%d')}까지 진입 금지" @@ -71,7 +71,7 @@ class ConsecutiveLossTracker: else: record.consecutive_losses = entry["consecutive_losses"] record.ban_until = entry["ban_until"] - record.updated_at = datetime.now() + record.updated_at = datetime.now(timezone.utc) await db.commit() logger.debug(f"loss_tracker DB 저장 완료: {stock_code}") @@ -87,7 +87,7 @@ class ConsecutiveLossTracker: result = await db.execute(select(StockBan)) records = result.scalars().all() - now = datetime.now() + now = datetime.now(timezone.utc) loaded = 0 for rec in records: # 만료된 ban은 초기화 @@ -117,7 +117,7 @@ class ConsecutiveLossTracker: entry = self._tracker.get(stock_code) if not entry or not entry["ban_until"]: return False - if datetime.now() >= entry["ban_until"]: + if datetime.now(timezone.utc) >= entry["ban_until"]: # 금지 기간 만료 → 리셋 entry["consecutive_losses"] = 0 entry["ban_until"] = None