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

 
Комбинатор:

Quando você muda of.

Se os indicadores tiverem lixo em seus amortecedores do antigo período de tempo, isso pode afetar também os temporizadores.

É mais bonito

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Nova versão do MetaTrader 4 build 1065

Sergey Klimov, 2017.04.14 16:34

Ao alternar entre contas, a variável _Dígitos no indicador não muda.

 
fxsaber:
É mais bonito.
Com todos os dígitos diferentes, parece que está indo por toda parte, eu parei de cruzar tais contas no mesmo terminal há cerca de 5 anos atrás.
 
fxsaber:
É mais bonito.

Isto é para aqueles que falam de consistência adequada no MT4.

Observe e entenda que nem tudo é tão bonito no MT4.

 
fxsaber:
A fila é unívoca.


Bem, onde é que não há ambigüidade?

Experimente este exemplo primitivo. Você entenderá a "singularidade" ao trocar o TF.

Neste exemplo, um objeto com coordenadas de tempo e preço atuais é criado no OnInit. Na OnCalculate, este objeto se move junto com o preço.

No OnDeinit, ele é simplesmente (logicamente) apagado.

Quando trocamos o TF, o objeto aparece e depois desaparece.
Por que isso acontece?
Porque às vezes o OnDeinit da antiga TF apaga algo que já foi criado no OnInit da nova TF. Não é um bug! O que deve pensar o programador que criou este exemplo e não leu este ramo?

Demonstração da ambigüidade da seqüência OnInit e OnDeinit


#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);

   ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,15); 

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"InitDeinit");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   ObjectMove(0,"InitDeinit",0,t,pr);
   return(rates_total);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
Nikolai Semko:

Bem, onde ela está sozinha.

Falou-se sobre o temporizador ali.
 
fxsaber:
O cronômetro foi mencionado ali.

Qual é a diferença? Você pode colocar EventSetTimer em Unite ao invés de criar objetos, e EventKillTimer em DeUnite ao invés de eliminar objetos. E isto não reduzirá a incerteza, porque o temporizador definido será morto por Deunite da velha TF, e às vezes não. E será ainda pior, porque pelo menos você pode ver o objeto, mas não pode ver o timer - quer ele funcione ou não.
 

Talvez eles já o tenham inventado, não tenham lido tudo. Se o indicador criar painel, você pode usar a variável global de terminal, aumentar seu valor em 1 init e usá-lo como um aditivo para nomes de objetos gráficos.

Minha tarefa era diferente - para salvar parâmetros do painel, para isso criei variáveis globais do terminal em deinit. A solução é simples - para criar variáveis globais do terminal no inite e atualizar cada uma delas à medida que os parâmetros mudam no painel gráfico. Somente exclua variáveis no deinit se a desinicialização for causada pela remoção do indicador.

 
Dmitry Fedoseev

Se o indicador criar um painel, você pode usar uma variável global do terminal, aumentar seu valor em 1 e usá-lo como um acréscimo aos nomes dos objetos gráficos.
Estas são muletas. Você só precisa fazer a ordem correta no terminal e pronto. Primeiro deinite a instância anterior, e só depois inicie uma nova.
Nikolai Semko:


O que deve pensar um programador que criou este exemplo e ainda não leu este tópico?

Concordo plenamente. Os não leitores não saberão desta característica e matarão seu tempo tentando descobri-la. E isso seria centenas de pessoas... ...especialmente aqueles que são iniciantes.

Tudo o que você precisa é consertar um bug uma vez e pronto.

 
Nikolai Semko:

Qual é a diferença? Você pode colocar EventSetTimer em Unite ao invés de criar objetos, e EventKillTimer em Deunite ao invés de eliminar objetos. Isto não reduzirá a incerteza, porque o temporizador definido será morto por Deunite da velha TF, e às vezes não. E seria ainda pior, porque pelo menos você pode ver o objeto, mas não pode ver se o timer funciona ou não.
Isso parece bobagem. Os cronômetros das cópias indicadoras não têm nada a ver um com o outro.
 
elibrarius:
É tudo muletas. Você só precisa fazer a ordem correta no terminal e isso é tudo. Primeiro deinite a instância anterior, e só depois inicialize a nova instância.

Concordo plenamente. Os não leitores não saberão desta característica e matarão seu tempo tentando descobri-la. E isso seria centenas de pessoas... especialmente para os iniciantes.

Tudo o que você tem que fazer é consertar o bug uma vez e pronto.


É disso que eu estou falando!
Estou pessoalmente em um rolo, pois sinto que tenho uma vantagem sobre a maioria, pois sei como lidar com tudo isso, não apenas em palavras, mas também em ações. Já fiz correções e acrescentei muletas aos meus programas.

Só não entendo porque os desenvolvedores se recusam obstinadamente a considerar esta "característica" um bug.
Por exemplo:

Slawa:

Os indicadores devem ser utilizados para os fins a que se destinam.

Em outras palavras, a seqüência de preenchimento dos indicadores OnInit e OnDeinit quando o período do símbolo dográfico tiver mudado não deve ser motivo de preocupação para ninguém.

Mas em meu exemplo com o gif animado acima, há um bug definido para um programador que não leu este tópico! O que não é feito de acordo com seu propósito?

Razão: