Если я меняю символ этого графика на EURAUD путем перетаскивания символа из окна "Обзор рынка", то значение переменной WorkSymbol становится равным "EURAUD", хотя никаких присвоений в OnInit выполнено не было.
Посмотрите в руководстве пользователя, при каких обстоятельствах эксперт переинициализируется. Насколько помню, смена символа графика, к которому присоединён эксперт, ведёт к новой инициализации эксперта.
![Документация по MQL5: Основы языка / Переменные / Глобальные переменные Документация по MQL5: Основы языка / Переменные / Глобальные переменные](/i/community/logo_mql5_small.png)
- www.mql5.com
Да, ведет, и OnInit вызывается еще раз, но при этом глобальные переменные не инициализируются заново. Т.е. на момент вызова OnInit для символа EURAUD значение переменной WorkSymbol уже не равно пустому значению, поэтому условие в OnInit не выполняется, как и команда WorkSymbol = Symbol().
Так как под рукой терминала нет, попробуйте вот эту проверку:
string WorkSymbol = ""; int OnInit() { Print("При запуске OnInit() имеем: WorkSymbol==",WorkSymbol); if (WorkSymbol == "") WorkSymbol = Symbol(); Print("Инициализация для ",WorkSymbol); Print("Перед завершением OnInit() имеем: WorkSymbol==",WorkSymbol); return(0); }
Так как под рукой терминала нет, попробуйте вот эту проверку:
При смене символа и до, и после условного оператора значение WorkSymbol равно новому символу.
Не знаю, как принято на форуме показывать результаты исполнения, я из логовского файла просто копирую:
PP 0 Test (EURUSD,D1) 16:10:25 При запуске OnInit() имеем: WorkSymbol==
KG 0 Test (EURUSD,D1) 16:10:25 Инициализация для EURUSD
LP 0 Test (EURUSD,D1) 16:10:25 Перед завершением OnInit() имеем: WorkSymbol==EURUSD
RK 0 Test (EURAUD,D1) 16:10:43 При запуске OnInit() имеем: WorkSymbol==EURAUD
ES 0 Test (EURAUD,D1) 16:10:43 Инициализация для EURAUD
JD 0 Test (EURAUD,D1) 16:10:43 Перед завершением OnInit() имеем: WorkSymbol==EURAUD
PG 0 111 (EURUSD,H1) 14:15:37 Инициализация для EURUSD
QP 0 111 (EURUSD,H1) 14:15:37 Перед завершением OnInit() имеем: WorkSymbol==EURUSD
IK 0 111 (GBPUSD,H1) 14:16:19 При запуске OnInit() имеем: WorkSymbol==
MM 0 111 (GBPUSD,H1) 14:16:19 Инициализация для GBPUSD
LJ 0 111 (GBPUSD,H1) 14:16:19 Перед завершением OnInit() имеем: WorkSymbol==GBPUSD
LL 0 111 (AUDUSD,H1) 14:16:28 При запуске OnInit() имеем: WorkSymbol==
CH 0 111 (AUDUSD,H1) 14:16:28 Инициализация для AUDUSD
FM 0 111 (AUDUSD,H1) 14:16:28 Перед завершением OnInit() имеем: WorkSymbol==AUDUSD
/*билд 555
IP 0 111 (EURUSD,H1) 14:15:37 При запуске OnInit() имеем: WorkSymbol==
PG 0 111 (EURUSD,H1) 14:15:37 Инициализация для EURUSD
QP 0 111 (EURUSD,H1) 14:15:37 Перед завершением OnInit() имеем: WorkSymbol==EURUSD
IK 0 111 (GBPUSD,H1) 14:16:19 При запуске OnInit() имеем: WorkSymbol==
MM 0 111 (GBPUSD,H1) 14:16:19 Инициализация для GBPUSD
LJ 0 111 (GBPUSD,H1) 14:16:19 Перед завершением OnInit() имеем: WorkSymbol==GBPUSD
LL 0 111 (AUDUSD,H1) 14:16:28 При запуске OnInit() имеем: WorkSymbol==
CH 0 111 (AUDUSD,H1) 14:16:28 Инициализация для AUDUSD
FM 0 111 (AUDUSD,H1) 14:16:28 Перед завершением OnInit() имеем: WorkSymbol==AUDUSD
/*билд 555
ось Виста.
Сделал как у вас написано: "меняю символ этого графика на EURAUD путем перетаскивания символа из окна "Обзор рынка""
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите пожалуйста, где можно почитать подробную информацию про тип string.
В частности прямо сейчас интересно знать, как работает для этого типа оператор "=". Пусть у советника будет такой код:
После размещения советника на графике EURUSD переменной WorkSymbol присвоится значение "EURUSD". Если я меняю символ этого графика на EURAUD путем перетаскивания символа из окна "Обзор рынка", то значение переменной WorkSymbol становится равным "EURAUD", хотя никаких присвоений в OnInit выполнено не было. Отсюда делаю вывод: WorkSymbol - это указатель и при первом запуске он "настраивается" на область памяти, занятую переменной _Symbol. В результате при изменении переменной _Symbol меняется и значение WorkSymbol. Это так или нет? Вопрос может показаться странным, но я когда-то давно на Delphi писал, там оператор присваивания работал для строк иначе (хотя тоже не все так просто, по моему разные переменные могли ссылаться на одну область памяти, но только до тех пор, пока содержимое этого участка памяти не менялось. В случае указанного выше кода содержимое меняется).