유효하지 않은 KEY 가 설정되어 있어도, 일단 UI 페이지가 나오도록 수정.

This commit is contained in:
2026-07-17 00:37:58 +09:00
parent 5d4b9699ba
commit 4e9f912e5f
40 changed files with 93 additions and 12 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+12 -2
View File
@@ -20,9 +20,17 @@ class AccountService:
self._client = httpx.AsyncClient(timeout=10.0)
self._rate_limiter = RateLimiter(settings.rate_limit.requests_per_second)
def _check_auth(self) -> bool:
if not token_manager.is_authenticated:
logger.debug("API 인증되지 않음 - 잔고 조회 불가")
return False
return True
async def get_balance(self) -> dict:
if not self._check_auth():
return {"deposits": [], "stocks": []}
await self._rate_limiter.acquire()
token = await token_manager.get_access_token()
tr_id = _BALANCE_TR_IDS.get(settings.kis.server_mode, "VTTC0311R")
headers = token_manager.get_auth_headers(tr_id)
@@ -71,8 +79,10 @@ class AccountService:
return {"deposits": deposits, "stocks": stocks}
async def get_orderable_amount(self, stock_code: str, price: int) -> dict:
if not self._check_auth():
return {"orderable_amount": 0, "orderable_qty": 0}
await self._rate_limiter.acquire()
token = await token_manager.get_access_token()
headers = token_manager.get_auth_headers("VTTC0830R" if settings.kis.server_mode == "vps" else "TTTC0830R")
params = {
+15 -3
View File
@@ -22,9 +22,17 @@ class MarketDataService:
self._client = httpx.AsyncClient(timeout=10.0)
self._rate_limiter = RateLimiter(settings.rate_limit.requests_per_second)
def _check_auth(self) -> bool:
if not token_manager.is_authenticated:
logger.debug("API 인증되지 않음 - 시세 조회 불가")
return False
return True
async def get_current_price(self, stock_code: str) -> dict:
if not self._check_auth():
return {}
await self._rate_limiter.acquire()
token = await token_manager.get_access_token()
headers = token_manager.get_auth_headers("FHKST01010100")
params = {_FID_COND_MRKT_DIV_CODE: "J", _FID_INPUT_ISCD: stock_code}
url = f"{get_base_url()}{_PRICE_URL}"
@@ -54,8 +62,10 @@ class MarketDataService:
async def get_daily_chart(
self, stock_code: str, start_date: str, end_date: str, count: int = 30
) -> list[dict]:
if not self._check_auth():
return []
await self._rate_limiter.acquire()
token = await token_manager.get_access_token()
headers = token_manager.get_auth_headers("FHKST03010200")
params = {
_FID_COND_MRKT_DIV_CODE: "J",
@@ -88,8 +98,10 @@ class MarketDataService:
return result
async def get_orderbook(self, stock_code: str) -> dict:
if not self._check_auth():
return {}
await self._rate_limiter.acquire()
token = await token_manager.get_access_token()
headers = token_manager.get_auth_headers("FHKST01010200")
params = {_FID_COND_MRKT_DIV_CODE: "J", _FID_INPUT_ISCD: stock_code}
url = f"{get_base_url()}{_ORDERBOOK_URL}"
+15
View File
@@ -23,6 +23,12 @@ class TradingService:
self._client = httpx.AsyncClient(timeout=10.0)
self._rate_limiter = RateLimiter(settings.rate_limit.requests_per_second)
def _check_auth(self) -> bool:
if not token_manager.is_authenticated:
logger.debug("API 인증되지 않음 - 매매 불가")
return False
return True
def _get_tr_id(self, side: str) -> str:
mode = settings.kis.server_mode
return _TR_IDS.get(mode, _TR_IDS["vps"]).get(side, "VTTC0802U")
@@ -35,6 +41,9 @@ class TradingService:
price: int = 0,
order_type: str = "00",
) -> dict:
if not self._check_auth():
return {"rt_cd": "-1", "msg": "API 인증되지 않음", "order_no": ""}
await self._rate_limiter.acquire()
tr_id = self._get_tr_id(side)
@@ -86,6 +95,9 @@ class TradingService:
async def modify_order(
self, order_no: str, stock_code: str, qty: int, price: int, order_type: str = "00"
) -> dict:
if not self._check_auth():
return {"rt_cd": "-1", "msg": "API 인증되지 않음"}
await self._rate_limiter.acquire()
tr_id = self._get_tr_id("modify")
@@ -123,6 +135,9 @@ class TradingService:
return result
async def cancel_order(self, order_no: str, stock_code: str, qty: int) -> dict:
if not self._check_auth():
return {"rt_cd": "-1", "msg": "API 인증되지 않음"}
await self._rate_limiter.acquire()
tr_id = self._get_tr_id("cancel")