Что такое тип string?

 

Подскажите пожалуйста, где можно почитать подробную информацию про тип string.

В частности прямо сейчас интересно знать, как работает для этого типа оператор "=". Пусть у советника будет такой код:

string WorkSymbol = "";

int OnInit()
{
        if (WorkSymbol == "") WorkSymbol = Symbol();
        return(0);
}
void OnDeinit(const int reason)
{

}
void OnTick()
{

}
После размещения советника на графике EURUSD переменной WorkSymbol присвоится значение "EURUSD". Если я меняю символ этого графика на EURAUD путем перетаскивания символа из окна "Обзор рынка", то значение переменной WorkSymbol становится равным "EURAUD", хотя никаких присвоений в OnInit выполнено не было. Отсюда делаю вывод: WorkSymbol - это указатель и при первом  запуске он "настраивается" на область памяти, занятую переменной _Symbol. В результате при изменении переменной _Symbol меняется и значение WorkSymbol. Это так или нет? Вопрос может показаться странным, но я когда-то давно на Delphi писал, там оператор присваивания работал для строк иначе (хотя тоже не все так просто, по моему разные переменные могли ссылаться на одну область памяти, но только до тех пор, пока содержимое этого участка памяти не менялось. В случае указанного выше кода содержимое меняется).
Документация по MQL5: Основы языка / Операторы / Оператор-выражение
Документация по MQL5: Основы языка / Операторы / Оператор-выражение
  • www.mql5.com
Основы языка / Операторы / Оператор-выражение - Документация по MQL5
 
may:
 Если я меняю символ этого графика на EURAUD путем перетаскивания символа из окна "Обзор рынка", то значение переменной WorkSymbol становится равным "EURAUD", хотя никаких присвоений в OnInit выполнено не было.
Посмотрите в руководстве пользователя, при каких обстоятельствах эксперт переинициализируется. Насколько помню, смена символа графика, к которому присоединён эксперт, ведёт к новой инициализации эксперта.
 
Yedelkin:
Посмотрите в руководстве пользователя, при каких обстоятельствах эксперт переинициализируется. Насколько помню, смена символа графика, к которому присоединён эксперт, ведёт к новой инициализации эксперта.
Да, ведет, и OnInit вызывается еще раз, но при этом глобальные переменные не инициализируются заново. Т.е. на момент вызова OnInit для символа EURAUD значение переменной WorkSymbol уже не равно пустому значению, поэтому условие в OnInit не выполняется, как и команда WorkSymbol = Symbol().
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
may:
Да, ведет, и 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);
}
 
Yedelkin:

Так как под рукой терминала нет, попробуйте вот эту проверку:

Я уже выводил результаты, потому и встал такой вопрос. При смене символа и до, и после условного оператора значение WorkSymbol равно новому символу.
 
may:
При смене символа и до, и после условного оператора значение WorkSymbol равно новому символу.
Опечатка? "До условного оператора значение 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
 

 

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

 
ilunga:

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

Сборка та же - 555, ОС - Windows XP 32bit SP3, на разных машинах одинаковый результат. Прошу прощения, но Вы точно меняли символ, а не запускали заново эксперта?
 
may:
Сборка та же - 555, ОС - Windows XP 32bit SP3, на разных машинах одинаковый результат. Прошу прощения, но Вы точно меняли символ, а не запускали заново эксперта?

ось Виста.

Сделал как у вас написано: "меняю символ этого графика на EURAUD путем перетаскивания символа из окна "Обзор рынка""


 
ilunga:

ось Виста.

Сделал как у вас написано: "меняю символ этого графика на EURAUD путем перетаскивания символа из окна "Обзор рынка""

Попробую к разработчикам обратиться. Может это просто баг.
Причина обращения: