Выложен обновленный билд 188 - страница 2

 
Fix:

double Array[4]={0, 1, 2, 3, 4};



A patom smotrite.



Попробовал. Дает 2.5. Это очень странно. Вот одна из причин, почему я подобные вещи предпочитаю делать сам, например, манипуляции с массивами.
 
Вообще-то несколько правильней будет запись:
double Array[]={0, 1, 2, 3, 4};


Размерность у массива будет 5. И в iMaOnArray() для расчета всего массива надо задавать 0. Любое другое значение может быть, максимум, "размерность"-1. Видимо это связано со способом адресации в С-подобных языках, т.е. номер первого элемента массива это 0, а не единица. В принципе, такую маленькую особенность работы iMaOnArray() можно и запомнить (как мы вообще запоминаем "свойства" всех функций, какими пользуемся при программировании). Хотя согласен - в данном случае это несколько нелогично.

 
А вот еще интересный вариант. То , что массив можно "переворачивать" функцией ArraySetAsSeries только до заполнения значениями я знаю эмпирически (в справке этого вроде нет, сейчас специально искал и не нашел).
Такой код:
int start()
  {
//---- 

   double Array[]={0,1.0,2.0,3.0,4.0};
   double Array2[5];
   Print("Array1  ",iMAOnArray(Array,0,4,0,MODE_SMA,0));
   ArraySetAsSeries(Array,true);
   Array2[0]=4;
   Array2[1]=3;
   Array2[2]=2;
   Array2[3]=1;
   Array2[4]=0;
   Print("Array1 revers ",iMAOnArray(Array,0,4,0,MODE_SMA,0));
   Print("Array2 ",iMAOnArray(Array2,0,4,0,MODE_SMA,0));
   
//----
   return(0);
  }



выдает

2006.01.21 00:52:45 iMaOnBuffer EURUSD,M15: removed
2006.01.21 00:52:45 iMaOnBuffer EURUSD,M15: Array2 1.5
2006.01.21 00:52:45 iMaOnBuffer EURUSD,M15: Array1 revers 2.5
2006.01.21 00:52:45 iMaOnBuffer EURUSD,M15: Array1 2.5
2006.01.21 00:52:45 iMaOnBuffer EURUSD,M15: loaded successfully


а такой (вставлен переворот массива Array2)

