iMAOnArray так и должно быть???

 

iMAOnArray( double array[], int total, int period, int ma_shift, int ma_method, int shift)
Расчет скользящего среднего на данных, хранящихся в массиве. В отличие от iMA(...) функция iMAOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries.

В примере при изменени организации доступа к элементам массива с помощью ArraySetAsSeries НИЧЕГО НЕ МЕНЯЕТСЯ в результатах вычисления !!!

Может я чего не понимаю, объясните.

void start() {
   double BASE[5]={-2,-1,0,1,2};
   double FS[4];

   Print("-------------------------------------------");
   Print("Основной массив: ",BASE[0]," ",BASE[1]," ",BASE[2]," ",BASE[3]," ",BASE[4]);
   for(int i=0;i<4;i++) {
      FS[i]=iMAOnArray(BASE,0,2,0,0,i);
   }
   Print("1-й раз вычисленный массив: ",FS[0]," ",FS[1]," ",FS[2]," ",FS[3]);
   ArraySetAsSeries(BASE,true);
   Print("Направление индексирования в массиве поменяли с прямого на обратное"); 
   Print("Основной массив: ",BASE[0]," ",BASE[1]," ",BASE[2]," ",BASE[3]," ",BASE[4]);
   for(i=0;i<4;i++) {
      FS[i]=iMAOnArray(BASE,0,2,0,0,i);
   }
   Print("2-й раз вычисленный массив: ",FS[0]," ",FS[1]," ",FS[2]," ",FS[3]);
   ArraySetAsSeries(BASE,false);
   Print("Направление индексирования в массиве поменяли с обратного на прямое"); 
   Print("Основной массив: ",BASE[0]," ",BASE[1]," ",BASE[2]," ",BASE[3]," ",BASE[4]);
   for(i=0;i<4;i++) {
      FS[i]=iMAOnArray(BASE,0,2,0,0,i);
   }
   Print("3-й раз вычисленный массив: ",FS[0]," ",FS[1]," ",FS[2]," ",FS[3]);
   return;
}

Лог:

07:36:09 _Test EURJPY,H1: loaded successfully
07:36:12 _Test EURJPY,H1: initialized
07:36:12 _Test EURJPY,H1: -------------------------------------------
07:36:12 _Test EURJPY,H1: Основной массив: -2 -1 0 1 2
07:36:12 _Test EURJPY,H1: 1-й раз вычисленный массив: 1.5 0.5 -0.5 -1.5
07:36:12 _Test EURJPY,H1: Направление индексирования в массиве поменяли с прямого на обратное
07:36:12 _Test EURJPY,H1: Основной массив: 2 1 0 -1 -2
07:36:12 _Test EURJPY,H1: 2-й раз вычисленный массив: 1.5 0.5 -0.5 -1.5
07:36:12 _Test EURJPY,H1: Направление индексирования в массиве поменяли с обратного на прямое
07:36:12 _Test EURJPY,H1: Основной массив: -2 -1 0 1 2
07:36:12 _Test EURJPY,H1: 3-й раз вычисленный массив: 1.5 0.5 -0.5 -1.5
07:36:14 _Test EURJPY,H1: -------------------------------------------
07:36:14 _Test EURJPY,H1: Основной массив: -2 -1 0 1 2
07:36:14 _Test EURJPY,H1: 1-й раз вычисленный массив: 1.5 0.5 -0.5 -1.5
07:36:14 _Test EURJPY,H1: Направление индексирования в массиве поменяли с прямого на обратное
07:36:14 _Test EURJPY,H1: Основной массив: 2 1 0 -1 -2
07:36:14 _Test EURJPY,H1: 2-й раз вычисленный массив: 1.5 0.5 -0.5 -1.5
07:36:14 _Test EURJPY,H1: Направление индексирования в массиве поменяли с обратного на прямое
07:36:14 _Test EURJPY,H1: Основной массив: -2 -1 0 1 2
07:36:14 _Test EURJPY,H1: 3-й раз вычисленный массив: 1.5 0.5 -0.5 -1.5
07:36:16 _Test EURJPY,H1: deinitialized
07:36:16 _Test EURJPY,H1: uninit reason 1

P.S. Проверял на 216 и 217 билдах.

 

