Files
Bithumb/src/bithumb/data/candle_loader.py
dsyoon 48dcdd0ae8 feat(rsi_dca): 7종 RSI 정액 매수 라이브 전략·모니터 고도화·수집 안정화
RSI DCA 전략 (신규)
- rsi_dca_engine/runner/control: 1분봉 RSI(14) 종목별 기준선 상향 돌파 시 정액 매수,
  일 상한, 신호 45분 유효, 킬스위치, 인터벌 변경 시 커서 재초기화, 체결가 거래소 보정
- scripts: 3_run_rsi_dca(.py/_cron.sh), 백테스트·인터벌 비교, go-live 스위치
- 설정: RSI_DCA_* (모드·종목·기준선·종목별 오버라이드·일 상한 등)

모니터 (vol_live_monitor / vol_monitor_chart)
- 분봉 탭(/api/candles), RSI(14) 패널·종목별 기준선, 3패널 시간축 정렬, KST 표기
- 자동매수 ON/OFF 패널(/api/rsi/status·toggle), 빌드 해시 기반 자동 새로고침, 지연 경고
- 요약표: 거래소 평균매입가 기준 보유원금·수익률, 총평가 손익, 수익률순 동적 정렬
- 잔고 스냅샷을 계좌 전체 조회 1회로 통합, 실시간 시세 반영

데이터·수집
- candle_store/loader: SQL 범위·LIMIT 조회로 대형 테이블 전량 스캔 제거
- 절전·재부팅 후 공백 자동 백필(gap_backfill, 00_backfill_gaps) 및 cron 연동
- 수집 cron 분할(매분 핵심 분봉·5분 전체), 프로젝트 한정 lock 패턴, exec 제거로 lock 정리 복구
- 모니터 종목(VOL_MONITOR_SYMBOLS)·수집 종목 7종 분리, 한글 코인명 추가

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 18:30:31 +09:00

64 lines
1.7 KiB
Python

"""SQLite 캔들 조회."""
from __future__ import annotations
from datetime import timedelta
from pathlib import Path
import pandas as pd
from bithumb.data.candle_store import CandleStore
def load_candles(
db_path: Path | str,
symbol: str,
interval_min: int,
lookback_days: int | None = None,
) -> pd.DataFrame:
"""DB에서 캔들 DataFrame을 로드한다.
Args:
db_path: SQLite 경로.
symbol: 코인 심볼 (예: TRX).
interval_min: 분 단위 인터벌 코드.
lookback_days: 최근 N일만 사용. None이면 전체.
Returns:
``datetime``, ``open``, ``high``, ``low``, ``close``, ``volume`` 컬럼.
시간 오름차순 정렬.
"""
store = CandleStore(db_path)
try:
since = None
if lookback_days is not None and lookback_days > 0:
_, _, db_max = store.get_range(symbol, interval_min)
if db_max is not None:
since = db_max - timedelta(days=lookback_days)
df = store.read_dataframe(symbol, interval_min, since=since)
finally:
store.close()
if df.empty:
return df
if lookback_days is not None and lookback_days > 0:
cutoff = df["datetime"].max() - timedelta(days=lookback_days)
df = df[df["datetime"] >= cutoff].reset_index(drop=True)
return df
def load_last_candles(
db_path: Path | str,
symbol: str,
interval_min: int,
last_n: int,
) -> pd.DataFrame:
"""최신 N봉만 로드 (차트 API용, SQL LIMIT)."""
store = CandleStore(db_path)
try:
return store.read_dataframe(symbol, interval_min, last_n=int(last_n))
finally:
store.close()