Инициализация глобальных переменных программы и другие полезные знания. - страница 4

 
Dina Paches:

Артём, у тебя опечатка в коде (в первой строке вместо testInputInit написан testInputGlobal):

"\n"+"Значение внешней переменной TestInput(",TestInput,"), присвоенное в OnInit(): ",(string)testInputGlobal+
"\n"+"Значение внешней переменной TestInput(",TestInput,"), присвоенное на глобальном уровне: ",(string)testInputGlobal+

Я сейчас чуть попозже приложу ниже другой вариант кода и напишу некоторые уточнения. 

Спасибо, Дина.
 

Пожалуста, Артём. 

Да, согласна, знание об особенностях могут, имхо, порой пригодиться для чего-либо.

Ниже результаты по первому варианту тестового кода (эксперт exTextInitGlobalVariables_0 и индикатор indTextInitGlobalVariables_0) в озвученном ранее порядке:

1. Эксперт exTextInitGlobalVariables_0. Записи после первого запуска на график. Значения переменных одинаковы (сброшенные):
exTextInitGlobalVariables_0 (EURUSD.m,M5)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M5)       # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
exTextInitGlobalVariables_0 (EURUSD.m,M5)       # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_0 (EURUSD.m,M5)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M5)       # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
exTextInitGlobalVariables_0 (EURUSD.m,M5)       # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
exTextInitGlobalVariables_0 (EURUSD.m,M5)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M5)       # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_0 (EURUSD.m,M5)       # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
2. Поменяла несколько раз период графика. Не инициализированные в OnInit() не сбросились:
exTextInitGlobalVariables_0 (EURUSD.m,H1)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 5
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_0 (EURUSD.m,H1)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 5
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 5
exTextInitGlobalVariables_0 (EURUSD.m,H1)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
3. Удалила этот тестовый эксперт с графика.
4. Заново его запустила /* чтобы видеть при запуске, не сохранились ли значения от предыдущего запуска*/
Значения одинаковы (сброшенные):
exTextInitGlobalVariables_0 (EURUSD.m,H1)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_0 (EURUSD.m,H1)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
exTextInitGlobalVariables_0 (EURUSD.m,H1)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_0 (EURUSD.m,H1)       # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
5. Затем несколько раз сменила период графика. Не инициализированные в OnInit() не сбросились:
exTextInitGlobalVariables_0 (EURUSD.m,M2)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M2)       # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 3
exTextInitGlobalVariables_0 (EURUSD.m,M2)       # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_0 (EURUSD.m,M2)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M2)       # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 3
exTextInitGlobalVariables_0 (EURUSD.m,M2)       # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 3
exTextInitGlobalVariables_0 (EURUSD.m,M2)       =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M2)       # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_0 (EURUSD.m,M2)       # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
6. Не удаляю с графика тестовый советник с первым вариантом кода, имеющий те же имена переменных, что и индикатор, который запускаю следующим шагом на график. 
7. Запустила на график прилагаемый первый тестовый код в виде индикатора indTextInitGlobalVariables_0. 
Чтобы не приводить повторного, просто скажу, что такой же результат у меня по этому пункту у индикатора с первым тестовым кодом и если предварительно удалять с графика эксперт, содержащий переменные с теми же именами, но имеющие другие "накопленные" значения.
indTextInitGlobalVariables_0 (EURUSD.m,M2)      =============================================
indTextInitGlobalVariables_0 (EURUSD.m,M2)      # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
indTextInitGlobalVariables_0 (EURUSD.m,M2)      # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
indTextInitGlobalVariables_0 (EURUSD.m,M2)      =============================================
indTextInitGlobalVariables_0 (EURUSD.m,M2)      # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
indTextInitGlobalVariables_0 (EURUSD.m,M2)      # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
indTextInitGlobalVariables_0 (EURUSD.m,M2)      =============================================
indTextInitGlobalVariables_0 (EURUSD.m,M2)      # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
indTextInitGlobalVariables_0 (EURUSD.m,M2)      # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
8. Сменила период графика. 
Индикатор сбросил значения. Не удалённый советник не сбросил
indTextInitGlobalVariables_0 (EURUSD.m,M15)     =============================================
indTextInitGlobalVariables_0 (EURUSD.m,M15)     # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
indTextInitGlobalVariables_0 (EURUSD.m,M15)     # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
indTextInitGlobalVariables_0 (EURUSD.m,M15)     =============================================
indTextInitGlobalVariables_0 (EURUSD.m,M15)     # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
indTextInitGlobalVariables_0 (EURUSD.m,M15)     # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
indTextInitGlobalVariables_0 (EURUSD.m,M15)     =============================================
indTextInitGlobalVariables_0 (EURUSD.m,M15)     # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
indTextInitGlobalVariables_0 (EURUSD.m,M15)     # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
exTextInitGlobalVariables_0 (EURUSD.m,M15)      
exTextInitGlobalVariables_0 (EURUSD.m,M15)      =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M15)      # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 4
exTextInitGlobalVariables_0 (EURUSD.m,M15)      # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_0 (EURUSD.m,M15)      =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M15)      # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 4
exTextInitGlobalVariables_0 (EURUSD.m,M15)      # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 4
exTextInitGlobalVariables_0 (EURUSD.m,M15)      =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M15)      # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_0 (EURUSD.m,M15)      # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
9. Удалила тестовый индикатор с графика. Затем (советник ещё остался на графике), сменила период графика:
exTextInitGlobalVariables_0 (EURUSD.m,M30)      =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M30)      # 0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 5
exTextInitGlobalVariables_0 (EURUSD.m,M30)      # 1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_0 (EURUSD.m,M30)      =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M30)      # 2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 5
exTextInitGlobalVariables_0 (EURUSD.m,M30)      # 3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 5
exTextInitGlobalVariables_0 (EURUSD.m,M30)      =============================================
exTextInitGlobalVariables_0 (EURUSD.m,M30)      # 4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_0 (EURUSD.m,M30)      # 5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
То есть, если кратко, в советнике, при первом варианте тестового кода, при смене периода графика н
е инициализированные переменные в OnInit() не сбрасывались, сохраняя свои значения.
В индикаторе - сбрасываются.
Дополнила: тест проводила в build 1486
 
