Согласно документации:
"Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init."
На практике же, голбальная переменная почему-то инициализируется после каждого вызова индикатора с новыми параметрами.
Или при запуске индикатора с новыми параметрами, происходит выгрузка/загрузка индикатора в память? По-моему нет.
Согласно документации:
"Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init."
На практике же, голбальная переменная почему-то инициализируется после каждого вызова индикатора с новыми параметрами.
Загрузка и выгрузка индикаторов
Индикаторы загружаются в следующих случаях:
- прикрепление индикатора к графику;
- запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
- загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
- смена профиля (если индикатор прикреплен к одному из графиков профиля);
- смена символа и/или периода графика, к которому прикреплен индикатор;
- смена счета, к которому подключен терминал;
- после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
- изменение входных параметров индикатора.
Индикаторы выгружаются в следующих случаях:
- при откреплении индикатора от графика;
- закрытие терминала (если индикатор был прикреплен к графику);
- загрузка шаблона, если к графику прикреплен индикатор;
- закрытие графика, к которому был прикреплен индикатор;
- смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
- смена символа и/или периода графика, к которому прикреплен индикатор;
- смена счета, к которому подключен терминал;
- изменение входных параметров индикатора.
Или при запуске индикатора с новыми параметрами, происходит выгрузка/загрузка индикатора в память? По-моему нет.
Да, есть такое) И еще есть, компиляция, если смените в коде инпут переменную и откомпилируете, при этом советник или индюк будет в чарте, изменений не будет, инпут константа переменная, и поэтому тоже происходит переиницилазация при смене входных параметров.
Загрузка и выгрузка индикаторов
Индикаторы загружаются в следующих случаях:
- прикрепление индикатора к графику;
- запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
- загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
- смена профиля (если индикатор прикреплен к одному из графиков профиля);
- смена символа и/или периода графика, к которому прикреплен индикатор;
- смена счета, к которому подключен терминал;
- после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
- изменение входных параметров индикатора.
Индикаторы выгружаются в следующих случаях:
- при откреплении индикатора от графика;
- закрытие терминала (если индикатор был прикреплен к графику);
- загрузка шаблона, если к графику прикреплен индикатор;
- закрытие графика, к которому был прикреплен индикатор;
- смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
- смена символа и/или периода графика, к которому прикреплен индикатор;
- смена счета, к которому подключен терминал;
- изменение входных параметров индикатора.
Спасибо, Но это, документация для MQL5 и в журнале MT5 я вижу запись, что индикатор удаляется и загружается при смене параметров. В МТ4 такой записи нет при смене параметров, но она, например, есть при удалении и добавлении индикатора на график. Поэтому я решила, что в MT4 индикатор не перезагружается после смены параметров, а просто инициализируется с новыми параметрами
Да, есть такое) И еще есть, компиляция, если смените в коде инпут переменную и откомпилируете, при этом советник или индюк будет в чарте, изменений не будет, инпут константа переменная, и поэтому тоже происходит переиницилазация при смене входных параметров.
А разве при переинициализации проиходит перезагрузка?
Да, у индикаторов происходит полная выгрузка экземпляра и загрузка нового экземпляра. Поэтому глобальные переменные не сохраняют свое значение. Такое поведение было изначально в МТ4. Вот у советников все по-другому, там глобальные переменные сохраняются.
Да, у индикаторов происходит полная выгрузка экземпляра и загрузка нового экземпляра. Поэтому глобальные переменные не сохраняют свое значение. Такое поведение было изначально в МТ4. Вот у советников все по-другому, там глобальные переменные сохраняются.
Спасибо, теперь понятно. Я же помню, что в советниках использовала это свойство, а в индикаторе не получились.
Да, у индикаторов происходит полная выгрузка экземпляра и загрузка нового экземпляра. Поэтому глобальные переменные не сохраняют свое значение. Такое поведение было изначально в МТ4. Вот у советников все по-другому, там глобальные переменные сохраняются.
у советников в МТ4 тоже при переинициализации (переключение ТФ, перезагрузка советника, вызов OnInit из OnTick) происходит замена переменных, если они определены/рассчитаны(и это правильно!) в OnInit.
у советников в МТ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.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Согласно документации:
"Инициализация глобальных переменных производится однократно после загрузки программы в память клиентского терминала и перед первой обработкой события Init."
На практике же, голбальная переменная почему-то инициализируется после каждого вызова индикатора с новыми параметрами.