#pragma once #include namespace fn::ds { struct DrawdownResult { double max_dd = 0.0; // peak - trough double max_dd_pct = 0.0; // (peak - trough) / peak (si peak > 0) std::size_t peak_idx = 0; // indice donde ocurre el peak antes del trough std::size_t trough_idx = 0; // indice del trough que crea el max_dd }; // Calcula el max drawdown sobre una serie de balance/equity. Recorrido // O(n). Equity[i] puede ser negativo (no valid para max_dd_pct, que se // devuelve 0 si peak <= 0). DrawdownResult drawdown_max(const double* equity, std::size_t n); // Llena out[n] con el drawdown actual en cada punto: out[i] = peak_so_far - equity[i]. // Util para plotear underwater chart. void drawdown_series(const double* equity, std::size_t n, double* out); } // namespace fn::ds