Dmitry Fedoseev:

А зачем при смене таймфрейма сохранять значения? Надо в ините инициализировать, что бы мусор не оставался.

Кто-то давал гарантию, что после смена таймфрема советник или индикатор загружается по тому же адресу, и что в переменных будут полезные значение, а не мусор?

Создал заявку в Сервисдеск с таким вопросом.
 
Dina Paches:

Пожалуста, Артём. 

Да, согласна, знание об особенностях могут, имхо, порой пригодиться для чего-либо.

Ниже результаты по первому варианту тестового кода (эксперт exTextInitGlobalVariables_0 и индикатор indTextInitGlobalVariables_0)  в озвученном ранее порядке:

...

То есть, если кратко, в советнике, при первом варианте тестового кода, при смене периода графика не инициализированные переменные в OnInit() не сбрасывались, сохраняя свои значения.

В индикаторе - сбрасываются.

По второму тестовому коду - чуть позже.
Спасибо, Дина. Жду ответа по данному вопросу от сервисдеск - заявка принята к рассмотрению.
 
Artyom Trishkin:

Глобальные в сочетании со статик - интересное поведение (изюминка) в плане фиксации значений глобальных в советнике. Привожу ниже. 

Я коды со вторым вариантом изменила, добавив вывод на печать в OnInit(): https://www.mql5.com/ru/forum/162159/page3#comment_3880844

Результаты по второму варианту тестового кода (эксперт exTextInitGlobalVariables_1 и индикатор indTextInitGlobalVariables_1)  в озвученном ранее порядке:

1. Эксперт exTextInitGlobalVariables_1. Записи после первого запуска на график. Значения переменных одинаковы (сброшенные)
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       0 OnIn Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 0
exTextInitGlobalVariables_1 (EURUSD.m,M1)       1 OnIn Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 0
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       2 OnIn Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 0
exTextInitGlobalVariables_1 (EURUSD.m,M1)       3 OnIn Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 0
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       4 OnIn Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 0
exTextInitGlobalVariables_1 (EURUSD.m,M1)       5 OnIn Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 0
exTextInitGlobalVariables_1 (EURUSD.m,M1)       
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
exTextInitGlobalVariables_1 (EURUSD.m,M1)       1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
exTextInitGlobalVariables_1 (EURUSD.m,M1)       3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_1 (EURUSD.m,M1)       5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
exTextInitGlobalVariables_1 (EURUSD.m,M1)       static int i = 0
exTextInitGlobalVariables_1 (EURUSD.m,M1)       
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 2
exTextInitGlobalVariables_1 (EURUSD.m,M1)       1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 2
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 2
exTextInitGlobalVariables_1 (EURUSD.m,M1)       3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 2
exTextInitGlobalVariables_1 (EURUSD.m,M1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,M1)       4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 2
exTextInitGlobalVariables_1 (EURUSD.m,M1)       5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 2
exTextInitGlobalVariables_1 (EURUSD.m,M1)       static int i = 1
2. Поменяла несколько раз период графика. Переменная, объявленная в OnTick как static int i=не сбросилась, поэтому новых записей в логе по OnTick() нет. Есть только по OnInit()
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       0 OnIn Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       1 OnIn Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       2 OnIn Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       3 OnIn Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       4 OnIn Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       5 OnIn Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 0
3. Удалила этот тестовый эксперт с графика.
4. Заново его запустила /* чтобы видеть при запуске, не сохранились ли значения от предыдущего запуска*/
Значения одинаковы (сброшенные):
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       0 OnIn Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       1 OnIn Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       2 OnIn Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       3 OnIn Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       4 OnIn Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       5 OnIn Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
exTextInitGlobalVariables_1 (EURUSD.m,D1)       1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
exTextInitGlobalVariables_1 (EURUSD.m,D1)       3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
exTextInitGlobalVariables_1 (EURUSD.m,D1)       5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
exTextInitGlobalVariables_1 (EURUSD.m,D1)       static int i = 0
exTextInitGlobalVariables_1 (EURUSD.m,D1)       
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,D1)       4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 2
exTextInitGlobalVariables_1 (EURUSD.m,D1)       static int i = 1
5. Затем несколько раз сменила период графика. Не инициализированные в OnInit() не сбросились. Переменная, объявленная в OnTick как static int i=не сбросилась. Поэтому новых записей в логе по OnTick() нет. Есть только по OnInit()
exTextInitGlobalVariables_1 (EURUSD.m,H3)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,H3)       0 OnIn Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 2
exTextInitGlobalVariables_1 (EURUSD.m,H3)       1 OnIn Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 0
exTextInitGlobalVariables_1 (EURUSD.m,H3)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,H3)       2 OnIn Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 2
exTextInitGlobalVariables_1 (EURUSD.m,H3)       3 OnIn Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 2
exTextInitGlobalVariables_1 (EURUSD.m,H3)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,H3)       4 OnIn Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 0
exTextInitGlobalVariables_1 (EURUSD.m,H3)       5 OnIn Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 0
6. Не удаляю с графика тестовый советник со вторым вариантом кода, имеющий те же имена переменных, что и индикатор, который запускаю следующим шагом на график. 
7. Запустила на график прилагаемый второй тестовый код в виде индикатора indTextInitGlobalVariables_1. 
Чтобы не приводить повторного - такой же результат у меня по этому пункту у индикатора со вторым тестовым кодом и если предварительно удалять с графика эксперт, содержащий переменные с теми же именами и имеющими "накопленные значения".
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      0 OnIn Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 0
indTextInitGlobalVariables_1 (EURUSD.m,H3)      1 OnIn Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 0
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      2 OnIn Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 0
indTextInitGlobalVariables_1 (EURUSD.m,H3)      3 OnIn Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 0
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      4 OnIn Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 0
indTextInitGlobalVariables_1 (EURUSD.m,H3)      5 OnIn Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 0
indTextInitGlobalVariables_1 (EURUSD.m,H3)      
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
indTextInitGlobalVariables_1 (EURUSD.m,H3)      1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
indTextInitGlobalVariables_1 (EURUSD.m,H3)      3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
indTextInitGlobalVariables_1 (EURUSD.m,H3)      5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
indTextInitGlobalVariables_1 (EURUSD.m,H3)      static int i = 0
indTextInitGlobalVariables_1 (EURUSD.m,H3)      
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 2
indTextInitGlobalVariables_1 (EURUSD.m,H3)      1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 2
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 2
indTextInitGlobalVariables_1 (EURUSD.m,H3)      3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 2
indTextInitGlobalVariables_1 (EURUSD.m,H3)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H3)      4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 2
indTextInitGlobalVariables_1 (EURUSD.m,H3)      5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 2
indTextInitGlobalVariables_1 (EURUSD.m,H3)      static int i = 1
8. Сменила период графика. 
Индикатор сбросил значения. Не удалённый советник не сбросил. В советнике переменная, объявленная в OnTick как static int i=не сбросилась. Поэтому новых записей в логе по нему в OnTick() нет, есть только по OnInit()
exTextInitGlobalVariables_1 (EURUSD.m,H2)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,H2)       0 OnIn Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 2
exTextInitGlobalVariables_1 (EURUSD.m,H2)       1 OnIn Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 0
exTextInitGlobalVariables_1 (EURUSD.m,H2)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,H2)       2 OnIn Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 2
exTextInitGlobalVariables_1 (EURUSD.m,H2)       3 OnIn Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 2
exTextInitGlobalVariables_1 (EURUSD.m,H2)       =============================================
exTextInitGlobalVariables_1 (EURUSD.m,H2)       4 OnIn Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 0
exTextInitGlobalVariables_1 (EURUSD.m,H2)       5 OnIn Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      0 OnIn Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      1 OnIn Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      2 OnIn Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      3 OnIn Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      4 OnIn Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      5 OnIn Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 1
indTextInitGlobalVariables_1 (EURUSD.m,H2)      1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 1
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 1
indTextInitGlobalVariables_1 (EURUSD.m,H2)      3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 1
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 1
indTextInitGlobalVariables_1 (EURUSD.m,H2)      5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 1
indTextInitGlobalVariables_1 (EURUSD.m,H2)      static int i = 0
indTextInitGlobalVariables_1 (EURUSD.m,H2)      
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      0 Значение внешней переменной TestInput(0), присвоенное на глобальном уровне (testInputGlobal_0): 2
indTextInitGlobalVariables_1 (EURUSD.m,H2)      1 Значение внешней переменной TestInput(0), присвоенное в OnInit() (testInputInit_1): 2
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      2 Не инициализирована значением нигде (неявная инициализация нулём) (TestValueGlobalNoInitNo_2): 2
indTextInitGlobalVariables_1 (EURUSD.m,H2)      3 Инициализирована значением 0 при объявлении, не инициализирована в OnInit() (TestValueGlobalYesInitNo_3): 2
indTextInitGlobalVariables_1 (EURUSD.m,H2)      =============================================
indTextInitGlobalVariables_1 (EURUSD.m,H2)      4 Не инициализирована значением при объявлении, инициализирована в OnInit() нулём (TestValueGlobalNoInitYes_4): 2
indTextInitGlobalVariables_1 (EURUSD.m,H2)      5 Инициализирована нулём и при объявлении, и в OnInit() (TestValueGlobalYesInitYes_5): 2
indTextInitGlobalVariables_1 (EURUSD.m,H2)      static int i = 1
9. Удалила с графика тестовые индикатор и советник.
То есть, если кратко, в советнике, при втором варианте тестового кода, при смене периода графика не инициализированные переменные в OnInit() не сбрасывались, сохраняя свои значения. При этом применение ограничения со static переменной фиксирует значения глобальных переменных на заданном уровне. В индикаторе - сбрасываются.
Как-то так.
 

Увидела, что после замены прилагаемые коды остались прежними. Сейчас Поэтому снова их удалила. Сохранила тот пост без прилагаемых кодов. Затем снова открыла его правку, прикрепив коды. Сейчас посмотрю, что получилось. Если что, переименую тогда их и снова приложу.

Дополнено: Да, прежние. Переименовала, добавив в окончание слово _copy и перекрепила. 

 

P./S.: 

1. Уточню эту фразу: "...не инициализированные переменные в OnInit() не сбрасывались", из своих комментариев к результатам тестов первого и второго вариантов.

Более верно передаёт её смысловое значение следующая перестановка:

" ...не инициализированные в OnInit() переменные - не сбрасывались "

2. А вместо: 

"То есть, если кратко, в советнике, при втором варианте тестового кода, при смене периода графика не инициализированные переменные в OnInit() не сбрасывались, сохраняя свои значения. При этом применение ограничения со static переменной фиксирует значения глобальных переменных на заданном уровне. В индикаторе - сбрасываются."

более подходит к тому, что подразумевала по смыслу, следующее (уточнения выделила зелёным цветом шрифта): 

"То есть, если кратко, в советнике, при втором варианте тестового кода, при смене периода графика не инициализированные в OnInit() переменные - не сбрасывались. При этом применение ограничения static переменной, находящейся в OnTick, фиксирует значения не инициализированных в OnInit() глобальных переменных на заданных значениях. В индикаторе - сбрасываются."

 
Dina Paches:

