//+------------------------------------------------------------------+ //| lossfunction.mqh | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" //+------------------------------------------------------------------+ //| Подключаем библиотеки | //+------------------------------------------------------------------+ #include "defines.mqh" #include "bufferdouble.mqh" //+------------------------------------------------------------------+ //| Class CLossFunction | //| Назначение: Базовый класс для работы с функциями потерь | //+------------------------------------------------------------------+ class CLossFunction : public CObject { protected: //--- защищённый конструктор не позволит создавать объект CLossFunction, от данного класса можно только наследоваться CLossFunction(void) { } CLossFunction(const CLossFunction &loss)=delete; // копирование запрещено public: virtual ENUM_LOSS_FUNCTION LossFunction(void) const=0; virtual double Calculate(const CBufferDouble *calculated,const CBufferDouble *target)=0; //+------------------------------------------------------------------+ //| Вспомогательная функция для проверки параметров в Calculate | //+------------------------------------------------------------------+ bool CheckParameters(const CBufferDouble *calculated,const CBufferDouble *target) const { return(calculated && target && calculated.Rows()==target.Rows() && calculated.Cols()==target.Cols()); } }; //+------------------------------------------------------------------+ //| Mean squared error (MSE) | //+------------------------------------------------------------------+ class CLoss_MSE final : public CLossFunction { public: //+------------------------------------------------------------------+ //| Получение типа функции | //+------------------------------------------------------------------+ virtual ENUM_LOSS_FUNCTION LossFunction(void) const override { return LOSS_MSE; } //+------------------------------------------------------------------+ //| Расчёт ошибки | //+------------------------------------------------------------------+ virtual double Calculate(const CBufferDouble *calculated,const CBufferDouble *target) override { //--- проверим параметры if(!CheckParameters(calculated,target)) return DBL_MAX; //--- MATRIX m = calculated.m_mMatrix - target.m_mMatrix; m = m * m; //--- return m.Sum() / (m.Rows()*m.Cols()); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CLoss_MAD final : public CLossFunction { public: //+------------------------------------------------------------------+ //| Получение типа функции | //+------------------------------------------------------------------+ virtual ENUM_LOSS_FUNCTION LossFunction(void) const override { return LOSS_MAE; } //+------------------------------------------------------------------+ //| Расчёт ошибки | //+------------------------------------------------------------------+ virtual double Calculate(const CBufferDouble *calculated,const CBufferDouble *target) override { //--- проверим параметры if(!CheckParameters(calculated,target)) return DBL_MAX; //--- MATRIX m=calculated.m_mMatrix - target.m_mMatrix; for(ulong r=0; r