Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 902

 

1.У меня такой вопрос, как можно удалить элемент массива через память, на данный момент я произвожу удаление элемента путём сдвига массива математическим путём через цикл, возможно ли это в mql4? Если это возможно приведите пожалуйста пример как это делается на одномерном массиве.

2.Также вопрос какой способ будет более высокопроизводительный с учётом того: что если удалять через память, вырезать участок с ненужными элементами, то массив сократиться и его число уменьшиться на величину удалённых элементов и в последующем использовании массива придётся восстановить массив до его исходного состояния; если удалить через цикл математическим путём, то происходит обработка цикла в котором происходят постоянные вычисления по присвоению значений переменным, что в свою очередь оказывает нагрузку на программу?

 
Seric29:

1.У меня такой вопрос, как можно удалить элемент массива через память, на данный момент я произвожу удаление элемента путём сдвига массива математическим путём через цикл, возможно ли это в mql4? Если это возможно приведите пожалуйста пример как это делается на одномерном массиве.

2.Также вопрос какой способ будет более высокопроизводительный с учётом того: что если удалять через память, вырезать участок с ненужными элементами, то массив сократиться и его число уменьшиться на величину удалённых элементов и в последующем использовании массива придётся восстановить массив до его исходного состояния; если удалить через цикл математическим путём, то происходит обработка цикла в котором происходят постоянные вычисления по присвоению значений переменным, что в свою очередь оказывает нагрузку на программу?

Достаточно просто скопировать массив "сам в себя" и сократить размер массива на количество ненужных элементов.

Для вставки одного элемента достаточно увеличить размер, скопировать опять-же "сам в себя" и вставить нужное значение на освободившееся место.

 
Alexey Viktorov:

Достаточно просто скопировать массив "сам в себя" и сократить размер массива на количество ненужных элементов.

Для вставки одного элемента достаточно увеличить размер, скопировать опять-же "сам в себя" и вставить нужное значение на освободившееся место.

я попробовал вставить 3ёхмерный массив в функцию копирования ошибок нет, значит эта функция может работать с массивами разных размеренностей либо просто имеет дубликаты для разных размеренностей. По ходу дела эту функцию можно использовать вместо функции сдвига нет нужды писать свою, жаль ранее не подумал об этом, насколько рискованно копировать массив сам в себя написано что результат может быть не определён.

 
Seric29:

я попробовал вставить 3ёхмерный массив в функцию копирования ошибок нет, значит эта функция может работать с массивами разных размеренностей либо просто имеет дубликаты для разных размеренностей. По ходу дела эту функцию можно использовать вместо функции сдвига нет нужды писать свою, жаль ранее не подумал об этом, насколько рискованно копировать массив сам в себя написано что результат может быть не определён.

При копировании многомерного массива надо учитывать размерность второго и следующих измерений. От этого зависит на сколько надо сдвигать при копировании. Попросту говоря, как я понял при проведении экспериментов, все значения многомерного массива выстраиваются в "одну шеренгу", а потом опять строятся в "колонну по..."

В общем сейчас теорию пересказать не смогу. Опять надо будет проверять, если будет необходимость этим воспользоваться.

 
Alexey Viktorov:

При копировании многомерного массива надо учитывать размерность второго и следующих измерений. От этого зависит на сколько надо сдвигать при копировании. Попросту говоря, как я понял при проведении экспериментов, все значения многомерного массива выстраиваются в "одну шеренгу", а потом опять строятся в "колонну по..."

В общем сейчас теорию пересказать не смогу. Опять надо будет проверять, если будет необходимость этим воспользоваться.

В с++ нет разницы между этим

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

в любом из этих случаев будет вывод. Потому что они лежат в одном блоке памяти и с++ обращается к ним напрямую а в нашей оболочке доступ к памяти закрыт и нет возможности корректно передавать массивы разной размеренности в функцию а также обращаться к ним таким способом, единственный нюанс это то что многомерный массивы в с++ расположены в динамической памяти возможно даже разбросаны хотя электронную карту расположения никто не видел. Значит копировать многомерные массивы по концепции сам в себя очень тонкое дело или может некорректно сработать?

 
Как программно определить как залогинился к счету: по инвест паролю или по торговому?
 

У меня в индикаторе не исполняется код на MQL5

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

Суть в том что если price == STO_LOWHIGH то всё работает корректно, а если  price == STO_CLOSECLOSE то функция статическим переменным присваивает только

vhigh = 0; vlow = High[i];

... в обход цикла

 
Alexandr Sokolov:

У меня в индикаторе не исполняется код на MQL5

Суть в том что если price == STO_LOWHIGH то всё работает корректно, а если  price == STO_CLOSECLOSE то функция статическим переменным присваивает только

... в обход цикла

Что-то не так со скобками. На мой взгляд они тут вообще не нужны. Все не нужны.

Или хотя-бы выделенные переставить перед вопросительным знаком влево.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

А вообще, надо просто понять что оператор ?: равнозначен if else

У вас получается одно условие дважды. Достаточно такого условия

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
или я что-то не понял, что вы хотели получить.
 
Alexey Viktorov:

Что-то не так со скобками. На мой взгляд они тут вообще не нужны. Все не нужны.

Или хотя-бы выделенные переставить перед вопросительным знаком влево.

А вообще, надо просто понять что оператор ?: равнозначен if else

У вас получается одно условие дважды. Достаточно такого условия

или я что-то не понял, что вы хотели получить.

Я хочу получить обычные maxHigh и minLow стохастика в рамках периода К по параметрам Low/High и Close/Close

Low/High при инициализации работает нормально, а Close/Close нет

 
Alexey Viktorov:

Что-то не так со скобками. На мой взгляд они тут вообще не нужны. Все не нужны.

Или хотя-бы выделенные переставить перед вопросительным знаком влево.

А вообще, надо просто понять что оператор ?: равнозначен if else

У вас получается одно условие дважды. Достаточно такого условия

или я что-то не понял, что вы хотели получить.

Я не сразу понял, но если вы имел ввиду это

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

то оно не решает мою проблему

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