과거 거래 기록 조회 추가
좌측 사이드메뉴 추가 ggitignore 업데이트 : *.pyc
This commit is contained in:
+86
-2
@@ -11,10 +11,23 @@ logger = setup_logger("trading")
|
||||
|
||||
_ORDER_URL = "/uapi/domestic-stock/v1/trading/order-cash"
|
||||
_MODIFY_CANCEL_URL = "/uapi/domestic-stock/v1/trading/order-rvsecncl"
|
||||
_DAILY_CCLED_URL = "/uapi/domestic-stock/v1/trading/inquire-daily-ccld"
|
||||
|
||||
_TR_IDS = {
|
||||
"real": {"buy": "TTTC0802U", "sell": "TTTC0801U", "modify": "TTTC0803U", "cancel": "TTTC0804U"},
|
||||
"vps": {"buy": "VTTC0802U", "sell": "VTTC0801U", "modify": "VTTC0803U", "cancel": "VTTC0804U"},
|
||||
"real": {
|
||||
"buy": "TTTC0802U",
|
||||
"sell": "TTTC0801U",
|
||||
"modify": "TTTC0803U",
|
||||
"cancel": "TTTC0804U",
|
||||
"daily_ccled": "TTTC0012R",
|
||||
},
|
||||
"vps": {
|
||||
"buy": "VTTC0802U",
|
||||
"sell": "VTTC0801U",
|
||||
"modify": "VTTC0803U",
|
||||
"cancel": "VTTC0804U",
|
||||
"daily_ccled": "VTTC0012R",
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -173,6 +186,77 @@ class TradingService:
|
||||
|
||||
return result
|
||||
|
||||
async def get_daily_ccled(
|
||||
self,
|
||||
start_date: str,
|
||||
end_date: str,
|
||||
stock_code: str = "",
|
||||
ccled_dvsn: str = "0",
|
||||
) -> list[dict]:
|
||||
"""KIS API 일일 체결 내역 조회"""
|
||||
if not self._check_auth():
|
||||
return []
|
||||
|
||||
await self._rate_limiter.acquire()
|
||||
|
||||
tr_id = _TR_IDS.get(settings.kis.server_mode, _TR_IDS["vps"])["daily_ccled"]
|
||||
headers = token_manager.get_auth_headers(tr_id)
|
||||
|
||||
params = {
|
||||
"CANO": settings.kis.account_no,
|
||||
"ACNT_PRDT_CD": settings.kis.account_code,
|
||||
"FH_PDNO": stock_code,
|
||||
"CCLD_DVSN": ccled_dvsn,
|
||||
"INQR_STRT_DAY": start_date,
|
||||
"INQR_END_DAY": end_date,
|
||||
"WCRC_FRCR_DVSN": "0",
|
||||
"CTAC_TLNO": "",
|
||||
"MKET_ID": "",
|
||||
}
|
||||
|
||||
url = f"{get_base_url()}{_DAILY_CCLED_URL}"
|
||||
resp = await self._client.get(url, headers=headers, params=params)
|
||||
resp.raise_for_status()
|
||||
data = resp.json()
|
||||
|
||||
if data.get("rt_cd") != "0":
|
||||
logger.warning("일일 체결 내역 조회 실패: %s", data.get("msg1"))
|
||||
return []
|
||||
|
||||
trades = []
|
||||
for item in data.get("output", []):
|
||||
qty = int(item.get("ft_ccld_qty", 0))
|
||||
if qty == 0:
|
||||
continue
|
||||
|
||||
side_code = item.get("sll_buy_dvsn_cd", "")
|
||||
if side_code in ("02", "06"):
|
||||
side = "sell"
|
||||
elif side_code in ("01", "03"):
|
||||
side = "buy"
|
||||
else:
|
||||
side = "buy" if side_code == "01" else "sell"
|
||||
|
||||
trades.append({
|
||||
"order_no": item.get("ord_gno_brno", ""),
|
||||
"stock_code": item.get("pdno", ""),
|
||||
"stock_name": item.get("prdt_name", ""),
|
||||
"side": side,
|
||||
"qty": qty,
|
||||
"price": int(float(item.get("ft_ccld_unpr3", 0))),
|
||||
"order_type": item.get("ord_dvsn", "00"),
|
||||
"status": "filled",
|
||||
"order_amount": float(item.get("ft_ord_amt", 0)),
|
||||
"settlement_amount": float(item.get("ft_ccld_amt", 0)),
|
||||
"tax": float(item.get("sttl_evlu_amt", 0)),
|
||||
"commission": float(item.get("ft_lof_ruse_amt", 0)),
|
||||
"created_at": item.get("ord_sttm", ""),
|
||||
"filled_at": item.get("ft_ccld_no", ""),
|
||||
})
|
||||
|
||||
logger.info("일일 체결 내역 조회: %d건", len(trades))
|
||||
return trades
|
||||
|
||||
async def close(self) -> None:
|
||||
await self._client.aclose()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user