feat(v3.2): DailyLedger + RiskGate + news_snapshot + backtest_runner
- DailyLedger: 당일 매수 회계 + 연속 손절 카운터 + 매수 신호 점수 한 객체로 집약 (bot.py 정리) - RiskGate: 테마당 동시 보유 + 노출 비율 상한 검증 (포트폴리오 레벨) - news_snapshot: 뉴스 SQLite 영구 저장 + 사후 감성 재검증 인프라 - backtest_runner: 전 종목 KIS 일봉 기반 백테스트 (Sharpe/MDD/Calmar) - bot.py 274 line 정리 (DailyLedger 분리) - backtest.py 173 line 재작성 (v3.2 next-bar 체결 + 거래세) - daily_launcher.py 폐기 (warmup_and_restart 통합) - .gitignore: .claude/ 제외 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,4 @@
|
||||
import os
|
||||
import signal
|
||||
import threading
|
||||
import uvicorn
|
||||
import multiprocessing
|
||||
from fastapi import FastAPI, Request
|
||||
@@ -24,11 +22,11 @@ news_collector = None
|
||||
watchdog = None
|
||||
|
||||
|
||||
def run_trading_bot(ipc_lock, command_queue, shutdown_event, eod_event=None):
|
||||
def run_trading_bot(ipc_lock, command_queue, shutdown_event):
|
||||
"""트레이딩 봇 실행 래퍼"""
|
||||
ProcessTracker.register("Trading Bot Main")
|
||||
bot = AutoTradingBot(ipc_lock=ipc_lock, command_queue=command_queue,
|
||||
shutdown_event=shutdown_event, eod_event=eod_event)
|
||||
shutdown_event=shutdown_event)
|
||||
bot.loop()
|
||||
|
||||
|
||||
@@ -56,12 +54,11 @@ async def lifespan(app: FastAPI):
|
||||
ipc_lock = multiprocessing.Lock()
|
||||
command_queue = multiprocessing.Queue()
|
||||
shutdown_event = multiprocessing.Event()
|
||||
eod_event = multiprocessing.Event() # [v3.1] EOD 셧다운 시그널
|
||||
|
||||
print("[Server] Starting AI Trading Bot & Telegram Bot...")
|
||||
|
||||
# 5. 자식 프로세스 생성
|
||||
bot_args = (ipc_lock, command_queue, shutdown_event, eod_event)
|
||||
bot_args = (ipc_lock, command_queue, shutdown_event)
|
||||
telegram_args = (ipc_lock, command_queue, shutdown_event)
|
||||
|
||||
bot_process = multiprocessing.Process(
|
||||
@@ -81,25 +78,6 @@ async def lifespan(app: FastAPI):
|
||||
|
||||
messenger.send_message("[Server Started] Windows AI Server Online.")
|
||||
|
||||
# [v3.1] EOD 모니터 스레드: 봇이 EOD 시그널을 보내면 서버 프로세스 자동 종료
|
||||
_server_pid = os.getpid()
|
||||
|
||||
def _eod_monitor():
|
||||
"""eod_event 감지 시 SIGTERM으로 uvicorn 우아하게 종료"""
|
||||
while not shutdown_event.is_set():
|
||||
if eod_event.is_set():
|
||||
print("[Server] EOD 시그널 수신 — 서버 종료 중 (15초 후)...")
|
||||
import time as _time
|
||||
_time.sleep(15) # 자식 프로세스 정리 시간
|
||||
print(f"[Server] SIGTERM → PID {_server_pid}")
|
||||
os.kill(_server_pid, signal.SIGTERM)
|
||||
return
|
||||
import time as _time
|
||||
_time.sleep(5)
|
||||
|
||||
_eod_thread = threading.Thread(target=_eod_monitor, daemon=True, name="EODMonitor")
|
||||
_eod_thread.start()
|
||||
|
||||
yield
|
||||
|
||||
# [Shutdown]
|
||||
|
||||
Reference in New Issue
Block a user