From 4eee610b5de339f915c40cab9abaf025f9b19a31 Mon Sep 17 00:00:00 2001 From: jongjae Date: Mon, 18 May 2026 15:35:32 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95=20-=201?= =?UTF-8?q?4:00=20=EC=9D=B4=ED=9B=84=20=EC=8B=A0=EA=B7=9C=20=EC=A7=84?= =?UTF-8?q?=EC=9E=85=20=EC=B0=A8=EB=8B=A8=C2=B7SL=20=EC=9E=AC=EC=A7=84?= =?UTF-8?q?=EC=9E=85=20=EC=B0=A8=EB=8B=A8=20=EC=9E=AC=EC=8B=9C=EC=9E=91=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check_entries 진입 시 현재 시간 재확인 추가 _restore_sl_tickers_from_db 추가: 봇 재시작 시 당일 SL 종목 복원 일일 리포트 bug11·12 내용 반영 --- app/main.py | 18 ++++++++++++++++++ reports/daily/2026-05-18.md | 4 +++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/main.py b/app/main.py index c061560..43a942b 100644 --- a/app/main.py +++ b/app/main.py @@ -107,6 +107,8 @@ class StockBot: # DB에서 열린 포지션 복원 (재시작 시) self._restore_positions_from_db() + # 당일 SL 종목 복원 (재시작 후에도 재진입 차단 유지) + self._restore_sl_tickers_from_db() await send(f"[시작] 단타봇 가동 | 예수금: {cash:,}원 | " f"{'모의투자' if self.kis.is_mock else '실거래'}") @@ -131,6 +133,19 @@ class StockBot: if self.positions: logger.info(f"DB 포지션 복원: {list(self.positions.keys())}") + def _restore_sl_tickers_from_db(self): + """재시작 시 당일 SL 종목 복원 — 재진입 차단 유지""" + today = datetime.now().strftime("%Y-%m-%d") + with get_conn() as conn: + rows = conn.execute( + "SELECT DISTINCT ticker FROM trades WHERE date=? AND exit_reason='SL'", + (today,) + ).fetchall() + for (ticker,) in rows: + self.sl_tickers.add(ticker) + if self.sl_tickers: + logger.info(f"당일 SL 종목 복원(재진입 차단): {self.sl_tickers}") + def _db_save_position(self, ticker: str, pos: dict, target_price: float): with get_conn() as conn: conn.execute(""" @@ -296,6 +311,9 @@ class StockBot: async def check_entries(self): """유니버스 전체 진입 신호 확인""" + # check_exits 처리 중 14:00을 넘었을 경우 진입 차단 + if datetime.now().strftime("%H:%M") > "14:00": + return for ticker in self.universe: if ticker in self.positions: continue diff --git a/reports/daily/2026-05-18.md b/reports/daily/2026-05-18.md index 2158a8e..16a5b52 100644 --- a/reports/daily/2026-05-18.md +++ b/reports/daily/2026-05-18.md @@ -85,6 +85,8 @@ ETF 필터 미적용 상태라 인버스/레버리지 ETF가 다수 포함됨. | 8 | 중복 봇 프로세스 미종료 | PID 파일 + `Get-CimInstance` 이중 종료 | | 9 | `daily_summary` DB 미저장 | `daily_summary()` 에서 테이블 INSERT 추가 | | 10 | 장중 재시작 시 15:10 결산 미실행 | `trading_loop()` 후 15:10까지 대기 루프 추가 | +| 11 | **14:00 이후 신규 진입 차단 미작동** | `check_entries()` 진입 시 현재 시간 재확인 추가 — `check_exits()` 처리 중 14:00 경과 케이스 차단 | +| 12 | **봇 재시작 시 SL 종목 재진입 차단 초기화** | `_restore_sl_tickers_from_db()` 추가 — 재시작 후 당일 SL 종목 DB 복원으로 재진입 차단 유지 | --- @@ -146,4 +148,4 @@ ETF 필터 미적용 상태라 인버스/레버리지 ETF가 다수 포함됨. 4. L3 (3연속 손절) 차단 로직 실제 동작 여부 5. morning 스케줄러 (08:15) 자동 실행 여부 확인 6. 15:10 결산 정상 실행 및 `daily_summary` 테이블 저장 확인 -7. 14:00 이후 신규 진입 제한 검토 (오후 반복 진입 → 손실 패턴) +7. ~~14:00 이후 신규 진입 제한 검토~~ → **수정 완료** (bug #11·#12 fix)