Files
kis_bot/kis_trader/utils/today_trades_cache.py
Your Name 2c7ad867f4 거래 빠르게 안티에서 병신만든거 커서로
feat: Implement backtest source management and enhance candle data handling

Changes:
- Introduced a new function `_apply_backtest_source_env_from_request` to manage the environment variables for candle, tick, and order book sources based on incoming requests.
- Added a teardown function `_teardown_backtest_source_env` to ensure that environment variables do not persist between requests, enhancing the stability of the backtesting environment.
- Refactored existing code to utilize the new source management functions, improving code readability and maintainability.
- Added new utility functions in `bt_candle_source.py` for fetching and managing candle data, ensuring consistency with live trading data sources.

Impact:
- These changes improve the flexibility and reliability of the backtesting framework, allowing for better management of data sources and reducing the risk of cross-request contamination.
2026-08-13 16:03:40 +09:00

65 lines
1.6 KiB
Python

"""당일 trade_history — 프로세스 공유 RAM + TTL.
check_buy·포트가드가 같은 표를 나눠 씀. SELECT 연타·공유 DB 락 대기 완화.
TTL 만료 또는 invalidate 시에만 DB 재조회 (DB 쓰기 아님).
"""
from __future__ import annotations
import threading
import time
from typing import Any, Dict, List, Optional, Tuple
_LOCK = threading.Lock()
_DAY: str = ""
_ROWS: List[Dict] = []
_TS: float = 0.0
def _ttl_sec() -> float:
try:
from .env import get_env_float
return float(get_env_float("TODAY_TRADES_CACHE_TTL_SEC", 1.0) or 1.0)
except Exception:
return 1.0
def invalidate_today_trades_cache() -> None:
"""매수 체결 직후 등 — 다음 get 이 DB 재조회."""
global _DAY, _ROWS, _TS
with _LOCK:
_DAY = ""
_ROWS = []
_TS = 0.0
def get_today_trades_cached(
db: Any,
today: Optional[str] = None,
) -> Tuple[List[Dict], bool, float]:
"""Returns: (rows, from_cache, db_ms).
from_cache=True 이면 DB 미호출.
"""
global _DAY, _ROWS, _TS
from datetime import datetime as dt
day = str(today or dt.now().strftime("%Y%m%d"))
ttl = _ttl_sec()
now = time.time()
with _LOCK:
if _DAY == day and (ttl <= 0 or (now - _TS) < ttl):
return list(_ROWS), True, 0.0
t0 = time.perf_counter()
try:
rows = list(db.get_trades_by_date(day) or [])
except Exception:
rows = []
db_ms = (time.perf_counter() - t0) * 1000.0
with _LOCK:
_DAY = day
_ROWS = rows
_TS = time.time()
return list(rows), False, db_ms