65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
from pydantic import BaseModel
|
|
from typing import Literal
|
|
|
|
from app.services.kis_client import kis_client
|
|
import logging
|
|
|
|
router = APIRouter()
|
|
logger = logging.getLogger("KisAPI")
|
|
|
|
class OrderRequest(BaseModel):
|
|
market: Literal["Domestic", "Overseas"]
|
|
side: Literal["buy", "sell"]
|
|
code: str
|
|
quantity: int
|
|
price: float = 0 # 0 for Market Price (if supported)
|
|
|
|
class ModifyOrderRequest(BaseModel):
|
|
market: Literal["Domestic", "Overseas"]
|
|
order_no: str
|
|
code: str
|
|
quantity: int
|
|
price: float = 0
|
|
type: str = "00"
|
|
is_cancel: bool = False # True = Cancel, False = Modify
|
|
|
|
@router.get("/price")
|
|
async def get_current_price(market: Literal["Domestic", "Overseas"], code: str):
|
|
"""
|
|
Get Real-time Price (REST). Prefer WebSocket for streaming.
|
|
"""
|
|
try:
|
|
price = await kis_client.get_current_price(market, code)
|
|
return {"code": code, "price": price}
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
@router.get("/balance")
|
|
async def get_balance(market: Literal["Domestic", "Overseas"]):
|
|
try:
|
|
data = await kis_client.get_balance(market)
|
|
return data
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
@router.put("/order")
|
|
async def modify_order(req: ModifyOrderRequest):
|
|
logger.info(f"Received Modify/Cancel Request: {req}")
|
|
try:
|
|
res = await kis_client.modify_order(
|
|
req.market, req.order_no, req.code, req.quantity, req.price, req.type, req.is_cancel
|
|
)
|
|
return res
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
@router.post("/order")
|
|
async def place_order(order: OrderRequest):
|
|
logger.info(f"Received Order Request: {order}")
|
|
try:
|
|
res = await kis_client.place_order(order.market, order.side, order.code, order.quantity, order.price)
|
|
return res
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=str(e))
|