Ошибка при нормализации цены Moving Average

 

Доброго дня!

Никак не могу найти свою ошибку. Есть скрипт, который пишет отклонения от Машки до хая/лоу. У меня в окне данных и в принтах разные значения МА. Вот пример:



Вот что я делал:

Я завёл структуру для хранения всей этой истории:

struct Deviations
  {
   double            devPointsBull; //Пункты бычьи
   double            devPointsBear; //Пункты медьвежьи
   datetime          BullTime; //Время бара бычьего
   datetime          BearTime; //Время бара медвежьего
  };

Deviations BullArray[], BearArray[], bullTimeArray[], bearTimeArray[];


Т.к. у цены МА 6 знаков, то я её нормализую, до дигитсов. 

Завожу хэндл МАшки:

// Массив для хранения значений MA
   double ma_values[];
   ArraySetAsSeries(ma_values, true);

// Копируем значения MA
   if(CopyBuffer(ma_handle, 0, 1, Days, ma_values) <= 0)
     {
      Print("Ошибка копирования значений MA");
      return;
     }

Ну там дальше всё стандартно, вот сам цикл:

for(int i = 1; i <= Days - 1; i ++)
     {
      double ma_price = NormalizeDouble(ma_values[i], 5);
      double high = rates[i].high;
      double low = rates[i].low;
      double open = rates[i].open;
      double close = rates[i].close;
      Print(" MA price = ", DoubleToString(ma_price,_Digits), ", high = ", high, ", low = ", low,", close = ", close);

      //Пишем бычьи отклонения
      if(close > ma_price)
        {
         double deviat = NormalizeDouble(high - ma_price, _Digits);
         BullArray[i].devPointsBull = deviat;
         bullTimeArray[i].BullTime = rates[i].time;
         Print("Bull deviat = ", deviat, " time = ", rates[i].time);
        }
      //Пишем медьвежьи отклонения
      else
         if(close < ma_price)
           {
            double deviat = NormalizeDouble(ma_price - low, _Digits);
            BearArray[i].devPointsBear = deviat;
            bearTimeArray[i].BearTime = rates[i].time;
            Print("Bear deviat = ", deviat, " time = ", rates[i].time);
           }


Никак не пойму, почему у меня кривое значение МА получается?



P.S.

На всякий случай скину полный код скрипта:

input int Days = 500; //Сколько дней считать
input int MAPer = 21; //МА Период

struct Deviations
  {
   double            devPointsBull; //Пункты бычьи
   double            devPointsBear; //Пункты медьвежьи
   datetime          BullTime; //Время бара бычьего
   datetime          BearTime; //Время бара медвежьего
  };

Deviations BullArray[], BearArray[], bullTimeArray[], bearTimeArray[];


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int ma_handle = iMA(_Symbol, PERIOD_CURRENT, MAPer, 0, MODE_EMA, PRICE_CLOSE);
   if(ma_handle == INVALID_HANDLE)
     {
      Print("Ошибка создания индикатора MA");
      return;
     }

// Массив для хранения значений MA
   double ma_values[];
   ArraySetAsSeries(ma_values, true);

// Копируем значения MA
   if(CopyBuffer(ma_handle, 0, 1, Days, ma_values) <= 0)
     {
      Print("Ошибка копирования значений MA");
      return;
     }

   MqlRates rates[];
   
   if(CopyRates(_Symbol, PERIOD_CURRENT, 0, Days, rates) <= 0)
     {
      Print("Ошибка копирования данных в MqlRates");
      return;
     }
     
   ArraySetAsSeries(rates, true);
   ArrayResize(rates, Days);
   ArrayResize(BullArray, Days);
   ArrayResize(BearArray, Days);
   ArrayResize(bullTimeArray, Days);
   ArrayResize(bearTimeArray, Days);
   ArrayResize(ma_values,Days);

   for(int i = 1; i <= Days - 1; i ++)
     {
      double ma_price = NormalizeDouble(ma_values[i], 5);
      double high = rates[i].high;
      double low = rates[i].low;
      double open = rates[i].open;
      double close = rates[i].close;
      Print(" MA price = ", DoubleToString(ma_price,_Digits), ", high = ", high, ", low = ", low,", close = ", close);

      //Пишем бычьи отклонения
      if(close > ma_price)
        {
         double deviat = NormalizeDouble(high - ma_price, _Digits);
         BullArray[i].devPointsBull = deviat;
         bullTimeArray[i].BullTime = rates[i].time;
         Print("Bull deviat = ", deviat, " time = ", rates[i].time);
        }
      //Пишем медьвежьи отклонения
      else
         if(close < ma_price)
           {
            double deviat = NormalizeDouble(ma_price - low, _Digits);
            BearArray[i].devPointsBear = deviat;
            bearTimeArray[i].BearTime = rates[i].time;
            Print("Bear deviat = ", deviat, " time = ", rates[i].time);
           }
      /*ArraySort(BullArray);
      ArraySort(bullTimeArray);
      ArraySort(BearArray);
      ArraySort(bearTimeArray);*/
     }



  }
//+------------------------------------------------------------------+
 
Sergey Izhutov:
ArraySetAsSeries(ma_values, true);

Оно?

 
Лол, вопрос снят, хэндл МАшки и CopyRates стартовали с разных баров :D
 
Aleksandr Slavskii #:

Оно?

Не совсем)) там просто данные копировал с разных баров))) Невнимательность моя

 
Sergey Izhutov #:

Не совсем)) там просто данные копировал с разных баров))) Невнимательность моя

Я тоже оказался не внимательным, то что к rates применяется AsSeries увидел, а эту строчку - ArraySetAsSeries(ma_values, true);    в вашем коде сразу не заметил.

Теперь вижу, что она есть.

 
Aleksandr Slavskii #:

Я тоже оказался не внимательным, то что к rates применяется AsSeries увидел, а эту строчку - ArraySetAsSeries(ma_values, true);    в вашем коде сразу не заметил.

Теперь вижу, что она есть.

)))))