diff --git a/app/api/macro/route.ts b/app/api/macro/route.ts index 005396f..e158fba 100644 --- a/app/api/macro/route.ts +++ b/app/api/macro/route.ts @@ -5,6 +5,7 @@ import cpiOverridesRaw from "@/data/cpi_overrides.json"; import rateDecisionsRaw from "@/data/rate_decisions.json"; import { fetchFFThisWeek, fetchFFEvents } from "@/lib/forexfactory"; import type { FFEvent } from "@/lib/forexfactory"; +import { fetchTECoreInflation } from "@/lib/tecpi"; const FRED_BASE = "https://api.stlouisfed.org/fred/series/observations"; const REVALIDATE = 86400; // cache 24h @@ -1002,6 +1003,27 @@ export async function GET(req: NextRequest) { } } + // ── TE Core CPI (priorité maximale — données du jour, toutes devises) ──────── + // Remplace les séries FRED erronées : + // GBP GBRCPIALLMINMEI = All Items (headline), pas core → écart ~1% + // JPY PCPI total (3.6%) ≠ core (1.4%) → erreur massive + // USD CPILFESL retard 1 mois → écart 0.2% + // AUD/NZD trimestriels → retard jusqu'à 3 mois + { + const teCpi = await fetchTECoreInflation(); + const te = teCpi[currency]; + if (te) { + const surprise = parseFloat((te.value - te.prev).toFixed(3)); + indicators.cpiCore = { + value: te.value, + prev: te.prev, + surprise, + trend: surprise > 0 ? "up" : surprise < 0 ? "down" : "flat", + lastUpdated: te.refMonth, + }; + } + } + // Stale-if-error const hasAnyValue = Object.values(indicators).some((v) => v !== null); if (!hasAnyValue && staleCache) { diff --git a/app/page.tsx b/app/page.tsx index b34fde3..0971967 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -10,6 +10,7 @@ import CurrencyCard from "@/components/CurrencyCard"; import DriversBar from "@/components/DriversBar"; import CalendarTab from "@/components/CalendarTab"; import SentimentPairsTab from "@/components/SentimentPairsTab"; +import YieldsTab from "@/components/YieldsTab"; import type { CalendarEvent } from "@/app/api/calendar/route"; const REFRESH_MS = parseInt(process.env.NEXT_PUBLIC_REFRESH_INTERVAL_MS ?? "3600000"); @@ -17,12 +18,12 @@ const REFRESH_MS = parseInt(process.env.NEXT_PUBLIC_REFRESH_INTERVAL_MS ?? "3600 export default function Dashboard() { const [drivers, setDrivers] = useState(null); const [expectations, setExpectations] = useState | null>(null); - const [yields, setYields] = useState<{ yields: Record; spreads: Record } | null>(null); + const [yields, setYields] = useState<{ yields: Record; spreads: Record; dayDeltas?: Record } | null>(null); const [sentiment, setSentiment] = useState | null>(null); const [cot, setCot] = useState | null>(null); const [calEvents, setCalEvents] = useState([]); const [nextWeekAvail, setNextWeekAvail] = useState(false); - const [activeTab, setActiveTab] = useState<"dashboard" | "calendar" | "pairs">("dashboard"); + const [activeTab, setActiveTab] = useState<"dashboard" | "calendar" | "pairs" | "yields">("dashboard"); const [rawSymbols, setRawSymbols] = useState | null>(null); const [rateProbabilities, setRateProbabilities] = useState(null); const [lastRefresh, setLastRefresh] = useState(new Date()); @@ -264,7 +265,7 @@ export default function Dashboard() { {/* Tab navigation */}
- {(["dashboard", "calendar", "pairs"] as const).map((tab) => ( + {(["dashboard", "calendar", "pairs", "yields"] as const).map((tab) => ( ))}
@@ -331,6 +335,10 @@ export default function Dashboard() { )} + {activeTab === "yields" && ( + + )} + {/* Footer */}