39 lines
1.3 KiB
Python
39 lines
1.3 KiB
Python
"""S/R Levels router — support/resistance detection endpoints."""
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.dependencies import get_db, require_access
|
|
from app.schemas.common import APIEnvelope
|
|
from app.schemas.sr_level import SRLevelResponse, SRLevelResult
|
|
from app.services.sr_service import get_sr_levels
|
|
|
|
router = APIRouter(tags=["sr-levels"])
|
|
|
|
|
|
@router.get("/sr-levels/{symbol}", response_model=APIEnvelope)
|
|
async def read_sr_levels(
|
|
symbol: str,
|
|
tolerance: float = Query(0.005, ge=0, le=0.1, description="Merge tolerance (default 0.5%)"),
|
|
_user=Depends(require_access),
|
|
db: AsyncSession = Depends(get_db),
|
|
) -> APIEnvelope:
|
|
"""Get support/resistance levels for a symbol, sorted by strength descending."""
|
|
levels = await get_sr_levels(db, symbol, tolerance)
|
|
data = SRLevelResponse(
|
|
symbol=symbol.upper(),
|
|
levels=[
|
|
SRLevelResult(
|
|
id=lvl.id,
|
|
price_level=lvl.price_level,
|
|
type=lvl.type,
|
|
strength=lvl.strength,
|
|
detection_method=lvl.detection_method,
|
|
created_at=lvl.created_at,
|
|
)
|
|
for lvl in levels
|
|
],
|
|
count=len(levels),
|
|
)
|
|
return APIEnvelope(status="success", data=data.model_dump())
|