Прошу обратить внимание разработчиков на эту проблему: Отсутствие возможности у программиста очищать память после использования функций Copy...(CopyClose, CopyTime, CopyRates ...)
Для демонстрации этого я написал простой советник с загрузкой всей истории M1 с визуализацией процесса загрузки(для корректной работы необходимо Макс. баров в окне = Unlimited)
после загрузки все внутренние массивы очищаются с помощью ArrayFree()
но, судя по объему использованного ОЗУ, внутри терминала остается полный массив M1 MqlRates структур. В данном случае (см аним. GIF) - это окого 0.5 Гб памяти (8108899 баров * 60 байт(размер структуры MqlRates) = 486 533 940 байт) Причем эту занятую память никак не освободить и со временем она сама не очищается. Я понимаю зачем так сделано: Если был запрос на закачку данных, то этот массив остается в памяти на случай, если запрос повторится, чтобы не инициировать новую загрузку с сервера. Но если программист уверен, что больше эти данные ему не нужны, было бы не плохо дать ему возможность очистить данный массив MqlRates. Спасибо
Прошу обратить внимание разработчиков на эту проблему: Отсутствие возможности у программиста очищать память после использования функций Copy...(CopyClose, CopyTime, CopyRates ...)
Для демонстрации этого я написал простой советник с загрузкой всей истории M1 с визуализацией процесса загрузки(для корректной работы необходимо Макс. баров в окне = Unlimited )
после загрузки все внутренние массивы очищаются с помощью ArrayFree()
но, судя по объему использованного ОЗУ, внутри терминала остается полный массив M1 MqlRates структур. В данном случае (см аним. GIF) - это окого 0.5 Гб памяти (8108899 баров * 60 байт(размер структуры MqlRates) = 486 533 940 байт)
Причем эту занятую память никак не освободить и со временем она сама не очищается.
Это очищается через 30 минут.
Я понимаю зачем так сделано: Если был запрос на закачку данных, то этот массив остается в памяти на случай, если запрос повторится, чтобы не инициировать новую загрузку с сервера. Но если программист уверен, что больше эти данные ему не нужны, было бы не плохо дать ему возможность очистить данный массив MqlRates. Спасибо
Полностью согласен, было бы неплохо иметь функцию.
Спасибо, Аlain! Не знал. Наверное не хватило терпения :))
Пробую воспроизвести данную очистку, но пока не получается. Причем в Task Manager видно очень постепенное уменьшение используемой памяти, но TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что размер используемой памяти не уменьшается. Возможно TERMINAL_MEMORY_USED не работает корректно. Ведь даже если удалить чарт, и даже сам символ из "Обзора Рынка", TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что данный массив MqlRates все еще сидит в памяти.
Спасибо, Аlain! Не знал. Наверное не хватило терпения :))
Пробую воспроизвести данную очистку, но пока не получается. Причем в Task Manager видно очень постепенное уменьшение используемой памяти, но TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что размер используемой памяти не уменьшается. Возможно TERMINAL_MEMORY_USED не работает корректно. Ведь даже если удалить чарт, и даже сам символ из "Обзора Рынка", TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что данный массив MqlRates все еще сидит в памяти.
Да, похоже на то, что память, действительно, очищается через полчаса( исходя из наблюдения за Task Manager), но функция TerminalInfoInteger(TERMINAL_MEMORY_USED) не показывает этой очистки.
В документации к MT5, на странице ::/csignal.htm#mechanism, предложение "Значимость этой модели равна 80.", наверное, следует читать как "Значимость этой модели равна -80."
Вопрос: когда в MQL5 появится штатная функция MarketClose()?
Можно, конечно, начать "долбить" торговый сервер постоянными запросами на установку отложенного ордера с каким-нибудь огромным отступом от текущей цены, а после его установки, проверять код возврата результата и тут же удалять. Есть ещё более экзотические варианты. Но это не камильфо!!!
Вопрос: когда в MQL5 появится штатная функция MarketClose() ?
Можно, конечно, начать "долбить" торговый сервер запросами на установку отложенного ордера с каким-нибудь огромным отступом от текущей цены и после его установки, тут же удалять. Есть ещё более экзотические варианты. Но это не камильфо!!!
Прошу обратить внимание разработчиков на эту проблему:
Отсутствие возможности у программиста очищать память после использования функций Copy...(CopyClose, CopyTime, CopyRates ...)
Для демонстрации этого я написал простой советник с загрузкой всей истории M1 с визуализацией процесса загрузки(для корректной работы необходимо Макс. баров в окне = Unlimited)
после загрузки все внутренние массивы очищаются с помощью ArrayFree()
но, судя по объему использованного ОЗУ, внутри терминала остается полный массив M1 MqlRates структур. В данном случае (см аним. GIF) - это окого 0.5 Гб памяти (8108899 баров * 60 байт(размер структуры MqlRates) = 486 533 940 байт)

