Вопросы про основы - как происходит ре-инициализация индикатора при смене таймфрейма

 

Как известно, индикатор общего вида имеет структуру 

1. Header

Здесь, в частности, определяются глобальные переменные. 

2. OnInit

Инициализация - какие-то простые вычисления и т.п.

Вопрос 1: правильно ли я понимаю, что здесь обращаться к переменным окружения типа Bars рано, поскольку история ещё возможно грузится?

3. OnCalculate

Основной код, тик-бай-тик.

4. OnDeinit

Запускается при выгрузке индикатора, смене таймфрейма и т.д.

Вопрос 2: при смене таймфрейма, куда переходит код - в Header или в OnInit? Другими словами, эквивалентна ли смена таймфрейма полной выгрузке индикатора и его повторной загрузке на другой таймфрем, или глобальные переменные, определённые в Header, при выгрузке не изменяются, и надо из обнулять и ре-инициализировать ручками? К примеру, была глобальная переменная Counter которая инициализировалась нулём в Header, и на минутных барах через некоторое время приняла значение 100, и тут пользователь меняет таймфрейм. Что будет, автоматически Counter=0 или так и останется Counter=100?

 
qomment:

Как известно, индикатор общего вида имеет структуру 

1. Header

Здесь, в частности, определяются глобальные переменные. 

2. OnInit

Инициализация - какие-то простые вычисления и т.п.

Вопрос 1: правильно ли я понимаю, что здесь обращаться к переменным окружения типа Bars рано, поскольку история ещё возможно грузится?

3. OnCalculate

Основной код, тик-бай-тик.

4. OnDeinit

Запускается при выгрузке индикатора, смене таймфрейма и т.д.

Вопрос 2: при смене таймфрейма, куда переходит код - в Header или в OnInit? Другими словами, эквивалентна ли смена таймфрейма полной выгрузке индикатора и его повторной загрузке на другой таймфрем, или глобальные переменные, определённые в Header, при выгрузке не изменяются, и надо из обнулять и ре-инициализировать ручками? К примеру, была глобальная переменная Counter которая инициализировалась нулём в Header, и на минутных барах через некоторое время приняла значение 100, и тут пользователь меняет таймфрейм. Что будет, автоматически Counter=0 или так и останется Counter=100?

 

Несложно проверить, что переинициализация Header не трогает.
 
Mislaid:
Несложно проверить, что переинициализация Header не трогает.

Название индикатора тоже не меняется при переинициализации. Вопрос 2 - не про это. 
 
qomment:

Название индикатора тоже не меняется при переинициализации. Вопрос - не про это. 
Вам ответили на вопрос 2.  У меня много лет эксплуатируется эта фича. 
 
Mislaid:
Вам ответили на вопрос 2.  У меня много лет эксплуатируется эта фича. 

Спасибо, посмотрю. 
 
Mislaid:
Несложно проверить, что переинициализация 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. Как возможно сохранить эти переменные при переключении ТМ?

Возможно конечно сохранять их в  переменные на глобальном уровне, но это как то не правильно. Должен быть другой способ. Заранее спасибо.

 
Ivan Kornaukhov:

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

Я так понимаю при переключении таймфрейма глобальная переменная i снова принимает значение 0. Как возможно сохранить эти переменные при переключении ТМ?

Возможно конечно сохранять их в  переменные на глобальном уровне, но это как то не правильно. Должен быть другой способ. Заранее спасибо.

Наверное все попытки с индикатора? Да, индикатор обновляет переменную

 
Vitaly Muzichenko:

Наверное все попытки с индикатора? Да, индикатор обновляет переменную

Я и спрашиваю, потому что не знаю. Подскажите, если знаете

 
Ivan Kornaukhov:

Я и спрашиваю, потому что не знаю. Подскажите, если знаете

В индикаторе вот такая последовательность действий, поэтому переменная сбрасывается. С советнике - не сбрасывается

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

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

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

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

  • при откреплении индикатора от графика;
  • закрытие терминала (если индикатор был прикреплен к графику);
  • загрузка шаблона, если к графику прикреплен индикатор;
  • закрытие графика, к которому был прикреплен индикатор;
  • смена профиля, если индикатор прикреплен к одному из графиков сменяемого профиля;
  • смена символа и/или периода графика, к которому прикреплен индикатор;
  • изменение входных параметров индикатора.
Input переменные - Переменные - Основы языка - Справочник MQL4
Input переменные - Переменные - Основы языка - Справочник MQL4
  • docs.mql4.com
указывается перед типом данных. Изменять значение переменной с модификатором input внутри mql4-программы нельзя, такие переменные доступны только для чтения. Изменять значения input-переменных может только пользователь из окна свойств программы. Внешние переменные всегда переинициализируются непосредственно перед вызовом OnInit().   Существует...