
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Артём, у тебя опечатка в коде (в первой строке вместо testInputInit написан testInputGlobal):
"\n"+"Значение внешней переменной TestInput(",TestInput,"), присвоенное на глобальном уровне: ",(string)testInputGlobal+
Я сейчас чуть попозже приложу ниже другой вариант кода и напишу некоторые уточнения.
Пожалуста, Артём.
Да, согласна, знание об особенностях могут, имхо, порой пригодиться для чего-либо.
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
А зачем при смене таймфрейма сохранять значения? Надо в ините инициализировать, что бы мусор не оставался.
Кто-то давал гарантию, что после смена таймфрема советник или индикатор загружается по тому же адресу, и что в переменных будут полезные значение, а не мусор?
Пожалуста, Артём.
Да, согласна, знание об особенностях могут, имхо, порой пригодиться для чего-либо.
...
То есть, если кратко, в советнике, при первом варианте тестового кода, при смене периода графика не инициализированные переменные в OnInit() не сбрасывались, сохраняя свои значения.
Глобальные в сочетании со статик - интересное поведение (изюминка) в плане фиксации значений глобальных в советнике. Привожу ниже.
Я коды со вторым вариантом изменила, добавив вывод на печать в OnInit(): https://www.mql5.com/ru/forum/162159/page3#comment_3880844
Результаты по второму варианту тестового кода (эксперт exTextInitGlobalVariables_1 и индикатор indTextInitGlobalVariables_1) в озвученном ранее порядке:
Увидела, что после замены прилагаемые коды остались прежними. Сейчас Поэтому снова их удалила. Сохранила тот пост без прилагаемых кодов. Затем снова открыла его правку, прикрепив коды. Сейчас посмотрю, что получилось. Если что, переименую тогда их и снова приложу.
Дополнено: Да, прежние. Переименовала, добавив в окончание слово _copy и перекрепила.
P./S.:
1. Уточню эту фразу: "...не инициализированные переменные в OnInit() не сбрасывались", из своих комментариев к результатам тестов первого и второго вариантов.
Более верно передаёт её смысловое значение следующая перестановка:
" ...не инициализированные в OnInit() переменные - не сбрасывались "
2. А вместо:
"То есть, если кратко, в советнике, при втором варианте тестового кода, при смене периода графика не инициализированные переменные в OnInit() не сбрасывались, сохраняя свои значения. При этом применение ограничения со static переменной фиксирует значения глобальных переменных на заданном уровне. В индикаторе - сбрасываются."
более подходит к тому, что подразумевала по смыслу, следующее (уточнения выделила зелёным цветом шрифта):
"То есть, если кратко, в советнике, при втором варианте тестового кода, при смене периода графика не инициализированные в OnInit() переменные - не сбрасывались. При этом применение ограничения static переменной, находящейся в OnTick, фиксирует значения не инициализированных в OnInit() глобальных переменных на заданных значениях. В индикаторе - сбрасываются."
P./S.:
...Дина, вот эту фразу можно уточнить?
При этом применение ограничения static переменной, находящейся в OnTick, фиксирует значения не инициализированных в OnInit() глобальных переменных на заданных значениях.
Что значит "фиксирует значения"?
Дина, вот эту фразу можно уточнить?
Что значит "фиксирует значения"?
В твоём варианте тестового кода советника и моих его вариантах, после смены периода графика:
При этом, при втором варианте тестового кода, после смены периода графика, условие if (i<2) не выполняется. По логам отображается только то, что выводится на печать в OnInit().
Переменная i объявлена в OnTick(), как static int i = 0.
Если в OnTick() второго тестового кода заменить Print() на Comment(), а в OnDeinit() поставить удаление комментариев, то после смены периода комментариев нет. Но значения переменных зафиксировались на значении 2 (при инпут переменной, равной 0).
Статик - локальна, глобальная - нет.
Для чего можно было бы применить фиксацию подобного рода на практике (глобальная и статик) <= у меня пока не оформившиеся думки как о фильтре.
А зачем при смене таймфрейма сохранять значения? Надо в ините инициализировать, что бы мусор не оставался.
Кто-то давал гарантию, что после смена таймфрема советник или индикатор загружается по тому же адресу, и что в переменных будут полезные значение, а не мусор?
"Инициализация глобальных переменных производится однократно после загрузки программы". Кто откуда знает, при смене таймфрейма выгружается программа и загружается снова, или не выгружается? Допустим, когда окно свойств открывается, еще можно быть уверенным, что программа не выгружается. Но когда таймфрейм меняется? - Кто знает, может выгружается и значения сохраняются чисто случайно.
Ответ получен от СД:
Думаю, можно смело использовать такую особенность глобальных переменных советников.