Seqüência de execução Init() e DeInit() - página 8

 

Opção para resolver problemas ao alterar os prazos


Se você acabou de mudar a TF

1) Provavelmente não é necessário apagar objetos gráficos.

2) Talvez não seja necessário reinicializar algumas variáveis


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:

Opção para resolver problemas ao alterar os prazos


Se você acabou de mudar a TF

1) Provavelmente não é necessário apagar objetos gráficos.

2) Talvez não seja necessário reinicializar algumas variáveis


A única questão é quea estáticanão funciona no indicador, ela é reinicializada. Funciona no Expert Advisor, mas não no indicador
.
 
Yuriy Zaytsev:

Opção para resolver problemas ao alterar os prazos


Se houvesse apenas uma mudança de tempo

1) Talvez você não deva excluir objetos gráficos.

2) Talvez você não deva reinicializar nenhuma variável



Seu código não vai funcionar.

Mais uma vez:

Você não pode controlar os resultados de Deinit em Inite, porque Deinit pode trabalhar depois de Inite ser feito.

 
Sergey Chalyshev:


Seu código não vai funcionar.

Mais uma vez:

Você não pode controlar os resultados de Deinit em Inite, porque Deinit pode ser acionado depois de Inite ter corrido.

Quer dizer que não vai funcionar- em indicador? Funciona em Expert Advisors.
 
Yuriy Zaytsev:
Quer dizer que não vai funcionar- em um indicador ? em especialistas funciona.
Não há nenhum problema com os Consultores Especialistas. Este tópico é apenas sobre indicadores. Leia-o com atenção.
 
Sergey Chalyshev:

Como processar esses códigos de desinicialização em um indicador, para que precisamos desses códigos? Afinal de contas, não há possibilidade de esperar no indicador, Dormir não funciona.

Você não leu o que eu escrevi várias vezes?

Não há como nos indicadores. Você não pode fazer isso em cinco, desde o início. Porque você baixa uma cópia completamente nova do indicador com todas as suas conseqüências.

 
Nikolai Semko:
Não há nenhum problema com os especialistas. Este tópico é apenas sobre indicadores. Leia-o com atenção.

Eu li o primeiro post.
Diz, e eu cito:
"Indicador Escrito ou Co-Assessor"
 
Yuriy Zaytsev:

Eu li o primeiro post.
Diz, e eu cito:
"Escrito por um indicador ou co-autor".
É aí que termina a questão dos EAs.
Nem sempre é sábio limitar-se a ler o primeiro post antes de escrever algo.
 
Nikolai Semko:
Esse é o fim dos Consultores Especialistas.
Nem sempre é sábio limitar-se a ler o primeiro post antes de escrever qualquer coisa.

Bem, não é totalmente preciso dizer o que é razoável e o que não é.
Fiz uma pequena pesquisa sobre o assunto antes de escrevê-lo.

Coloquei um exemplo de código no assunto e agora quem leu o assunto pode ver que este mecanismo não funciona em um indicador e que funciona em um EA.

O autor do tópico obteve pelo menos uma resposta a uma pergunta, e com um exemplo.
 
Yuriy Zaytsev:

Bem, não é realmente preciso dizer o que é razoável e o que não é.
Eu fiz uma pequena pesquisa sobre o assunto antes de escrever.

Agora quem lê o assunto pode ver que este mecanismo não funciona em um indicador e funciona em um EA.
Obrigado pelo código, é claro. Funciona bem com os Expert Advisors porque quando mudamos a TF, as variáveis não são reinicializadas, enquanto nos indicadores elas são reinicializadas. Se você realmente quer ajudar com conselhos, por favor, "corra" novamente com menos pressa.