Форум » Консультации по программированию » Я в шоке! Подскажите. » Ответить

Я в шоке! Подскажите.

Sergey: Всем привет! Я в шоке! Выпал из рынка на 3,5 месяца, а тут такие перемены. Игорь подскажи, где можно ознакомиться с изменениями в MQL4? Хотел перенести все данные на новый комп, но некоторые индикаторы после компиляции перестают работать. Вот один из них. http://gfile.ru/a8cCP Хотя не перекомпилированные файлы работают. Компиляция ошибок в коде не выявляет. Но при отладке выдается ошибка формирования массива стр.67. Но в чем ошибка не пойму. Буду благодарен, если найдешь время исправить.

Ответов - 204, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 All

Sergey: Как в объектах типа OBJ_EDIT ограничить ввод текста только форматом double?

Scriptong: Пока приходит в голову только вариант со своим полем ввода. То есть использовать OBJ_LABEL (или OBJ_TEXT), для которого подписаться на события нажатия клавиш (обработчик OnChartEvent, событие CHART_EVENT_KEYDOWN). В обработчике проверяется код нажатой клавиши (из параметра lparam) и, если это цифра или точка, то символ копируется в объект. Иначе- пропускается. Но для такого поля ввода не совсем понятно, как сделать, чтобы был виден курсор, да еще и мигал. Для других вариантов нужно смотреть класс CButton (MQL4\Include\Controls\Button.mqh) и думать, есть ли варианты по наследованию и переделке класса.

Sergey: Scriptong пишет: Пока приходит в голову только вариант со своим полем ввода. Спасибо. В целом идея понятна.


Sergey: Есть ли варианты! Нужно чтобы созданные индикатором объекты (вертикальные линии) не перерисовывались при смене ТФ, но удалялись при удалении индикатора с графика. Хочу задать диапазон расчета индикатора, который бы устанавливался перетаскиванием линий и не менялся при смене ТФ.

Scriptong: Нужно анализировать причину деинициализации: void OnDeinit(const int reason) { if (reason != REASON_CHARTCHANGE) { // Удалить объекты } else { // Не удалять объекты } }

Sergey: Scriptong пишет: Нужно анализировать причину деинициализации: Спасибо! Все получилось. void OnDeinit(const int reason) { //---- if (reason==REASON_REMOVE) { ObjectDelete(SIGN_RLINE); ObjectDelete(SIGN_LLINE); } DeleteAllObjects(); //---- return; }

Scriptong: Sergey пишет: Спасибо! Все получилось. М-м. Этот код удаляет объекты в любом случае. Или у Вас какая-то специальная версия функции DeleteAllObjects?

Sergey: Scriptong пишет: Или у Вас какая-то специальная версия функции DeleteAllObjects? Скорее наоборот. DeleteAllObjects отбирает объекты по префиксу, а у вертикальных линий их нет.

Scriptong: Sergey пишет: Скорее наоборот. DeleteAllObjects отбирает объекты по префиксу, а у вертикальных линий их нет. То есть индикатор создает объекты с префиксом. Эти объекты нужно удалять при каждой деинициализации. Также индикатор создает два объекта без префикса. Такие объекты нужно удалять только в случае удаления индикатора с графика. Такая вот логика выходит.

Sergey: Scriptong пишет: То есть индикатор создает объекты с префиксом. Эти объекты нужно удалять при каждой деинициализации. Также индикатор создает два объекта без префикса. Такие объекты нужно удалять только в случае удаления индикатора с графика. Верно. Вроде все просто, но по функционалу получилось круто. Огромное спасибо за помощь!

Sergey: Иногда сталкиваюсь с проблемами, когда при компиляции ошибок не выдается, но индикатор не работает должным образом или сильно тормозит комп. (при смене ТФ, смене символа, перезагрузки компа). Причины могут быть разные - не верно заданные размеры массивов, нехватка глубины исторических данных и много чего еще. Такие ошибки я ищу с помощью меток (Alert). Существует ли другая технология поиска скрытых ошибок? Как пользоваться "Отладкой" - слово обнадеживающее, а функционал не понятен. Где обо всем об этом можно узнать?

Scriptong: Sergey пишет: Существует ли другая технология поиска скрытых ошибок? Технология одна и та же - как можно подробнее вывести в журнал значения переменных и проследить по этим сообщениям маршрут выполнения программы. Если программа достаточно большая, то сначала распечатываются данные по основным блокам с целью нахождения проблемного блока, а затем переход на более низкий уровень (внутри проблемного блока) распечатки значений. И так до тех пор, пока не будет найдена ошибка. Sergey пишет: Как пользоваться "Отладкой" - слово обнадеживающее, а функционал не понятен. Где обо всем об этом можно узнать? Первоисточник описания всегда следует искать в том месте, где находится функционал, требующий описания. Так как отладчик является частью Meta Editor, то необходимо зайти в пункт меню "Справка" ME, нажать "Вызов справки", а затем просмотреть содержание. В данном случае путь к описанию таков: MetaEditor -> Разработка программ -> Отладка. Там дана первичная информация, так сказать, общее описание. Более подробно пример работы с отладчиком описан в статье "Отладка программ на MQL5". Отладка в МТ4 и МТ5 - процесс практически идентичный. На данный момент проблема отладки - невозможность использования ее в тестере. Поэтому, чаще всего, отладчик оказывается не у дел.

Sergey: Scriptong пишет: Технология одна и та же - как можно подробнее вывести в журнал значения переменных и проследить по этим сообщениям маршрут выполнения программы... Спасибо! Давно собирался задать этот вопрос, но все не решался.

Linker: В МТ5 уже доступна отладка на исторических данных, видимо будет и на МТ4.

Scriptong: Linker пишет: В МТ5 уже доступна отладка на исторических данных, видимо будет и на МТ4. Да, как раз недавно анонсирована. Так что ждем...



полная версия страницы