"백엔드_핵심_로직_구현_프론트엔드_연동_및_도커_배포_최적화_완료"
This commit is contained in:
100
backend/app/api/endpoints/trade.py
Normal file
100
backend/app/api/endpoints/trade.py
Normal file
@@ -0,0 +1,100 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy import select
|
||||
from typing import List
|
||||
from pydantic import BaseModel
|
||||
from datetime import datetime
|
||||
|
||||
from app.db.database import get_db
|
||||
from app.db.models import TradeHistory, AutoTradeRobot, ReservedOrder
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
# --- Schemas ---
|
||||
class TradeOrderSchema(BaseModel):
|
||||
id: str
|
||||
stockName: str
|
||||
type: str
|
||||
quantity: int
|
||||
price: float
|
||||
timestamp: datetime
|
||||
status: str
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
class ReservedOrderSchema(BaseModel):
|
||||
id: str
|
||||
stockName: str
|
||||
stockCode: str
|
||||
monitoringType: str
|
||||
status: str
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
class CreateReservedOrderRequest(BaseModel):
|
||||
stockCode: str
|
||||
stockName: str
|
||||
monitoringType: str # PRICE_TRIGGER
|
||||
triggerPrice: float
|
||||
orderType: str # BUY, SELL
|
||||
quantity: int
|
||||
price: float = 0 # Limit price (0 = Market)
|
||||
|
||||
# Trailing Stop Options
|
||||
trailingType: str | None = None # AMOUNT, PERCENT
|
||||
trailingValue: float | None = None
|
||||
stopLossValue: float | None = None
|
||||
|
||||
class ReservedOrderResponse(BaseModel):
|
||||
id: str
|
||||
status: str
|
||||
|
||||
# --- Endpoints ---
|
||||
|
||||
@router.get("/history/orders", response_model=List[TradeOrderSchema])
|
||||
async def get_trade_history(limit: int = 100, db: AsyncSession = Depends(get_db)):
|
||||
stmt = select(TradeHistory).order_by(TradeHistory.timestamp.desc()).limit(limit)
|
||||
result = await db.execute(stmt)
|
||||
return result.scalars().all()
|
||||
|
||||
@router.get("/reserved-orders", response_model=List[ReservedOrderSchema])
|
||||
async def get_reserved_orders(db: AsyncSession = Depends(get_db)):
|
||||
stmt = select(ReservedOrder)
|
||||
result = await db.execute(stmt)
|
||||
return result.scalars().all()
|
||||
|
||||
@router.post("/reserved-orders")
|
||||
async def create_reserved_order(req: CreateReservedOrderRequest, db: AsyncSession = Depends(get_db)):
|
||||
import uuid
|
||||
new_id = str(uuid.uuid4())
|
||||
|
||||
order = ReservedOrder(
|
||||
id=new_id,
|
||||
stockCode=req.stockCode,
|
||||
stockName=req.stockName,
|
||||
monitoringType=req.monitoringType,
|
||||
triggerPrice=req.triggerPrice,
|
||||
type=req.orderType, # BUY/SELL
|
||||
quantity=req.quantity,
|
||||
price=req.price,
|
||||
|
||||
# TS Fields
|
||||
trailingType=req.trailingType,
|
||||
trailingValue=req.trailingValue,
|
||||
stopLossValue=req.stopLossValue,
|
||||
highestPrice=0, # Init
|
||||
lowestPrice=99999999, # Init
|
||||
|
||||
status="MONITORING",
|
||||
created_at=datetime.now()
|
||||
)
|
||||
db.add(order)
|
||||
await db.commit()
|
||||
return {"id": new_id, "status": "MONITORING"}
|
||||
|
||||
@router.delete("/reserved-orders/{order_id}")
|
||||
async def delete_reserved_order(order_id: str, db: AsyncSession = Depends(get_db)):
|
||||
from sqlalchemy import delete
|
||||
await db.execute(delete(ReservedOrder).where(ReservedOrder.id == order_id))
|
||||
await db.commit()
|
||||
return {"status": "Deleted"}
|
||||
Reference in New Issue
Block a user