P./S.: 

...

Дина, вот эту фразу можно уточнить?

При этом применение ограничения static переменной, находящейся в OnTick, фиксирует значения не инициализированных в OnInit() глобальных переменных на заданных значениях.

Что значит "фиксирует значения"?

 
Artyom Trishkin:

Дина, вот эту фразу можно уточнить?

Что значит "фиксирует значения"?

В твоём варианте тестового кода советника и моих его вариантах, после смены периода графика:

  • сбрасываются значения тех глобальных переменных, что были проинициализированы в OnInit();
  • не сбрасываются значения тех глобальных переменных, что не были проинициализированы в OnInit(). 

При этом, при втором варианте тестового кода, после смены периода графика, условие if (i<2) не выполняется. По логам отображается только то, что выводится на печать в OnInit().

Переменная i объявлена в OnTick(), как static int i = 0. 

Если в OnTick() второго тестового кода заменить Print() на Comment(), а в OnDeinit() поставить удаление комментариев, то после смены периода комментариев нет. Но значения переменных зафиксировались на значении 2 (при инпут переменной, равной 0).

Статик - локальна, глобальная - нет.

Для чего можно было бы применить фиксацию подобного рода на практике (глобальная и статик) <= у меня пока не оформившиеся думки как о фильтре.

P./S.: Удалила приводимые здесь отрывки выкопировок кода и результатов. А то за ними про фиксацию затерялось.
 
Dmitry Fedoseev:

А зачем при смене таймфрейма сохранять значения? Надо в ините инициализировать, что бы мусор не оставался.

Кто-то давал гарантию, что после смена таймфрема советник или индикатор загружается по тому же адресу, и что в переменных будут полезные значение, а не мусор?

Dmitry Fedoseev:
"Инициализация глобальных переменных производится однократно после загрузки программы". Кто откуда знает, при смене таймфрейма выгружается программа и загружается снова, или не выгружается? Допустим, когда окно свойств открывается, еще можно быть уверенным, что программа не выгружается. Но когда таймфрейм меняется? - Кто знает, может выгружается и значения сохраняются чисто случайно.

Ответ получен от СД:


Думаю, можно смело использовать такую особенность глобальных переменных советников.

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