diff --git a/src/analytics/performance.zig b/src/analytics/performance.zig index 619c96e..71672fd 100644 --- a/src/analytics/performance.zig +++ b/src/analytics/performance.zig @@ -30,9 +30,9 @@ pub const PerformanceResult = struct { /// Compute total return from adjusted close prices. /// Candles must be sorted by date ascending. -/// `from` snaps forward (first trading day on/after), `to` snaps backward. +/// `from` snaps backward (last trading day on/before), `to` snaps backward. pub fn totalReturnFromAdjClose(candles: []const Candle, from: Date, to: Date) ?PerformanceResult { - return totalReturnFromAdjCloseSnap(candles, from, to, .forward); + return totalReturnFromAdjCloseSnap(candles, from, to, .backward); } /// Same as totalReturnFromAdjClose but both dates snap backward @@ -253,13 +253,14 @@ fn findNearestCandle(candles: []const Candle, target: Date, direction: SearchDir const candidate = switch (direction) { // First candle on or after target .forward => if (lo < candles.len) candles[lo] else return null, - // Last candle on or before target + // Last candle on or before target; if target is before all data, + // fall back to first candle (snap distance check will reject if too far) .backward => if (lo < candles.len and candles[lo].date.eql(target)) candles[lo] else if (lo > 0) candles[lo - 1] else - return null, + candles[0], }; // Reject if the snap distance exceeds tolerance