#pragma once #include #include #include #include #include "raid/core/types.hpp" namespace raid { /// QualityReport: counts of data issues found by BarSeries::validate(); prices are never altered. struct QualityReport { std::string symbol; usize n_bars{0}; usize n_sessions{0}; usize ohlc_inconsistent{0}; // high < max(open,close) or low > min(open,close) or high < low usize nonpositive_price{0}; usize negative_volume{0}; usize zero_volume{0}; usize duplicates{0}; // duplicate (timestamp) rows removed usize off_interval{0}; // timestamp not aligned on the interval grid usize outside_session{0}; // bar outside 04:00–20:00 ET (extended) / outside regular when policy=regular usize non_trading_day{0}; usize unsorted{0}; // rows reordered usize missing_regular_bars{0}; // sum over sessions of (expected − present) regular bars usize price_jumps{0}; // |close/prev close − 1| > jump_threshold within a session f64 coverage{1.0}; // present / expected regular bars std::map per_session_missing; // session → missing bars (only sessions with gaps) std::vector notes; bool has_errors() const { return ohlc_inconsistent || nonpositive_price || negative_volume || off_interval || non_trading_day; } nlohmann::json to_json() const; }; } // namespace raid