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

 
Valeriy Yastremskiy #:
Явно в строке присвоить значения элементам массива. Потом умножать в цикле если нужно менять лот. Самое дешёвое, но длинное. Если это один раз делать, то без разницы наверное.)

Это нужно писать каждый элемент?

Как-то-бы циклами это делать. Да, это единоразово в OnInit()

 
Vitaly Muzichenko #:

Вопрос: как красиво заполнить массив до 100 элементов?

Поскольку индексы, на которых происходит изменение значения элемента не имеют простой зависимости (типа каждый следующий на 7 больше предыдущего), то их надо иметь в коде. Множитель, на который умножается R, представляет собой арифметическую прогрессию с шагом 1. Поэтому можно реализовать тот код примерно так:

double R = 0.01;
double Mas[100];
double bounds[] = {18, 27, 35, 42, 48, 55, 60, 64, 67, 69, 71, 100};

for(int i = 0, b = 0, f = 1; i < ArraySize(Mas); i++) {
   if(i == bounds[b]) {
      f++;
      b++;
   }
   Mas[i] = R * f;
}

ArrayPrint(Mas);

Обратите внимание, что для i < 10 и i < 18 множитель не меняется, поэтому число 10 не вошло в массив границ индексов bounds.

Если множители могут меняться по разному, то их тоже можно организовать в виде массива:

double R = 0.01;
double Mas[100];
double bounds[]  = {10, 18, 27, 35, 42, 48, 55, 60, 64, 67, 69, 71, 100};
double factors[] = { 1,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  12};

for(int i = 0, b = 0; i < ArraySize(Mas); i++) {
   if(i == bounds[b]) b++;
   Mas[i] = R * factors[b];
}

ArrayPrint(Mas);

И ещё такой момент. Строка инициализации массива такого вида:

double Mas[100] = {0};

гарантировано инициализирует нулём только первый элемент массива. Попробуйте выполнить такой код:

double R = 0.01;
double Mas[10] = {R};

ArrayPrint(Mas);

и вы увидите в выводе:

(EURUSD,H1) |   0.01000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000

Для полной инициализации надо либо перечислять в скобках все 100 значений для массива из 100 элементов, либо использовать функцию ArrayInitialize(), например.

Но в вашей задаче инициализация массива не требуется, так как вы не модифицируете имеющиеся начальные значения, а каждый раз присваиваете новые.

 
Vitaly Muzichenko #:

Вопрос: как красиво заполнить массив до 100 элементов?

Скажите, а зачем тут оператор += ? Ведь в массиве ноль… Следовательно тут достаточно простого оператора присваивания =

 
Alexey Viktorov #:

Скажите, а зачем тут оператор += ? Ведь в массиве ноль… Следовательно тут достаточно простого оператора присваивания =

набирал на сайте, а потом не смог редактировать. Ночью спать нужно, а не кодами страдать :) 

 
Yuriy Bykov #:

Поскольку индексы, на которых происходит изменение значения элемента не имеют простой зависимости (типа каждый следующий на 7 больше предыдущего), то их надо иметь в коде. Множитель, на который умножается R, представляет собой арифметическую прогрессию с шагом 1. Поэтому можно реализовать тот код примерно так:

Обратите внимание, что для i < 10 и i < 18 множитель не меняется, поэтому число 10 не вошло в массив границ индексов bounds.

Если множители могут меняться по разному, то их тоже можно организовать в виде массива:

И ещё такой момент. Строка инициализации массива такого вида:

гарантировано инициализирует нулём только первый элемент массива. Попробуйте выполнить такой код:

и вы увидите в выводе:

Для полной инициализации надо либо перечислять в скобках все 100 значений для массива из 100 элементов, либо использовать функцию ArrayInitialize(), например.

Но в вашей задаче инициализация массива не требуется, так как вы не модифицируете имеющиеся начальные значения, а каждый раз присваиваете новые.

Спасибо!

Возьму второй вариант.