배치 실계좌에서 종목조회로 변경
This commit is contained in:
@@ -97,7 +97,41 @@ class KoreaInvestmentAPI:
|
||||
|
||||
# 토큰 캐시 파일 경로 — 사용자 홈 디렉토리 하위에 저장 (/tmp는 보안 취약)
|
||||
TOKEN_CACHE_FILE = Path.home() / ".cache" / "auto-stock" / "kis_token_cache.json"
|
||||
|
||||
|
||||
@classmethod
|
||||
def for_real_market_data(cls) -> "KoreaInvestmentAPI":
|
||||
"""실계좌 자격증명으로 시세조회 전용 인스턴스 생성.
|
||||
|
||||
모의투자 모드에서도 실계좌 API로 시세를 조회할 때 사용한다.
|
||||
(모의투자 서버는 KOSDAQ 거래량 순위 등 일부 조회 API를 지원하지 않음)
|
||||
주문 API는 절대 호출하지 말 것.
|
||||
"""
|
||||
if not settings.KIS_REAL_APP_KEY:
|
||||
raise ValueError("KIS_REAL_APP_KEY가 설정되지 않아 실계좌 시세조회를 사용할 수 없습니다.")
|
||||
instance = cls.__new__(cls)
|
||||
instance.base_url = settings.KIS_REAL_URL
|
||||
instance.app_key = settings.KIS_REAL_APP_KEY
|
||||
instance.app_secret = settings.KIS_REAL_APP_SECRET
|
||||
instance.account_number = settings.KIS_REAL_ACCOUNT_NO
|
||||
instance.access_token = None
|
||||
instance.token_expires_at = None
|
||||
instance.last_request_time = None
|
||||
instance.TOKEN_CACHE_FILE = Path.home() / ".cache" / "auto-stock" / "kis_token_cache_real.json"
|
||||
instance.min_request_interval = settings.API_MIN_REQUEST_INTERVAL
|
||||
instance.max_retries = settings.API_MAX_RETRIES
|
||||
instance.retry_delay = settings.API_RETRY_DELAY
|
||||
instance.retry_backoff = settings.API_RETRY_BACKOFF
|
||||
instance.timeout = settings.API_TIMEOUT
|
||||
instance.semaphore = asyncio.Semaphore(settings.API_MAX_CONCURRENT_REQUESTS)
|
||||
instance._token_lock = asyncio.Lock()
|
||||
instance.monitor = APICallMonitor(window_size=settings.API_MONITORING_WINDOW)
|
||||
logger.info(
|
||||
"🔧 KIS 실계좌 시세조회 API 초기화: base_url=%s, app_key=%s...",
|
||||
instance.base_url, instance.app_key[:6]
|
||||
)
|
||||
instance._load_token_from_cache()
|
||||
return instance
|
||||
|
||||
def __init__(self):
|
||||
self.base_url = settings.KOREA_INVESTMENT_API_BASE_URL
|
||||
self.app_key = settings.KOREA_INVESTMENT_APP_KEY
|
||||
@@ -106,20 +140,20 @@ class KoreaInvestmentAPI:
|
||||
self.access_token: Optional[str] = None
|
||||
self.token_expires_at: Optional[datetime] = None
|
||||
self.last_request_time: Optional[float] = None
|
||||
|
||||
|
||||
# 설정 기반 쓰로틀링 파라미터
|
||||
self.min_request_interval = settings.API_MIN_REQUEST_INTERVAL # 기본 0.5초 (초당 2회)
|
||||
self.max_retries = settings.API_MAX_RETRIES # 기본 3회
|
||||
self.retry_delay = settings.API_RETRY_DELAY # 기본 1.5초
|
||||
self.retry_backoff = settings.API_RETRY_BACKOFF # 기본 2.0배
|
||||
self.timeout = settings.API_TIMEOUT # 기본 30초
|
||||
|
||||
|
||||
# 동시 요청 제한 (세마포어)
|
||||
self.semaphore = asyncio.Semaphore(settings.API_MAX_CONCURRENT_REQUESTS)
|
||||
|
||||
|
||||
# 토큰 발급 Lock (중복 발급 방지)
|
||||
self._token_lock = asyncio.Lock()
|
||||
|
||||
|
||||
# 모니터링
|
||||
self.monitor = APICallMonitor(window_size=settings.API_MONITORING_WINDOW)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user