Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1466

 
if(i+30<ArraySize(opens))

Эта ошибка из-за невнимательности. Её исправление не решает проблемы.

Вот как бы создать массив из 30-ти цен открытия свечей, чтобы уже в нём искать максимумы и минимумы?

 
Dmitry Ivanushko #:
ArrayMaximum
ArrayMaximum

Возвращает индекс максимального  значения, а не цену.

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

Не проверял, но вроде так вы получите индексы минимумов и максимумов открытий (opens) свечей.

Хотя можно получить и сразу цену, а не индексы.

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

Нигде не нашёл примера цикла на mql с шагом. Это упрощает всё дело.

Только ChatGPT посоветовал мне такое написание: 

for(int i = n; i < sizeArray; i += n)

Буду дальше экспериментировать. Код работает. Спасибо.

А ошибка "array out of range" возникает, если не делать ArrayResize.

 
Dmitry Ivanushko #:

Эта ошибка из-за невнимательности. Её исправление не решает проблемы.

Вот как бы создать массив из 30-ти цен открытия свечей, чтобы уже в нём искать максимумы и минимумы?

А в чём проблема? Объявите массив temp[] и в него копируйте по 30 элементов и в нём ищите индекс минимального\максимального значения. А если в конце будет меньше 30ти, то скопируется сколько осталось. И в этом случае, я лучше-бы использовал цикл while()

 
Alexey Viktorov #:
А в чём проблема? Объявите массив temp[] и в него копируйте по 30 элементов и в нём ищите индекс минимального\максимального значения. А если в конце будет меньше 30ти, то скопируется сколько осталось. И в этом случае, я лучше-бы использовал цикл while()

Да, можно и так. Плохо соображаю, поэтому спрашиваю совета. 

 
Dmitry Ivanushko #:

Да, можно и так. Плохо соображаю, поэтому спрашиваю совета. 

В статическом массиве задается размер константный, его не изменить, в динамическом его можно менять, но размер массива задается! т.е. размер массива известен и индексы элементов от 0 до конца. <=  выход за пределы как раз потому что индексы элементов с нуля, и индекс последнего элемента меньше на единицу размера массива.

Все в Ваших руках))))

 
Valeriy Yastremskiy #:

В статическом массиве задается размер константный, его не изменить, в динамическом его можно менять, но размер массива задается! т.е. размер массива известен и индексы элементов от 0 до конца. <=  выход за пределы как раз потому что индексы элементов с нуля, и индекс последнего элемента меньше на единицу размера массива.

Все в Ваших руках))))

Это как понять? Вы считаете чтобы скопировать какое-то количество элементов из одного массива в другой, какой-то temp[], то перед копированием надо задать размер массива ArrayResize(temp, new_size); ???

 
Dmitry Ivanushko #:

Да, можно и так. Плохо соображаю, поэтому спрашиваю совета. 

А по хорошему вам и временный массив не нужен.

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

Вот этот код

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

ищет максимум среди 15ти оставшихся элементов, несмотря на то, что задано искать среди 20ти элементов.

Таким образом вам лучше пользовать цикл while() и не заморачиваться с количеством оставшихся элементов массива.

 
Alexey Viktorov #:

Это как понять? Вы считаете чтобы скопировать какое-то количество элементов из одного массива в другой, какой-то temp[], то перед копированием надо задать размер массива ArrayResize(temp, new_size); ???

Нет конечно, имел ввиду, что размер массива всегда известен или его можно узнать. И его можно и нужно контролировать на выход индекса за пределы.

 
Valeriy Yastremskiy #:

Нет конечно, имел ввиду, что размер массива всегда известен или его можно узнать. И его можно и нужно контролировать на выход индекса за пределы.

Контролировать можно, но не всегда нужно…

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