d1a84325ae
- Include bars in loader response - Convert timestamp to YYYY-MM-DD format for TradingView - Fix error response to always include bars array
49 lines
1.5 KiB
TypeScript
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({ ticker, price: 0, bars: [] }, { status: 500 });
|
|
}
|
|
} |