Что не так с глобальными переменными в МТ4?

 

Согласно документации:

"Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init."

На практике же, голбальная переменная почему-то инициализируется после каждого вызова индикатора с новыми параметрами. 

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
События клиентского терминала - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Elena Baranova:

Согласно документации:

"Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init."

На практике же, голбальная переменная почему-то инициализируется после каждого вызова индикатора с новыми параметрами.

Или  при запуске индикатора с новыми параметрами, происходит выгрузка/загрузка индикатора в память? По-моему нет.

 
Elena Baranova:

Согласно документации:

"Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init."

На практике же, голбальная переменная почему-то инициализируется после каждого вызова индикатора с новыми параметрами. 

Загрузка и выгрузка индикаторов

Индикаторы загружаются в следующих случаях:

  • прикрепление индикатора к графику;
  • запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
  • загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
  • смена профиля (если индикатор прикреплен к одному из графиков профиля);
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • смена счета, к которому подключен терминал;
  • после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
  • изменение входных параметров индикатора.

Индикаторы выгружаются в следующих случаях:

  • при откреплении индикатора от графика;
  • закрытие терминала (если индикатор был прикреплен к графику);
  • загрузка шаблона, если к графику прикреплен индикатор;
  • закрытие графика, к которому был прикреплен индикатор;
  • смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • смена счета, к которому подключен терминал;
  • изменение входных параметров индикатора.

https://www.mql5.com/ru/docs/runtime/running

 
Elena Baranova #:

Или  при запуске индикатора с новыми параметрами, происходит выгрузка/загрузка индикатора в память? По-моему нет.

Да, есть такое) И еще есть, компиляция, если смените в коде инпут переменную и откомпилируете, при этом советник или индюк будет в чарте, изменений не будет, инпут константа переменная, и поэтому тоже происходит переиницилазация при смене входных параметров.

 
JRandomTrader #:

Загрузка и выгрузка индикаторов

Индикаторы загружаются в следующих случаях:

  • прикрепление индикатора к графику;
  • запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
  • загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
  • смена профиля (если индикатор прикреплен к одному из графиков профиля);
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • смена счета, к которому подключен терминал;
  • после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
  • изменение входных параметров индикатора.

Индикаторы выгружаются в следующих случаях:

  • при откреплении индикатора от графика;
  • закрытие терминала (если индикатор был прикреплен к графику);
  • загрузка шаблона, если к графику прикреплен индикатор;
  • закрытие графика, к которому был прикреплен индикатор;
  • смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • смена счета, к которому подключен терминал;
  • изменение входных параметров индикатора.

https://www.mql5.com/ru/docs/runtime/running

Спасибо, Но это, документация для MQL5 и в журнале  MT5 я вижу запись, что индикатор удаляется и загружается при смене параметров. В МТ4 такой записи нет при смене параметров, но она, например, есть при удалении и добавлении индикатора на график. Поэтому я решила, что в MT4 индикатор не перезагружается после смены параметров, а просто инициализируется с новыми параметрами

 
Valeriy Yastremskiy #:

Да, есть такое) И еще есть, компиляция, если смените в коде инпут переменную и откомпилируете, при этом советник или индюк будет в чарте, изменений не будет, инпут константа переменная, и поэтому тоже происходит переиницилазация при смене входных параметров.

А разве при переинициализации проиходит перезагрузка?

 
Elena Baranova #:

А разве при переинициализации проиходит перезагрузка?

Да, у индикаторов происходит полная выгрузка экземпляра и загрузка нового экземпляра. Поэтому глобальные переменные не сохраняют свое значение. Такое поведение было изначально в МТ4. Вот у советников все по-другому, там глобальные переменные сохраняются.

 
Ihor Herasko #:

Да, у индикаторов происходит полная выгрузка экземпляра и загрузка нового экземпляра. Поэтому глобальные переменные не сохраняют свое значение. Такое поведение было изначально в МТ4. Вот у советников все по-другому, там глобальные переменные сохраняются.

Спасибо, теперь понятно. Я же помню, что в советниках использовала это свойство, а в индикаторе не получились.

 
Ihor Herasko #:

Да, у индикаторов происходит полная выгрузка экземпляра и загрузка нового экземпляра. Поэтому глобальные переменные не сохраняют свое значение. Такое поведение было изначально в МТ4. Вот у советников все по-другому, там глобальные переменные сохраняются.

у советников в МТ4 тоже при переинициализации (переключение ТФ, перезагрузка советника, вызов OnInit из OnTick) происходит замена переменных, если они определены/рассчитаны(и это правильно!) в OnInit. 

 
Renat Akhtyamov #:

у советников в МТ4 тоже при переинициализации (переключение ТФ, перезагрузка советника, вызов OnInit из OnTick) происходит замена переменных, если они определены/рассчитаны(и это правильно!) в OnInit. 

Речь о значении глобальной переменной, которое было между окончанием OnDeinit() и до начала OnInit(). В индикаторах оно изменится на то значение, которое использовано при инициализациии глобальной переменной, а в советниках - нет.

Вот простой пример:

#property strict

int g_nTest = 5;

int OnInit() 
{
   Print("Value: ", g_nTest);   
   g_nTest = 10;
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason) 
{
   Print(__FUNCTION__, ", reason: ", reason);
}

void OnTick() 
{
}

В момент прикрепления советника к графику в переменной g_nTest будет значение 5. В OnInit() значение меняется на 10, потом происходит смена ТФ графика. После этого в переменной g_nTest оказывается значение 10, а не 5. То есть глобальная переменная советника не изменяет свое значение в момент повторной инициализации, т. к. советник не был выгружен.

0       11:46:45.115    Test_Expert EURUSD,M15: Value: 5
0       11:46:45.115    Test_Expert EURUSD,M15: initialized
0       11:46:58.110    Test_Expert EURUSD,M15: uninit reason 3
0       11:46:58.110    Test_Expert EURUSD,M15: OnDeinit, reason: 3
0       11:46:58.520    Test_Expert EURUSD,M30: Value: 10
0       11:46:58.520    Test_Expert EURUSD,M30: initialized

В индикаторах не так. В момент повторной инициализации переменная g_nTest будет иметь значение 5.

Причина обращения: