Разные значения индикатора после переключения таймфрейма и обратно

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

Как индикатор может рассчитывать разные значения на одном и том же таймфрейме? Почему при многократном переключении значения перестают меняться?
В чем может быть причина? 
 
Mikhail Nazarenko:
Столкнулся с проблемой: данные индикатора отличаются если переключить с таймфрейма на любой другой и опять вернуться на обратно на исходный. Причем если продолжать переключаться туда сюда, значение индикатора стабилизируется и перестает меняться.

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

Возможные причины: 

1. Где-то не сбрасываются глобальные переменные;

Пожалуй, больше на ум ничего не приходит) 

 
tapo #:

Возможные причины: 

1. Где-то не сбрасываются глобальные переменные;

Пожалуй, больше на ум ничего не приходит) 

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

 
Mikhail Nazarenko #:

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

инициализировать?

разные значения на новом тике, может только если индикатор считает с далекого бара на более высоком TF, иначе быть не должно

если проблема в подгрузке истории, то используйте скрипт из справки 

https://www.mql5.com/ru/docs/series/timeseries_access

на мультисимволе это должно быть на каждом запуске робота

Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
Документация по MQL5: Доступ к таймсериям и индикаторам / Организация доступа к данным
  • www.mql5.com
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

загрузка скрипта примерно так выглядит

//+------------------------------------------------------------------+
//| Вызов загрузки истории                                           |
//+------------------------------------------------------------------+
void LoadingHistory()
  {
   if(LoadHistory) // в input разрешение
     {
      //--- Загрузка истории
      for(int s=0; s<TRADE_SYMBOLS; s++)
        {
         //--- Проверка символа
         if(Symbols[s]!="")
            //---
            History(Symbols[s],PERIOD_H1,D'2020.01.01');
        }
     }
//иначе выходим
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void History(string InpLoadedSymbol,ENUM_TIMEFRAMES InpLoadedPeriod,datetime InpStartDate)
  {
//   Print("Start load ",InpLoadedSymbol+","+GetPeriodName(InpLoadedPeriod)," from ",InpStartDate);
//---
   int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
   switch(res)
 
lynxntech #:

инициализировать?

разные значения на новом тике, может только если индикатор считает с далекого бара на более высоком TF, иначе быть не должно

если проблема в подгрузке истории, то используйте скрипт из справки 

https://www.mql5.com/ru/docs/series/timeseries_access

на мультисимволе это должно быть на каждом запуске робота

Спасибо за вариант. Буду методом тыка искать проблему.

Попробую при инициализации проверить наличие исторических данных.

 
Mikhail Nazarenko #:

Спасибо за вариант. Буду методом тыка искать проблему.

Попробую при инициализации проверить наличие исторических данных.

Рекомендую использовать этот скрипт, терминал оптимизируется и не всегда загружает нужную историю, есть лимиты, пока не крутанешь график или переключение на высокие TF, история для длиннорасчетных индикаторов не загрузится сама.

Скрипт из справки гарантированно загрузит историю с указанной даты. Интегрированный скрипт при запуске мгновенно проверит кол-во загруженной истории, и если ее нет - подгрузит. Это неотъемлемая часть работы робота

 
Mikhail Nazarenko:
Столкнулся с проблемой: данные индикатора отличаются если переключить с таймфрейма на любой другой и опять вернуться на обратно на исходный. Причем если продолжать переключаться туда сюда, значение индикатора стабилизируется и перестает меняться.

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

Постарайтесь обходиться без глобальных переменных. Глобальные переменные как правило, это зло. Переделайте логику работы индикатора в класс, создавайте объект класса в инициализирующей функции и удаляйте в деинициализаторе. Таким образом, вы получите 100% повторяемость при каждом переключении.

 
Mikhail Nazarenko #:

Спасибо за вариант. Буду методом тыка искать проблему.

Попробую при инициализации проверить наличие исторических данных.

Индикатор не должен просчитываться при инициализации. Только в OnCalculate()

 
DrSky #:

Постарайтесь обходиться без глобальных переменных. Глобальные переменные как правило, это зло. Переделайте логику работы индикатора в класс, создавайте объект класса в инициализирующей функции и удаляйте в деинициализаторе. Таким образом, вы получите 100% повторяемость при каждом переключении.

А где хранить банальные счетчики и тп.? Все переводить в ООП? Хочется понять от куда эта дичь исходит, почему переменные не инициализируются заново? Я думал что это кеширование на уровне терминала или рваная история, которая подгружается.

 
PapaYozh #:

Индикатор не должен просчитываться при инициализации. Только в OnCalculate()

В моем случае все происходит в 

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