[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 306

 
drknn:

Массив "бесконечной" длины можно объявить в индикаторе. Объявить и затем в цикле сразу вписывать найденные значения в массив. Вопрос лишь в том, как осуществить передачу нужной Вам выборки в советника/скрипт? Средства есть, но нужно оценить трудоёмкость. Может действительно проще будет делать 2 прогона - в первом подсчитываем число отфильтрованных значений, затем меняем размерность массива, а во втором вносим значения в массив?

Спасибо, но вариант с индикатором не подходит - до передачи полученной выборки в советник возникает проблема передачи условий выборки из советника в индикатор.
 
PapaYozh:

Объявить массив больше максимально необходимого размера.


Точно :) Сработает, если увеличить размер в разы. Например, мы заранее знаем, что число отфильтрованных значений не может превышать тысячу. Объявляем массив размерностью в несколько тысяч ячеек и дело в шляпе :)

Тольк это отнимет у нас часть нужой оперативы. :(

 
drknn:


Точно :) Сработает, если увеличить размер в разы. Например, мы заранее знаем, что число отфильтрованных значений не может превышать тысячу. Объявляем массив размерностью в несколько тысяч ячеек и дело в шляпе :)

Тольк это отнимет у нас часть нужой оперативы. :(


Если "мы заранее знаем, что число отфильтрованных значений не может превышать тысячу", то достаточно объявить массив размерностью 1000.
 
splxgf:

https://docs.mql4.com/ru/math/MathPow не? Или элементарные операции это условие задачи. тогда вариант http://bpascal.ru/download/desc/436.php если уж совсем все на ручнике делать, то реализовать экспоненту и логарифм своими функциями.

Да, именно по условию. Спасибо за ссылку, именно то, что надо!
 
Elenn:
Добрый день, нужен совет: в цикле происходит поиск значений, удовлетворяющих определенным условиям. Найденные значения записываются в массив. Заранее не известно, сколько значений будет найдено. соответственно неизвестен размер массива, который нужно объявить. С точки зрения экономии времени и ресурсов не хотелось бы делать два прогона (чтобы в первом прогоне посчитать количество найденных значений, объявить массив и уже во втором прогоне записать в массив данные). Можно ли как-то получить требуемый результат за один прогон?
Можно на каждое найденное значение увеличивать размер массива на одну ячейку. Только это не очень быстро. Оптимизировать можно, увеличивая размер на несколько ячеек, потом пропускать изменение размера в течении нескольких итераций.
 
PapaYozh:

Если "мы заранее знаем, что число отфильтрованных значений не может превышать тысячу", то достаточно объявить массив размерностью 1000.


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

Да, действительно, вариантов решения проблемы более одного. Думаю всё же лучшим будет тот, который предложил Zhunko - динамически увеличивать размерность масива внутри фильтрующего цикла. Честно говоря, я просто восхищён таким ответом. Мне такое и в голову не пришло :)

 
drknn:


Думаю всё же лучшим будет тот, который предложил Zhunko - динамически увеличивать размерность масива внутри фильтрующего цикла. Честно говоря, я просто восхищён таким ответом. Мне такое и в голову не пришло :)

Решение действительно оригинальное, надо попробовать. Вот только при переобъявлении массива не потеряются ли данные из-за переинициализации?
 
Elenn:
Решение действительно оригинальное, надо попробовать. Вот только при переобъявлении массива не потеряются ли данные из-за переинициализации?

Частенько так делаю. Создаю какой-то первоначальный массив. Потом (при необходимости) увеличиваю его на какую-то величину (на один нельзя, слишком долго операции с массивами выполняются) и просто в работе контролирую размер фактически заполненного массива. Проблем пока не было
 
Vinin:

слишком долго операции с массивами выполняются
Долго выполняются любые операции с массивами или только какие-то определенные?
 
Elenn:
Долго выполняются любые операции с массивами или только какие-то определенные?

Особенно изменение размера массива. Лучше их делать как можно реже