Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Да, интересный вопрос. В Справочнике полуторагодовой давности нашёл вот такой абзац:
"При смене символа или ТФ графика, к которому прикреплён эксперт, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/ТФ и OnInit() на новом символе/ТФ (если они есть), значения глобальных переменных и статических переменных не сбрасываются". Если под "глобальными переменными" подразумеваются переменные, объявленные на глобальном уровне программы, то в примере они не только "сбрасываются", но и выдают разные значения у разных пользователей.
Попробую к разработчикам обратиться. Может это просто баг.
Спасибо за сообщение. Разбираемся.
Спасибо!
Может быть еще ссылками на более подробное описание типа string поможете? А то я с языком C++ лет уж 12 как не сталкивался, MQL первую неделю вижу, да и вообще уже лет 6 не пишу. И потом мне не очевидно, что string в Borland Builder и string MQL - это одно и то же. Хочется понимать, чем оперируешь...
Сама по себе проблема у меня возникла из-за того, что мне нужно в эксперте разделить обработку смены символа и смены периода (жаль, что для этих событий в DeInit приходит один и тот же параметр). Поэтому мне нужно запомнить начальный символ и возвращать его значение каждый раз, когда пользователь пытается символ сменить (тут тоже хотелось бы иметь у графика свойство типа AllowSymbolChange и AllowPeriodChange)
Так и должно быть. Справка:
Возвращает имя символа текущего графика.
string Symbol();
Возвращаемое значение
Значение системной переменной _Symbol, в которой хранится имя символа текущего графика.
Вы присваиваете переменной WorkSymbol значение функции Symbol().
Вот если бы Вы своей переменной присвоили значение так WorkSymbol = "EURUSD" , то при смене графика значение Вашей переменной не поменялось бы.
Такое объяснение вряд ли проясняет ситуацию с тем, что под Вистой приведенный мной код работает не так, как под XP. У меня есть 2 предположения, почему происходит так, как происходит. 1 - тип string суть всего лишь указатель и оператор "=" для него просто настраивает этот указатель на участок памяти, определенный правым аргументом оператора. Но что-то подсказывает мне, что это не так и для типа string существует диспетчер памяти, который управляет всей этой суетой с указателями, когда надо - выделяет память и копирует данные, когда не надо - пользуется одной и той же областью, при необходимости - освобождает память и выполняет прочие полезные вещи. Вот этот диспетчер, кажется, в моем случае отрабатывает неправильно. Он бы должен был выделить необходимое кол-во памяти для переменной WorkSymbol и скопировать туда содержимое _Symbol (или результат Symbol()). И после этого содержимое переменной WorkSymbol меняться уже не должно до тех пор, пока эксперт не будет перегружен по полной программе (с переинициализацией переменных)
Так и должно быть. Вы присваиваете переменной WorkSymbol значение функции Symbol().
Так не должно быть (С) :)
Посмотрите внимательнее код: значение функции Symbol() присваивается переменной WorkSymbol не просто так, а при выполнении определённого условия.
...Запустил дома проверочный код; результаты аналогичны результатам may. Win7(64). Новый символ распечатывается как до проверки этого условия, так и после. Как такое может быть, если условие выглядит следующим образом:
?Вопрос по размеру памяти для типа string.
В MQL4 длина строковой константы составляет от 0 до 255 символов.
В MQL5 разработчик не указывает допустимую длину, если не ошибаюсь...
Из справки объём памяти тип string забирает в 12 байт. Но длина строки, как попробовал, может быть большой. Где ограничение?
Объявлять переменные вверху.
Обнулять в OnInit.
Когда меняется график, то эксперт выгружается, т.е. все его переменные уничтожаются. И происходит новая инициализация эксперта. Посмотрите первую строчку кода в первом посту темы. Поэтому условие в OnInit() будет выполняться всегда. Берите свои слова обратно.