int start()
  {
//---- 

   double Array[]={0,1.0,2.0,3.0,4.0};
   double Array2[5];
   Print("Array1  ",iMAOnArray(Array,0,4,0,MODE_SMA,0));
   ArraySetAsSeries(Array,true);
   ArraySetAsSeries(Array2,true);
   Array2[0]=4;
   Array2[1]=3;
   Array2[2]=2;
   Array2[3]=1;
   Array2[4]=0;
   Print("Array1 revers ",iMAOnArray(Array,0,4,0,MODE_SMA,0));
   Print("Array2 ",iMAOnArray(Array2,0,4,0,MODE_SMA,0));
   
//----
   return(0);


дает

2006.01.21 00:57:46 iMaOnBuffer EURUSD,M15: removed
2006.01.21 00:57:46 iMaOnBuffer EURUSD,M15: Array2 2.5
2006.01.21 00:57:46 iMaOnBuffer EURUSD,M15: Array1 revers 2.5
2006.01.21 00:57:46 iMaOnBuffer EURUSD,M15: Array1 2.5
2006.01.21 00:57:46 iMaOnBuffer EURUSD,M15: loaded successfully


То есть, в первом случае для массива Array2 имеем (3+2+1+0)/4=1.5
а во втором для ценовой серии (1+2+3+4)/4=2.5

Отсюда я делаю вывод, что функция iMAOnArray(массив, колво_элементов,период,...смещние) работает следующем образом -
вычисляется среднее за период предыдущих до смещения элементов.
Осталось дождаться опроврежения или пожтверждения. Это же объясняет, почему нельзя взять среднее от всех значений массива - происходит обращение за пределы массива.

 
Сделал проверочный скрипт
int start()
  {
//---- 
   int i;
   double Array[30];
   for (i=0;i<30;i++) Array[i]=i;
   for (i=0;i<26;i++) Print("iMa["+i+"]=",iMAOnArray(Array,0,4,0,MODE_SMA,i));
   
//----
   return(0);
  }
//+------------------------------------------------------------------+


То есть, заполнил в цикле массив значениями от 0 до 29 и взял среднее от нулевого смещения до 25-го.
Вот что получил:

01:27:40 Compiling 'iMaOnArray2'
01:27:52 iMaOnArray2 EURUSD,M15: loaded successfully
01:27:52 iMaOnArray2 EURUSD,M15: iMa[0]=27.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[1]=26.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[2]=25.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[3]=24.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[4]=23.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[5]=22.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[6]=21.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[7]=20.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[8]=19.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[9]=18.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[10]=17.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[11]=16.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[12]=15.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[13]=14.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[14]=13.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[15]=12.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[16]=11.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[17]=10.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[18]=9.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[19]=8.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[20]=7.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[21]=6.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[22]=5.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[23]=4.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[24]=3.5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[25]=2.5
01:27:52 iMaOnArray2 EURUSD,M15: removed


Скопировал все это в Эксель и попробовал понять как это получается, получилось, что для нулевого значения среднее вычисляется с конца. Вот такая таблица получилась:
01:27:52 iMaOnArray2 EURUSD,M15: loaded successfully Среднее значение индекс
01:27:52 iMaOnArray2 EURUSD,M15: iMa[0]=27.5 27.5 29 0
01:27:52 iMaOnArray2 EURUSD,M15: iMa[1]=26.5 26.5 28 1
01:27:52 iMaOnArray2 EURUSD,M15: iMa[2]=25.5 25.5 27 2
01:27:52 iMaOnArray2 EURUSD,M15: iMa[3]=24.5 24.5 26 3
01:27:52 iMaOnArray2 EURUSD,M15: iMa[4]=23.5 23.5 25 4
01:27:52 iMaOnArray2 EURUSD,M15: iMa[5]=22.5 22.5 24 5
01:27:52 iMaOnArray2 EURUSD,M15: iMa[6]=21.5 21.5 23 6
01:27:52 iMaOnArray2 EURUSD,M15: iMa[7]=20.5 20.5 22 7
01:27:52 iMaOnArray2 EURUSD,M15: iMa[8]=19.5 19.5 21 8
01:27:52 iMaOnArray2 EURUSD,M15: iMa[9]=18.5 18.5 20 9
01:27:52 iMaOnArray2 EURUSD,M15: iMa[10]=17.5 17.5 19 10
01:27:52 iMaOnArray2 EURUSD,M15: iMa[11]=16.5 16.5 18 11
01:27:52 iMaOnArray2 EURUSD,M15: iMa[12]=15.5 15.5 17 12
01:27:52 iMaOnArray2 EURUSD,M15: iMa[13]=14.5 14.5 16 13
01:27:52 iMaOnArray2 EURUSD,M15: iMa[14]=13.5 13.5 15 14
01:27:52 iMaOnArray2 EURUSD,M15: iMa[15]=12.5 12.5 14 15
01:27:52 iMaOnArray2 EURUSD,M15: iMa[16]=11.5 11.5 13 16
01:27:52 iMaOnArray2 EURUSD,M15: iMa[17]=10.5 10.5 12 17
01:27:52 iMaOnArray2 EURUSD,M15: iMa[18]=9.5 9.5 11 18
01:27:52 iMaOnArray2 EURUSD,M15: iMa[19]=8.5 8.5 10 19
01:27:52 iMaOnArray2 EURUSD,M15: iMa[20]=7.5 7.5 9 20
01:27:52 iMaOnArray2 EURUSD,M15: iMa[21]=6.5 6.5 8 21
01:27:52 iMaOnArray2 EURUSD,M15: iMa[22]=5.5 5.5 7 22
01:27:52 iMaOnArray2 EURUSD,M15: iMa[23]=4.5 4.5 6 23
01:27:52 iMaOnArray2 EURUSD,M15: iMa[24]=3.5 3.5 5 24
01:27:52 iMaOnArray2 EURUSD,M15: iMa[25]=2.5 2.5 4 25
01:27:52 iMaOnArray2 EURUSD,M15: removed 3 26
2 27
1 28
0 29

Теперь я тоже ничего не понимаю :)

 
М-да... =(
А если ArraySetAsSeries() попробовать?
 
М-да... =(
А если ArraySetAsSeries() попробовать?


Тогда все правильно, идет от нулевого индекса, считате от смещения включительно.
Код:
int start()
  {
//---- 
   int i;
   double Array[30];
   ArraySetAsSeries(Array,true);
   for (i=0;i<30;i++) Array[i]=i;
   for (i=0;i<26;i++) Print("iMa["+i+"]=",iMAOnArray(Array,0,4,0,MODE_SMA,i));
   
//----
   return(0);
  }




Результат:

2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: removed
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[25]=26.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[24]=25.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[23]=24.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[22]=23.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[21]=22.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[20]=21.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[19]=20.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[18]=19.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[17]=18.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[16]=17.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[15]=16.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[14]=15.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[13]=14.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[12]=13.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[11]=12.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[10]=11.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[9]=10.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[8]=9.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[7]=8.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[6]=7.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[5]=6.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[4]=5.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[3]=4.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[2]=3.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[1]=2.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: iMa[0]=1.5
2006.01.22 12:02:23 iMaOnArray3 EURUSD,M15: loaded successfully
2006.01.22 12:01:53 Compiling 'iMaOnArray3'

 
Вывод такой:
если массив объявлен не ценовой серией (без ArraySetAsSeries), то функция iMAOnArray() возвращает значения задом наперед, для смещения ноль получаем значение для последнего индекса, соответственно и усреднение идет от нулевого индекса к последнемe - это нужно помнить для случаев, когда мы используем экспоненциальное, взвешенное или сглаженное усреднение.
Чтобы получать значения в привычном виде надо обязательно объявить массив ценовой серией с помощью ArraySetAsSeries(имя_массива, TRUE).
Чтобы получить усреднение по всему массиву (включая все элементы массива) необходимо объявить размерность массива на единицу больше, чем имеем элементов. ТО есть, чтобы усреднить 30 элементов в массиве, необходимо объявить его размерность равной 31.
Как быть с индексными буферами, которые такого выверта не позволяют - я не знаю. С другой стороны, сам вопрос тоже выверт - в каких случаях может потребоваться усреднение по всему индескному буферу - я не представляю. В принципе, считаю вопрос закрытым.
 
Согласен
 
Аналогично.
 
Вывод я сделал еще в первом посте: когда функция использует часть массива все работает нормально, когда весь массив целиком - ошибка. Разработчики-то почему молчат? Так и должно быть или все-таки это баг? Ждать исправлений или огород городить с дополнительным элементом массива?
Причина обращения: