추천로직
This commit is contained in:
@@ -511,6 +511,76 @@ class KoreaInvestmentAPI:
|
||||
logger.error(f"Error fetching paginated chart for {stock_code}: {e}")
|
||||
raise
|
||||
|
||||
async def get_daily_ohlcv_range(
|
||||
self, stock_code: str, start_date: str, end_date: str
|
||||
) -> list:
|
||||
"""날짜 범위 일봉 OHLCV 전체 조회 (FHKST03010100)
|
||||
|
||||
KIS API는 1회 최대 100행 반환 → 날짜를 소급하며 start_date까지 전부 수집.
|
||||
|
||||
Args:
|
||||
stock_code: 종목코드 (예: "005930")
|
||||
start_date: 조회 시작일 YYYYMMDD
|
||||
end_date: 조회 종료일 YYYYMMDD
|
||||
|
||||
Returns:
|
||||
[{"stck_bsop_date": "20240101", "stck_oprc": ..., "stck_hgpr": ...,
|
||||
"stck_lwpr": ..., "stck_clpr": ..., "acml_vol": ..., "prdy_ctrt": ...}, ...]
|
||||
최신 → 오래된 순 정렬 (KIS API 기본값)
|
||||
"""
|
||||
all_data: list = []
|
||||
current_end = end_date
|
||||
|
||||
while True:
|
||||
params = {
|
||||
"FID_COND_MRKT_DIV_CODE": "J",
|
||||
"FID_INPUT_ISCD": stock_code,
|
||||
"FID_INPUT_DATE_1": start_date,
|
||||
"FID_INPUT_DATE_2": current_end,
|
||||
"FID_PERIOD_DIV_CODE": "D",
|
||||
"FID_ORG_ADJ_PRC": "0", # 수정주가
|
||||
}
|
||||
try:
|
||||
result, _ = await self._make_request(
|
||||
"GET",
|
||||
"/uapi/domestic-stock/v1/quotations/inquire-daily-itemchartprice",
|
||||
"FHKST03010100",
|
||||
params=params,
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.error(
|
||||
"get_daily_ohlcv_range %s %s~%s 실패: %s",
|
||||
stock_code, start_date, current_end, exc,
|
||||
)
|
||||
break
|
||||
|
||||
if not result or result.get("rt_cd") != "0":
|
||||
logger.warning(
|
||||
"get_daily_ohlcv_range %s: %s",
|
||||
stock_code, result.get("msg1") if result else "no response",
|
||||
)
|
||||
break
|
||||
|
||||
output = result.get("output2") or []
|
||||
if not output:
|
||||
break
|
||||
|
||||
all_data.extend(output)
|
||||
|
||||
# 가장 오래된 행의 날짜를 확인하고 그보다 하루 전으로 소급
|
||||
oldest_date = output[-1].get("stck_bsop_date", "")
|
||||
if not oldest_date or oldest_date <= start_date:
|
||||
break
|
||||
|
||||
oldest_dt = datetime.strptime(oldest_date, "%Y%m%d")
|
||||
current_end = (oldest_dt - timedelta(days=1)).strftime("%Y%m%d")
|
||||
if current_end < start_date:
|
||||
break
|
||||
|
||||
await asyncio.sleep(self.min_request_interval)
|
||||
|
||||
return all_data
|
||||
|
||||
async def get_overseas_price(self, symbol: str, exchange_code: str = "NASD") -> Dict[str, Any]:
|
||||
"""해외주식 현재가 조회 (NASD, NYSE, AMEX)"""
|
||||
try:
|
||||
@@ -975,7 +1045,7 @@ class KoreaInvestmentAPI:
|
||||
"FID_BLNG_CLS_CODE": "0",
|
||||
"FID_TRGT_CLS_CODE": "111111111",
|
||||
"FID_TRGT_EXLS_CLS_CODE": "000000",
|
||||
"FID_INPUT_PRICE_1": "",
|
||||
"FID_INPUT_PRICE_1": "5000", # 5,000원 이상 종목만 조회
|
||||
"FID_INPUT_PRICE_2": "",
|
||||
"FID_VOL_CNT": "",
|
||||
"FID_INPUT_DATE_1": ""
|
||||
@@ -1032,3 +1102,10 @@ class KoreaInvestmentAPI:
|
||||
|
||||
# 싱글톤 인스턴스
|
||||
korea_investment_api = KoreaInvestmentAPI()
|
||||
|
||||
# 실계좌 시세조회 전용 싱글톤 (KIS_REAL_APP_KEY 설정 시 초기화)
|
||||
# 모의투자 모드에서도 시세/차트/종목 조회는 실계좌 API를 사용한다.
|
||||
try:
|
||||
real_market_api = KoreaInvestmentAPI.for_real_market_data()
|
||||
except Exception:
|
||||
real_market_api = None
|
||||
|
||||
Reference in New Issue
Block a user