Files
AITrader/app/routes/api/alpaca/quote.ts
T
henry b4076f89b6 fix: add bars data for TradingView chart from Alpaca
- Modify quote.ts to fetch historical bars for chart data
- Update analyze.ticker.tsx to pass bars data to TradingViewChart
- Chart now displays candlestick data from Alpaca API
2026-05-14 11:19:22 +02:00

49 lines
1.5 KiB
TypeScript

import Alpaca from "@alpacahq/alpaca-trade-api";
const alpaca = new Alpaca({
keyId: process.env.ALPACA_API_KEY!,
secretKey: process.env.ALPACA_SECRET_KEY!,
baseUrl: process.env.ALPACA_BASE_URL || "https://paper-api.alpaca.markets",
retryOnError: false,
});
export async function loader({ params }: { params: { ticker: string } }) {
const ticker = params.ticker?.toUpperCase();
if (!ticker) {
return Response.json({ error: "Ticker is required" }, { status: 400 });
}
try {
// Get latest trade for current price
const trade = await alpaca.getLatestTrade(ticker);
const price = (trade as { Price?: number }).Price || 0;
// Get historical bars for chart (last 30 days, daily)
const bars = await alpaca.getBarsV2(ticker, {
timeframe: "1Day",
limit: 30,
});
// Convert async generator to array
const barsArray = [];
for await (const bar of bars) {
barsArray.push({
t: (bar as any).Timestamp || (bar as any).t,
o: (bar as any).Open || (bar as any).o,
h: (bar as any).High || (bar as any).h,
l: (bar as any).Low || (bar as any).l,
c: (bar as any).Close || (bar as any).c,
v: (bar as any).Volume || (bar as any).v,
});
}
return Response.json({
ticker,
price,
bars: barsArray,
});
} catch (error) {
console.error("Alpaca data error:", error);
return Response.json({ error: "Failed to fetch data" }, { status: 500 });
}
}