Причем эту занятую память никак не освободить и со временем она сама не очищается.
Я понимаю зачем так сделано:
Если был запрос на закачку данных, то этот массив остается в памяти на случай, если запрос повторится, чтобы не инициировать новую загрузку с сервера.
Но если программист уверен, что больше эти данные ему не нужны, было бы не плохо дать ему возможность очистить данный массив MqlRates.
Спасибо
Прошу обратить внимание разработчиков на эту проблему:
Отсутствие возможности у программиста очищать память после использования функций Copy...(CopyClose, CopyTime, CopyRates ...)
Для демонстрации этого я написал простой советник с загрузкой всей истории M1 с визуализацией процесса загрузки(для корректной работы необходимо Макс. баров в окне = Unlimited )
после загрузки все внутренние массивы очищаются с помощью ArrayFree()
но, судя по объему использованного ОЗУ, внутри терминала остается полный массив M1 MqlRates структур. В данном случае (см аним. GIF) - это окого 0.5 Гб памяти (8108899 баров * 60 байт(размер структуры MqlRates) = 486 533 940 байт)
Причем эту занятую память никак не освободить и со временем она сама не очищается.
Это очищается через 30 минут.
Я понимаю зачем так сделано:
Если был запрос на закачку данных, то этот массив остается в памяти на случай, если запрос повторится, чтобы не инициировать новую загрузку с сервера.
Но если программист уверен, что больше эти данные ему не нужны, было бы не плохо дать ему возможность очистить данный массив MqlRates.
Спасибо
Полностью согласен, было бы неплохо иметь функцию.
А можно убрать вот эту двойку в редакторе при вызове Alt+M? Если это не оценка, конечно))

build 3550Это очищается через 30 минут.
Спасибо, Аlain! Не знал. Наверное не хватило терпения :))
Пробую воспроизвести данную очистку, но пока не получается.
Причем в Task Manager видно очень постепенное уменьшение используемой памяти, но TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что размер используемой памяти не уменьшается.
Возможно TERMINAL_MEMORY_USED не работает корректно. Ведь даже если удалить чарт, и даже сам символ из "Обзора Рынка", TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что данный массив MqlRates все еще сидит в памяти.
Спасибо, Аlain! Не знал. Наверное не хватило терпения :))
Пробую воспроизвести данную очистку, но пока не получается.
Причем в Task Manager видно очень постепенное уменьшение используемой памяти, но TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что размер используемой памяти не уменьшается.
Возможно TERMINAL_MEMORY_USED не работает корректно. Ведь даже если удалить чарт, и даже сам символ из "Обзора Рынка", TerminalInfoInteger(TERMINAL_MEMORY_USED) все равно показывает, что данный массив MqlRates все еще сидит в памяти.
Да, похоже на то, что память, действительно, очищается через полчаса( исходя из наблюдения за Task Manager), но функция TerminalInfoInteger(TERMINAL_MEMORY_USED) не показывает этой очистки.
Хороший вопрос.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Как преобразовать вектор или матрицу в двойной массив?
chenyu468 , 2023.02.11 05:37
Я хочу рассчитать данные через матрицу и преобразовать один вектор в массив для отображения индикатора.
И обнаруживается, что в матрице или векторе нет функции выходного массива. элемент "row" или "col" только выходной вектор.
https://www.mql5.com/ru/docs/basis/types/matrix_vector
Нужно ли получать все элементы через цикл в массив?
Хороший вопрос.
Да, тоже заметил, что нет штатного способа скопировать из вектора в массив,
как только через цикл.
Здравствуйте, уважаемые разработчики!
Вопрос: когда в MQL5 появится штатная функция MarketClose()?
Можно, конечно, начать "долбить" торговый сервер постоянными запросами на установку отложенного ордера с каким-нибудь огромным отступом от текущей цены, а после его установки, проверять код возврата результата и тут же удалять. Есть ещё более экзотические варианты. Но это не камильфо!!!
И всё-таки, когда?
С уважением, Владимир.
Здравствуйте, уважаемые разработчики!
Вопрос: когда в MQL5 появится штатная функция MarketClose() ?
Можно, конечно, начать "долбить" торговый сервер запросами на установку отложенного ордера с каким-нибудь огромным отступом от текущей цены и после его установки, тут же удалять. Есть ещё более экзотические варианты. Но это не камильфо!!!
И всё-таки, когда?
С уважением, Владимир.