//±-----------------------------------------------------------------+
//|                                                          MAA.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//±-----------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//— plot MA difference
#property indicator_label1  "MADiff"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//— input parameters
input int      period;        // Период скользящей средней
input ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT;   // Таймфрейм скользящей средней
//— indicator buffers
double         MAaBuffer[];
double         MADiffBuffer[];
//±-----------------------------------------------------------------+
//| Custom indicator initialization function                         |
//±-----------------------------------------------------------------+
int OnInit()
  {
//— indicator buffers mapping
   SetIndexBuffer(0, MADiffBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, MAaBuffer, INDICATOR_CALCULATIONS);
//— Plot settings
   
//—
   return(INIT_SUCCEEDED);
  }
//±-----------------------------------------------------------------+
//| Custom indicator iteration function                              |
//±-----------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   // Проверка количества баров, достаточного для расчета скользящей средней
   if(rates_total < period)
      return(0);
      
    // Начальная точка для расчета
    int start = prev_calculated > 0 ? prev_calculated - 1 : period - 1;

    // Вычисление скользящей средней
    for(int i = start; i < rates_total; i++)
      {
      double sum = 0.0;
      for(int j = 0; j < period; j++)
         {
          sum += close[i - j];
         }
      MAaBuffer[i] = sum / period;
      // Вычисление (MA - price) / price
      MADiffBuffer[i] = ((MAaBuffer[i] - close[i]) / close[i]) * 100;
      }

    // Вычисление среднего значения и стандартного отклонения для MADiffBuffer
    double mean_sum = 0.0;
    double stddev_sum = 0.0;
    int count = 0;

    for(int i = start; i < rates_total; i++)
      {
      mean_sum += MADiffBuffer[i];
      count++;
      }
    double mean = mean_sum / count;

    for(int i = start; i < rates_total; i++)
      {
      stddev_sum += MathPow(MADiffBuffer[i] - mean, 2);
      }
    double stddev = MathSqrt(stddev_sum / count);

    // Теперь mean и stddev содержат среднее значение и стандартное отклонение соответственно
    Comment(StringFormat("Mean: %.5f, StdDev: %.5f", mean, stddev));
    
//— return value of prev_calculated for next call
   return(rates_total);
  }
//±-----------------------------------------------------------------+ неправильно считает stddev