Look-ahead bias is architecturally impossible
Every data fetch resolves against an AsyncLocalStorage temporal context. Your strategy can't peek at future bars even if you try — the runtime refuses to surface them. Multi-timeframe joins synchronize automatically.
// no timestamp params. context flows. const c1h = await getCandles(s, "1h", 100); const c15m = await getCandles(s, "15m", 100); const c5m = await getCandles(s, "5m", 100); // → all three resolve to the // same backtest tick