Как известно, индикатор общего вида имеет структуру
1. Header
Здесь, в частности, определяются глобальные переменные.
2. OnInit
Инициализация - какие-то простые вычисления и т.п.
Вопрос 1: правильно ли я понимаю, что здесь обращаться к переменным окружения типа Bars рано, поскольку история ещё возможно грузится?
3. OnCalculate
Основной код, тик-бай-тик.
4. OnDeinit
Запускается при выгрузке индикатора, смене таймфрейма и т.д.
Вопрос 2: при смене таймфрейма, куда переходит код - в Header или в OnInit? Другими словами, эквивалентна ли смена таймфрейма полной выгрузке индикатора и его повторной загрузке на другой таймфрем, или глобальные переменные, определённые в Header, при выгрузке не изменяются, и надо из обнулять и ре-инициализировать ручками? К примеру, была глобальная переменная Counter которая инициализировалась нулём в Header, и на минутных барах через некоторое время приняла значение 100, и тут пользователь меняет таймфрейм. Что будет, автоматически Counter=0 или так и останется Counter=100?
Несложно проверить, что переинициализация Header не трогает.
Название индикатора тоже не меняется при переинициализации. Вопрос 2 - не про это.
Название индикатора тоже не меняется при переинициализации. Вопрос - не про это.
Вам ответили на вопрос 2. У меня много лет эксплуатируется эта фича.
Спасибо, посмотрю.
Несложно проверить, что переинициализация Header не трогает.
Вот простейший пример, который показывает, что глобальные переменные инициализируются заново при каждом переключении таймфрейма. То есть они принимают значения, прописанные в header. В примере этой глобальной переменной является обычный счётчик обращений к OnInit. Попереключайте таймфреймы, увидите, что он всегда равен 1. Не знаю, что Вы имели ввиду, но я бы сказал, что "переинициализация header трогает", и еще как.
//+------------------------------------------------------------------+ //| TimeFrameSwitchTest.mq4 | //| qomment | //| https://www.mql5.com/ru/users/qomment | //+------------------------------------------------------------------+ #property copyright "qomment" #property link "https://www.mql5.com/ru/users/qomment" #property version "1.00" #property strict #property indicator_chart_window int InitCounter=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { InitCounter++; Comment("TimeFrame=", Period()," InitCounter=", InitCounter); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+
Посмотрите ответ здесь https://docs.mql4.com/ru/runtime/running
При смене символа или таймфрейма графика, к которому эксперт прикреплен, выгрузка и загрузка эксперта не производится. При этом последовательно вызываются обработчики OnDeinit() на старом символе/таймфрейме и OnInit() на новом символе/таймфрейме (если они есть), значения глобальных переменных и статических переменных не сбрасываются. Все события, поступившие для эксперта до завершения инициализации (функции OnInit()), пропускаются.
Я вот тоже пришел к такому же вопросу. Как мне посчитать количество тиков, если при переключении таймфрейма происходит деинициализация глобальных переменных.
int i; int start() { i++; Alert("tik №"+i); return(0); }
Я так понимаю при переключении таймфрейма глобальная переменная i снова принимает значение 0. Как возможно сохранить эти переменные при переключении ТМ?
Возможно конечно сохранять их в переменные на глобальном уровне, но это как то не правильно. Должен быть другой способ. Заранее спасибо.
Я вот тоже пришел к такому же вопросу. Как мне посчитать количество тиков, если при переключении таймфрейма происходит деинициализация глобальных переменных.
Я так понимаю при переключении таймфрейма глобальная переменная i снова принимает значение 0. Как возможно сохранить эти переменные при переключении ТМ?
Возможно конечно сохранять их в переменные на глобальном уровне, но это как то не правильно. Должен быть другой способ. Заранее спасибо.
Наверное все попытки с индикатора? Да, индикатор обновляет переменную
Наверное все попытки с индикатора? Да, индикатор обновляет переменную
Я и спрашиваю, потому что не знаю. Подскажите, если знаете
Я и спрашиваю, потому что не знаю. Подскажите, если знаете
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы про основы - как происходит ре-инициализация индикатора при смене таймфрейма
Vitaly Muzichenko, 2018.04.07 10:41
Наверное все попытки с индикатора? Да, индикатор обновляет переменную
В индикаторе вот такая последовательность действий, поэтому переменная сбрасывается. С советнике - не сбрасывается
Загрузка и выгрузка индикаторов
Индикаторы загружаются в следующих случаях:
- прикрепление индикатора к графику;
- запуск терминала (если индикатор был прикреплен к графику перед предыдущим закрытием терминала);
- загрузка шаблона (если в шаблоне указан прикрепленный к графику индикатор);
- смена профиля (если индикатор прикреплен к одному из графиков профиля);
- смена символа и/или периода графика, к которому прикреплен индикатор;
- после удачной перекомпиляции индикатора, если данный индикатор был прикреплен к графику.
- изменение входных параметров индикатора.
Индикаторы выгружаются в следующих случаях:
- при откреплении индикатора от графика;
- закрытие терминала (если индикатор был прикреплен к графику);
- загрузка шаблона, если к графику прикреплен индикатор;
- закрытие графика, к которому был прикреплен индикатор;
- смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
- смена символа и/или периода графика, к которому прикреплен индикатор;
- изменение входных параметров индикатора.
- docs.mql4.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как известно, индикатор общего вида имеет структуру
1. Header
Здесь, в частности, определяются глобальные переменные.
2. OnInit
Инициализация - какие-то простые вычисления и т.п.
Вопрос 1: правильно ли я понимаю, что здесь обращаться к переменным окружения типа Bars рано, поскольку история ещё возможно грузится?
3. OnCalculate
Основной код, тик-бай-тик.
4. OnDeinit
Запускается при выгрузке индикатора, смене таймфрейма и т.д.
Вопрос 2: при смене таймфрейма, куда переходит код - в Header или в OnInit? Другими словами, эквивалентна ли смена таймфрейма полной выгрузке индикатора и его повторной загрузке на другой таймфрем, или глобальные переменные, определённые в Header, при выгрузке не изменяются, и надо из обнулять и ре-инициализировать ручками? К примеру, была глобальная переменная Counter которая инициализировалась нулём в Header, и на минутных барах через некоторое время приняла значение 100, и тут пользователь меняет таймфрейм. Что будет, автоматически Counter=0 или так и останется Counter=100?