Последовательность выполнение Init() и DeInit() - страница 8

 

Вариант решения проблем при смене таймфрейма


Если просто произошла смена ТФ 

 1) Возможно не стоит удалять графические объекты

 2) Возможно не стоит инициализировать заново какие то переменные

 

static int ChanGeTF = 0;  // Признак смены ТФ , держим как статическую переменную в памяти эксперта
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if( ChanGeTF == 0) // при первом вызове код в OnInit полностью обрабатывается  , но не отработает если просто менялся ТФ
     {
      // тут сформируем переменные для нашего эксперта которые отработают  при первом старте экперта
      // возможно сформируем графические объекты 
     }
    else
    {
      ChanGeTF=0;  
     // сюда попадет при смене ТФ 
     // а формировать ничего уже не будем ,  у нас все сформировано и мы не желаем делать инициализацию переменных
     // но если необходимо - что то обработаем в код OnInit 
    }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Print(__FUNCTION__,"_UninitReason = ",getUninitReasonText(_UninitReason));   // пишем в лог причину входа в DeInit - очень полезная информация
   if ( REASON_CHARTCHANGE != _UninitReason )
     {
      // сюда не попадаем , если произошла смена ТФ
      // удалим графические объекты - для полноценного завершения работы эксперта 
      // 
     }
    else
    {
      // сюда попадем если просто произошла смена ТФ 
      // сделаем то что нам интересно - но при этом - к примеру - не будем удалять с графика графические объекты
         ChanGeTF=1; 
    }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
  {
   string text="";
//--- 
   switch(reasonCode)
     {
      case REASON_ACCOUNT:
         text="Account was changed";break;
      case REASON_CHARTCHANGE:
         text="Symbol or timeframe was changed";
         break;
      case REASON_CHARTCLOSE:
         text="Chart was closed";break;
      case REASON_PARAMETERS:
         text="Input-parameter was changed";break;
      case REASON_RECOMPILE:
         text="Program "+__FILE__+" was recompiled";
         break;
      case REASON_REMOVE:
         text="Program "+__FILE__+" was removed from chart";break;
      case REASON_TEMPLATE:
         text="New template was applied to chart";break;
      default:text="Another reason";
     }
//--- 
   return text;
  }

 
Yuriy Zaytsev:

Вариант решения проблем при смене таймфрейма


Если просто произошла смена ТФ 

 1) Возможно не стоит удалять графические объекты

 2) Возможно не стоит инициализировать заново какие то переменные

 

Вопрос только в том, что в индикаторе не работает static, она сбрасывается. В эксперте работает, а в индикаторе - нет
. 
 
Yuriy Zaytsev:

Вариант решения проблем при смене таймфрейма


Если просто произошла смена ТФ 

 1) Возможно не стоит удалять графические объекты

 2) Возможно не стоит инициализировать заново какие то переменные

 


Ваш код не будет работать.

Еще раз повторяю:

В Ините нельзя контролировать результаты Деинита, т.к Деинит может сработать после выполнения Инита.

 
Sergey Chalyshev:


Ваш код не будет работать.

Еще раз повторяю:

В Ините нельзя контролировать результаты Деинита, т.к Деинит может сработать после выполнения Инита.

Имеете ввиду не будет работать  - в индикаторе  ?  В экспертах он работает.
 
Yuriy Zaytsev:
Имеете ввиду не будет работать  - в индикаторе  ?  В экспертах он работает.
С экспертами проблем нет.  Эта тема как раз о индикаторах. Читайте внимательно. 
 
Sergey Chalyshev:

Как тогда обрабатывать эти коды деинициализации в Inite индикатора, для чего нужны эти коды? Ведь в индикаторе нет возможности подождать, Sleep не работает.

Вы не читали разве то, что я написал несколько раз?

В индикаторах - никак. В пятёрке с самого начала было никак. Так как загружается совсем новая копия индикатора со всеми вытекающими последствиями

 
Nikolai Semko:
С экспертами проблем нет.  Эта тема как раз о индикаторах. Читайте внимательно.

Я прочитал первый пост.
Там написанро, цитирую:
"Написан  индикатор  или соаетник"
 
Yuriy Zaytsev:

Я прочитал первый пост.
Там написанро, цитирую:
"Написан  индикатор  или соаетник"
На этом про советники заканчивается. 
Не всегда разумно,  прежде чем,  что-то писать, ограничится чтением только первого поста. 
 
Nikolai Semko:
На этом про советники заканчивается. 
Не всегда разумно,  прежде чем,  что-то писать, ограничится чтением только первого поста.

Ну не совсем корректно утверждать , что разумно а что не разумно. 
По теме я пробежался перед тем как писать.

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

Автор темы по крайней мере на один вопрос ответ получил, причём с примером.
 
Yuriy Zaytsev:

Ну не совсем корректно утверждать , что разумно а что не разумно. 
По теме я пробежался перед тем как писать.

Я посадил в тему пример кода ,  теперь те кто читают тему видят,  что в индикаторе предложенный механизм не работает а в советнике работает.
Спасибо конечно за код. Только с советниками и так все замечательно,  т. к.  при смене ТФ не происходит переинициализации переменных,  тогда как в индикаторах происходит. Если хотите реально помочь советом,  "пробежитесь" пожалуйста ещё раз  менее торопливо. 
Причина обращения: