feat(core): add TickData struct, TimeExit reason, compute_backtest_metrics pub fn

- TickData: parallel tick arrays (timestamps, ltp, bid, ask, buy_qty_delta,
  sell_qty_delta, oi) with len/is_empty helpers; callers must pre-convert
  Zerodha cumulative totals to per-tick deltas before passing
- ExitReason::TimeExit: max hold time exceeded variant for tick backtest
- compute_backtest_metrics: pub free fn wrapping PortfolioEngine::calculate_metrics
  so non-OHLCV strategies can produce identical metrics without duplication

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
porcelaincode
2026-06-03 21:26:51 +05:30
co-authored by Claude Sonnet 4.6
parent 7e91293e1a
commit 514c235f1c
2 changed files with 59 additions and 0 deletions
+19
View File
@@ -761,6 +761,25 @@ impl PortfolioEngine {
}
}
/// Compute `BacktestMetrics` from pre-built curves and trade list.
///
/// Exposed as a standalone function so non-OHLCV strategies (e.g. tick backtest)
/// can produce identical metrics without duplicating the calculation logic.
pub fn compute_backtest_metrics(
equity_curve: &[f64],
drawdown_curve: &[f64],
returns: &[f64],
trades: &[Trade],
initial_capital: f64,
) -> BacktestMetrics {
// Delegate to a throwaway engine instance — avoids duplicating the logic.
let engine = PortfolioEngine::new(BacktestConfig {
initial_capital,
..Default::default()
});
engine.calculate_metrics(equity_curve, drawdown_curve, returns, trades, &StreamingMetrics::new())
}
#[cfg(test)]
mod tests {
use super::*;