//+------------------------------------------------------------------+
//|                                              MADCalculator.mqh   |
//+------------------------------------------------------------------+
#ifndef MAD_CALCULATOR_MQH
#define MAD_CALCULATOR_MQH

#include "MedianCalculator.mqh"

//+------------------------------------------------------------------+
//| MAD Calculator Class                                             |
//+------------------------------------------------------------------+
class CMADCalculator
  {
private:
   double             m_deviations[];
   CMedianCalculator  m_median_calc;

public:
                     CMADCalculator(void);
                    ~CMADCalculator(void);
   double             Calculate(const double &values[],
                                int count,
                                double median_value);
  };

//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CMADCalculator::CMADCalculator(void)
  {
  }

//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CMADCalculator::~CMADCalculator(void)
  {
   ArrayFree(m_deviations);
  }

//+------------------------------------------------------------------+
//| Calculate Median Absolute Deviation                              |
//+------------------------------------------------------------------+
double CMADCalculator::Calculate(const double &values[],
                                 int count,
                                 double median_value)
  {
   if(count <= 0)
      return(0.0);

//--- Build absolute deviation array
   ArrayResize(m_deviations, count);

   for(int i = 0; i < count; i++)
      m_deviations[i] = MathAbs(values[i] - median_value); // Absolute deviation

//--- Return the median of absolute deviations
   return(m_median_calc.Calculate(m_deviations, count));
  }

#endif // MAD_CALCULATOR_MQH
//+------------------------------------------------------------------+