Сначала надо сделать ArraySetAsSeries(BASE,true);, потом заполнить массив, потом MAonArray(). Обратите внимание: Основной массив: -2 -1 0 1 2, вычисленный массив: 1.5 0.5 -0.5 -1.5 - получается наоброт, а должно быть -1.5, -0.5, 0.5, 1.5


 
Integer писал (а) >>

Сначала надо сделать ArraySetAsSeries(BASE,true);, потом заполнить массив, потом MAonArray(). Обратите внимание: Основной массив: -2 -1 0 1 2, вычисленный массив: 1.5 0.5 -0.5 -1.5 - получается наоброт, а должно быть -1.5, -0.5, 0.5, 1.5

Так все работает, спасибо Integer.

 

На самом деле немного не так. Для индикаторов, которые строятся на массиве, не имеет значения как вы его объявите - как таймсерияю или как обычный массив. Считаться он будет всегда одинаково - слева направо, независимо от объявления функции ArraySetAsSeries().




Об этом и написано в документации для iMaOnArray():

Расчет скользящего среднего на данных, хранящихся в массиве. В отличие от iMA(...) функция iMAOnArray не выбирает данные на основе названия инструмента, таймфрейма и используемой цены - ценовые данные должны быть подготовлены заранее. Расчет производится слева направо. Для организации доступа к элементам массива, как к таймсерии (то есть справа налево), необходимо использовать функцию ArraySetAsSeries.


Вот результат работы приложенного скрипта CheckiMAOnArray.mq4:

11:52:40 CheckiMAOnArray EURUSD,H1: loaded successfully
11:52:40 CheckiMAOnArray EURUSD,H1: -------------------------------------------
11:52:40 CheckiMAOnArray EURUSD,H1: Основной массив: 2 1 0 -1 -2
11:52:40 CheckiMAOnArray EURUSD,H1: вычисленный массив FS: 1.5 0.5 -0.5 -1.5
11:52:40 CheckiMAOnArray EURUSD,H1: Обратный массив: 2 1 0 -1 -2
11:52:40 CheckiMAOnArray EURUSD,H1: вычисленный массив reversFS: -1.5 -0.5 0.5 1.5
11:52:40 CheckiMAOnArray EURUSD,H1: uninit reason 0
11:52:40 CheckiMAOnArray EURUSD,H1: removed

Файлы:
 
Rosh писал (а) >>

На самом деле немного не так. Для индикаторов, которые строятся на массиве, не имеет значения как вы его объявите - как таймсерияю или как обычный массив. Считаться он будет всегда одинаково - слева направо, независимо от объявления функции ArraySetAsSeries().

Хороший пример, спасибо Rosh. Но Integer имел ввиду наверно (у меня это во всяком случае работает) следующее:

double BASE[5];
   
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init() {
   ArraySetAsSeries(BASE,true);
   return;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start() {
   double FS[4];
   
   for(int i=0;i<5;i++) {
      BASE[i]=i-2;
   }
   Print("-------------------------------------------");
   Print("Основной массив: ",BASE[0]," ",BASE[1]," ",BASE[2]," ",BASE[3]," ",BASE[4]);
   for(i=0;i<4;i++) {
      FS[i]=iMAOnArray(BASE,0,2,0,0,i);
   }
   Print("Вычисленный массив: ",FS[0]," ",FS[1]," ",FS[2]," ",FS[3]);
   return;
}

Лог при закоментированном //ArraySetAsSeries(BASE,true); :

11:18:45 _Test GBPUSD,Daily: initialized
11:18:45 _Test GBPUSD,Daily: -------------------------------------------
11:18:45 _Test GBPUSD,Daily: Основной массив: -2 -1 0 1 2
11:18:45 _Test GBPUSD,Daily: Вычисленный массив: 1.5 0.5 -0.5 -1.5
11:18:46 _Test GBPUSD,Daily: -------------------------------------------

Лог :

11:19:32 _Test GBPUSD,Daily: -------------------------------------------
11:19:32 _Test GBPUSD,Daily: Основной массив: -2 -1 0 1 2
11:19:32 _Test GBPUSD,Daily: Вычисленный массив: -1.5 -0.5 0.5 1.5
11:19:33 _Test GBPUSD,Daily: -------------------------------------------

 
Talex писал (а) >>

Хороший пример, спасибо Rosh. Но Integer имел ввиду наверно (у меня это во всяком случае работает) следующее:

Это потому, что для заполнение массива в данном примере происходит обращение по индексу. Соответственно, массив можно заполнить двумя способами - с начала или с конца.