diff --git a/crates/ml/src/trainers/dqn/financials.rs b/crates/ml/src/trainers/dqn/financials.rs index c203ce3b9..b6149cbec 100644 --- a/crates/ml/src/trainers/dqn/financials.rs +++ b/crates/ml/src/trainers/dqn/financials.rs @@ -125,17 +125,19 @@ pub(crate) fn compute_epoch_financials( let mut max_dd = 0.0_f64; for (idx, &ret) in returns[dd_start..].iter().enumerate() { let global_idx = dd_start + idx; - // Reset equity at episode boundaries (capital floor / episode end) + equity *= 1.0 + ret; + if equity > peak { + peak = equity; + } + // Reset equity AFTER processing the done bar's return. + // The done bar's loss is part of this episode's DD — the reset + // applies to the NEXT bar (start of new episode with fresh capital). if global_idx < trade_stats.done_flags.len() && trade_stats.done_flags[global_idx] > 0.5 { equity = initial_capital; peak = initial_capital; } - equity *= 1.0 + ret; - if equity > peak { - peak = equity; - } let dd = if peak > 1e-10 { (peak - equity) / peak } else {