Ошибки, баги, вопросы - страница 3281
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Обнаружил ошибку в данных Таймсерий в МТ5.
При установленном параметре TERMINAL_MAXBARS на значение 10000 (для примера), в окне графика отображается ровно 10000 баров. Причём, при появлении нового бара, старый пропадает. Так что на графике их всегда 10000.
Но, эти бары, которые ушли в историю, "видит" индикатор. Общее количество (вместе с ними) показывает rates_total, и все массивы-таймсерии индикатора (time[], open[], high[] и т.д.) показывают данные этих баров.
Функция iBars(...) тоже вернёт значение 10000+бары, которые ушли в историю. Но функции iTime(), iOpen(), iHigh() и др. этих баров не видят. При запросе выдают ошибку 4401 - Запрашиваемая история не найдена.
Проверить это можно прилагаемым индикатором. Он проверяет бары с начала истории по значению rates_total, и при нахождении первого не нулевого значения функции iTime(...), останавливается.
Сделайте следующим образом. Измените значение TERMINAL_MAXBARS в настройках терминала, и (важно!) перезагрузите его. Затем установите на график индикатор (прикрепил к посту). Дождитесь появления нового бара, и вы увидите, что старый, который ушел в историю, видят только таймсерии индикатора. iTime(...) его не видит. На скрине ниже график, крайний бар которого в 19:40. Но индикатор видит и предыдущие бары.
После перезагрузки терминала ничего не меняется. Индикатор и функция iBars(...) продолжает видеть ушедшие в историю бары. А iTime(...) и другие их не видят. Причём, если перед перезагрузкой изменить значение TERMINAL_MAXBARS, вся "память" индикатора на ушедшие в историю бары сбросится. Но если просто увеличить значение TERMINAL_MAXBARS, без перезагрузки терминала, то iTime() и другие функции начнут видеть все бары, которые и видит индикатор, считает rates_total и функция iBars(...) .
При значении TERMINAL_MAXBARS равным Unlimited, такой ошибки не возникает.
Возможно ли во время выполнения кода в отладке сделать DebugBreak?
Непонятно, в каком месте иногда код подвисает. Хотелось бы во время подвисания сделать DebugBreak и увидеть, соответственно, причины.
Возможно ли во время выполнения кода в отладке сделать DebugBreak?
Непонятно, в каком месте иногда код подвисает. Хотелось бы во время подвисания сделать DebugBreak и увидеть, соответственно, причины.
Конечно можно по условию сделать DebugBreak, но какое условие поставить? Вот в чём вопрос…
Конечно можно по условию сделать DebugBreak, но какое условие поставить? Вот в чём вопрос…
Предполагал так действовать:
под отладчиком код завис - захожу в ME и нажимаю "принудительно прервать и начать отладку с места прерывания".
Предполагал так действовать:
под отладчиком код завис - захожу в ME и нажимаю "принудительно прервать и начать отладку с места прерывания".
Наверное лучше нажать паузу, а не прерывание.
Наверное лучше нажать паузу, а не прерывание.
Главное, смысл понятен - DebugBreak в месте текущего выполнения кода.
Прошу обратить внимание разработчиков на эту проблему:
Отсутствие возможности у программиста очищать память после использования функций 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? Если это не оценка, конечно))