Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Привык пользоваться стандартной библиотекой? В MQL5 она тоже есть!
ivan
505
ivan 2014.07.04 13:00 

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

1. Header

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

2. OnInit

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

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

3. OnCalculate

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

4. OnDeinit

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

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

Mislaid
553
Mislaid 2014.07.04 14:22  
qomment:

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

1. Header

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

2. OnInit

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

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

3. OnCalculate

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

4. OnDeinit

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

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

 

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

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

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

Спасибо, посмотрю. 
ivan
505
ivan 2014.07.05 15:33  
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)
  {

  }
//+------------------------------------------------------------------+
Ruslan
61
Ruslan 2015.03.11 16:36  

Посмотрите ответ здесь https://docs.mql4.com/ru/runtime/running

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

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий