Странное влияние функции iMAOnArray на компилятор MT4

 

Код скрипта 1:

#property strict
#property show_inputs
extern int              inp_atr_period                = 14;             // период АТР
extern ENUM_MA_METHOD   inp_atr_method                = MODE_SMA;       // метод АТР

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double atr_array[];
   int atr_new_size = ArrayResize(atr_array, 50);
   if(atr_new_size>0) {
      Print("resize succesfull");
   }else{
      Print("resize error: ",GetLastError());
   }
   
   for(int i=0;i<atr_new_size;i++)
      atr_array[i] = High[1+i] - Low[1+i];

  }
//+------------------------------------------------------------------+

Запускаем, получаем в журнале "resize succesfull". Почему бы собственно и нет?

Код скрипта 2:

#property strict
#property show_inputs
extern int              inp_atr_period                = 14;             // период АТР
extern ENUM_MA_METHOD   inp_atr_method                = MODE_SMA;       // метод АТР

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double atr_array[];
   int atr_new_size = ArrayResize(atr_array, 50);
   if(atr_new_size>0) 
   {
      Print("resize succesfull");
   }else{
      Print("resize error: ",GetLastError());
   }
   
   for(int i=0;i<atr_new_size;i++)
      atr_array[i] = High[1+i] - Low[1+i];

   double atr_value = 0;
   atr_value = iMAOnArray(atr_array, atr_new_size, inp_atr_period, 0, inp_atr_method, 0);
   
  }
//+------------------------------------------------------------------+
добавлены 2 выделенные строчки.
И в журнале мы теперь получаем: "resize error: 4029"

Почему? Каким образом функция которая лежит ниже по коду ломает верхнюю часть кода?
терминал билд 1350.
компилятор билд 2392
 

Если объявление массива вытащить из функции на глобальный уровень то будет нормально. 

Наверно дело в том, что функция iMAOnArray() предназначена для строго определенных задач, а не как заблагорассудится. 

При вызове из индикатора  iMAOnArray() досчитывает только новые элементы индикаторного буфера.

Наверно какое-то связывание места вызова функции с массивом выполняется. 

 
Dmitry Fedoseev #:

Если объявление массива вытащить из функции на глобальный уровень то будет нормально. 

Наверно дело в том, что функция iMAOnArray() предназначена для строго определенных задач, а не как заблагорассудится. 

При вызове из индикатора  iMAOnArray() досчитывает только новые элементы индикаторного буфера.

Наверно какое-то связывание места вызова функции с массивом выполняется. 

Спасибо Дмитрий. Очень странно что в документации ни слова об особенностях применения этой функции.
 
Alena Lysenkova #:
Спасибо Дмитрий. Очень странно что в документации ни слова об особенностях применения этой функции.

были анонсы про изменение дисциплин использования массивов и тайм.серий.

то что вы хотели, работало скажем так, уже давно..а теперь нет :-)

в целях увеличения скорости и производительности это убрали, теперь всё быстро и удобно.

и вообще iMAOnArray это дремучая 4-ка :-) 

 
Maxim Kuznetsov #:

и вообще iMAOnArray это дремучая 4-ка :-) 


А ничего, что этот раздел форума и касается четвёрки?
 

В "дремучей" четверке - одна строка -  iMAOnArray().

В пятерке:

1 . подключить файл,

2 - вызвать функцию с кучей параметров,

3 - с различными типами сглаживания самому разрулить вызовы разных функций через switch,

4 - причем для LWMA надо еще глобальную переменную объявить.

5 - догадаться обо всем надо самому, поскольку в справке про это нет.