iMAonArray()...

 
Была такая тема - http://www.metatrader4.com/ru/forum/6653

Наступил на новые грбали, стал делать статистику - нулевой результат выдает. Я уж к ней и так и эдак, убил больше часа на ловлю своей блохи, какие только проверки не уставиал - не могу найти ошибку у себя в коде. Тогда появилось одно нехорошее подозрение - есть ограничение по размеру массива, для которого эта функция работает. Сделал скрипт наподобие скрипта-убийцы
//+------------------------------------------------------------------+ //| testIMA.mq4 | //| MetaQuotes | //| http://www.alpari-idc.ru/ru/experts/articles/ | //+------------------------------------------------------------------+ #property copyright "MetaQuotes" #property link "http://www.alpari-idc.ru/ru/experts/articles/" //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- double testArray[]; int i,n,m; double ima; for (i=30;i<1000000;i++) { ArrayResize(testArray,i); ArraySetAsSeries(testArray,true); m=0; for(n=0;n<i;n++) { testArray[n]=m; m++; if (m>20) m=0; } ima=iMAOnArray(testArray,i,i,0,MODE_SMA,0); if (ima==0) { Print("Слом на размере ",i); break; } } //---- return(0); } //+------------------------------------------------------------------+
Его цель - найти предельный размер массива. В общем, находит, и он не такой большой.
 

1. Количество элементов массива не может быть больше целого положительного числа.

2. Массив должен помещаться в памяти

3. При перераспределении памяти для массива необходимо иметь в виду, что при распределении памяти для нового состояния массива, память старого состояния ещё не освобождена.

Этот "скрипт-убийца" дико фрагментирует память

 
Вообще-то предельный размер массива определяется через код возврата ArrayResize, а не в iMA.
Тут дело не в фрагментации памяти - какая-то ошибка в iMAOnArray - выдает 0 при i=4001 .
Код-то надо запускать, а не строить теории.
 
У меня тоже на этом значении вылез 0. Значит совпало. Идея была в том, что лениво самому посчитать среднее в цикле, а получить через iMaonBuffer с периодом в размер массива. Сам себя в итоге наказал.
 

если речь идёт не о проверке предельного размера массива, а о проверке допустимых параметров, то я сообщаю, что значение периода усреднения может находиться в диапазоне от 1 до 4000.

Надо в словаре об этом написать

 

Мы решили снять это ограничение. Теперь будет от 1 до самого максимального целого положительного значения

 
Наверняка те же грабли в iBBands(), iStDev() (то ,ч то с ходу вспомнил). Если убирать ограничение - то везде.
 

везде убрали

Причина обращения: