#ifndef DATA_QUALITY_VALIDATOR_H #define DATA_QUALITY_VALIDATOR_H #include #include #include #include #include #include #include "../common_structures/TradingStructures.h" // Data quality metrics struct DataQualityMetrics { qint64 totalPackets = 0; qint64 validPackets = 0; qint64 invalidPackets = 0; qint64 suspiciousPackets = 0; double validityRate = 0.0; QDateTime lastUpdate; void updateMetrics(bool isValid, bool isSuspicious = false) { totalPackets++; if (isValid) { validPackets++; } else { invalidPackets++; } if (isSuspicious) { suspiciousPackets++; } validityRate = totalPackets > 0 ? static_cast(validPackets) / totalPackets : 0.0; lastUpdate = QDateTime::currentDateTime(); } }; // Data validation rules struct ValidationRules { double maxPriceDeviation = 0.1; // 10% double minValidPrice = 0.01; double maxValidPrice = 1000000.0; qint64 minValidVolume = 1; qint64 maxValidVolume = 1000000000; int maxOrderBookDepth = 10; int maxTimestampDeviationMs = 5000; // 5 seconds bool enableCrossMarketValidation = true; bool enableStatisticalOutlierDetection = true; bool isValid() const { return maxPriceDeviation > 0 && minValidPrice > 0 && maxValidPrice > minValidPrice; } }; class DataQualityValidator : public QObject { Q_OBJECT public: static DataQualityValidator* instance(); // Configuration void setValidationRules(const ValidationRules& rules); ValidationRules getValidationRules() const; // Data validation bool validateQuoteData(const Trading::QuoteData& quote); bool validateOrderBook(const Trading::OrderBook& orderBook); bool validateOrder(const Trading::Order& order); bool validateTrade(const Trading::Trade& trade); bool validateDataPacket(const Trading::DataPacket& packet); // Quality monitoring DataQualityMetrics getQualityMetrics() const; void resetMetrics(); // Anomaly detection void addAnomalyPattern(const QString& patternName, const QVariant& pattern); void removeAnomalyPattern(const QString& patternName); bool checkForAnomalies(const Trading::DataPacket& packet); // Statistical validation void updatePriceStatistics(const QString& symbol, double price); void updateVolumeStatistics(const QString& symbol, qint64 volume); bool isStatisticalOutlier(const QString& symbol, double value, const QString& metric) const; signals: void dataValidationFailed(const Trading::DataPacket& packet, const QString& reason); void dataQualityAlert(const QString& symbol, const QString& alertType, const QString& message); void qualityMetricsUpdated(const DataQualityMetrics& metrics); void anomalyDetected(const Trading::DataPacket& packet, const QString& pattern); private: explicit DataQualityValidator(QObject *parent = nullptr); ~DataQualityValidator(); bool validateQuoteInternal(const Trading::QuoteData& quote); bool validateOrderBookInternal(const Trading::OrderBook& orderBook); bool validateOrderInternal(const Trading::Order& order); bool validateTradeInternal(const Trading::Trade& trade); void updateQualityMetrics(bool isValid, bool isSuspicious = false); void checkCrossMarketData(const Trading::DataPacket& packet); void performStatisticalAnalysis(const Trading::DataPacket& packet); // Validation rules ValidationRules m_validationRules; // Quality metrics DataQualityMetrics m_qualityMetrics; // Statistical data QMap> m_priceHistory; QMap> m_volumeHistory; QMap> m_statisticalModels; // Anomaly patterns QMap m_anomalyPatterns; // Monitoring timers QTimer* m_metricsUpdateTimer; QTimer* m_statisticalUpdateTimer; // Synchronization mutable QMutex m_mutex; }; #endif // DATA_QUALITY_VALIDATOR_H