Files
OpenFin/backend/routers/reports.py
OpenSquared 3ee39d5f08 feat: options technical agent — IV/skew/term structure validation per trade
- New options_technical_agent.py: rule engine (IVR, skew, term structure, flow)
  + GPT-4o narrative per trade; verdict OK/WARN/ALERT + fit_score
- options_trade_assessments table in DB for Journal badge persistence
- auto_cycle.py step 5.2: assess newly logged trades after log_trade_entries;
  results embedded in cycle report
- suggest_patterns_from_market_context: +iv_context param + explicit IV→strategy
  rules in prompt (IVR<30%→Long, 30-60%→Spread, >60%→no naked long, >80%→short)
- Pre-fetch iv_context at step 1.9 so suggestion step gets strategy rules
- reports.py: /api/reports/assessments/latest + /assessments/{run_id} endpoints
- RapportIA.tsx: "Validation Technique Options" section with per-trade IVBar,
  VerdictBadge, issues list, GPT-4o analysis, optimal strategy suggestion

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 09:36:35 +02:00

41 lines
1.2 KiB
Python

from fastapi import APIRouter, HTTPException
from services.database import (
get_cycle_reports, get_cycle_report, get_latest_cycle_report,
get_trade_assessments, get_latest_trade_assessments,
)
router = APIRouter(prefix="/api/reports", tags=["reports"])
@router.get("/cycle/latest")
def cycle_report_latest():
"""Most recent generated cycle report."""
return {"report": get_latest_cycle_report()}
@router.get("/cycle/list")
def cycle_report_list(limit: int = 20):
"""List of cycle report summaries (no full JSON)."""
return {"reports": get_cycle_reports(limit)}
@router.get("/cycle/{run_id}")
def cycle_report_detail(run_id: str):
"""Full cycle report for a specific run_id."""
report = get_cycle_report(run_id)
if not report:
raise HTTPException(404, "Rapport de cycle introuvable")
return report
@router.get("/assessments/latest")
def assessments_latest(limit: int = 20):
"""Latest options technical assessments (one per trade, for Journal badges)."""
return {"assessments": get_latest_trade_assessments(limit)}
@router.get("/assessments/{run_id}")
def assessments_by_run(run_id: str):
"""Options technical assessments for a specific cycle run."""
return {"assessments": get_trade_assessments(run_id)}