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

 
fxsaber:

Em princípio, você poderia fazer com uma única linha.

Fez dela uma linha.
 
Nikolai Semko:


Onde é inequívoco?

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) removido.

Quando você troca o TF, acontece que o objeto aparece e depois desaparece.
Por que isso acontece?
Porque às vezes o OnDeinit da antiga TF elimina o 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?



De que serve usar um exemplo primitivo de colegiado?

Use um exemplo do código MUITO correto em seu lugar.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   datetime t = TimeCurrent();
   double pr  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
   if(ObjectFind(0, "InitDeinit") < 0)                 // ПРОВЕРКА СУЩЕСТВОВАНИЯ ОБЪЕКТА ПЕРЕД ЕГО СОЗДАНИЕМ ОБЯЗАТЕЛЬНА!!!
    {
     ObjectCreate(0,"InitDeinit",OBJ_ARROW_THUMB_UP,0,t,pr);
     Print(__FUNCTION__, " создан InitDeinit");
    }
    
   ObjectSetInteger(0,"InitDeinit",OBJPROP_WIDTH,50); 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(UninitializeReason() != REASON_CHARTCHANGE)      // ПРОВЕРКА ПРИЧИНЫ ДЕИНИЦИАЛИЗАЦИИ РЕШАЕТ ТВОЮ ПРОБЛЕМУ НА РАЗ...
    {
     ObjectDelete(0,"InitDeinit");
     ChartRedraw(0); // ЭТО НУЖНО ТОЛЬКО НА ВЫХОДНЫЕ. В РАБОЧИЕ ДНИ НЕ БУДЕТ ЛИШНИМ, НО С ПРИХОДОМ НОВОГО ТИКА ОБЪЕКТ БУДЕТ НЕДОСТУПЕН.
     Print(__FUNCTION__, "  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:
 
Alexey Viktorov:

É melhor usar um exemplo de código virtualmente correto.

É a mesma coisa. O objeto pode ser excluído através do Deinit da cópia indicadora irrelevante. E ANTES deste evento é realizado o OnInit do evento propriamente dito.

Mas é muito melhor mostrar a transferência de qualquer informação do OnDeinit da cópia antiga para o OnInit da nova. Na verdade, esta é a questão.

 
fxsaber:
Isto é o mesmo. O objeto pode ser excluído através do Deinit da cópia indicadora irrelevante. E ANTES deste evento é realizado o OnInit do evento propriamente dito.
if(UninitializeReason() != REASON_CHARTCHANGE)
 {
  // Если причина деинициализации смена периода графика сюда не попадаем и объекты не удаляются.
 }

Em todos os outros casos, exceto para puxar a tomada do computador, o objeto será apagado.

 
fxsaber:


Mas é muito melhor mostrar a passagem de qualquer informação do OnDeinit da cópia antiga para o OnInit da nova. Este é na verdade o ponto.

Notei há muito tempo, que soluções simples não são o seu forte. :-)))
 
Alexey Viktorov:

Em todos os outros casos, exceto para puxar a tomada do computador, o objeto será apagado.

Você demonstrou uma solução para um problema de discussão privada. A geral é formulada da seguinte forma
fxsaber:

Passe com confiançaqualquer informação do OnDeinit da cópia antiga para o OnInit da nova cópia.

O que, consequentemente, requer uma seqüência clara de execução OnDeinit/OnInit. Nunca precisei disto, mas implementei a idéia da solução sem nenhum problema.

 
fxsaber:
Você demonstrou a solução para um problema de discussão privada. Um geral pode ser formulado da seguinte forma

O que, consequentemente, requer uma seqüência clara de execução OnDeinit/OnInit. Nunca precisei disto, mas implementei a idéia da solução sem nenhum problema.

Bem, eu não sou contra isso. Mas arranhar minha orelha direita com meu dedo mindinho esquerdo não é para mim. Em vez de um teste tão simples para escrever"isto" ... Eu nem sei como chamá-lo. Que seja para o amador, porque o masoquismo tem o direito de existir. Com o devido respeito ao seu profissionalismo na programação.

 
Alexey Viktorov:

Em vez de um cheque tão simples, escreva"it"...

Portanto, você perdeu o ponto do problema que está sendo discutido neste tópico.
 
fxsaber:
Portanto, você não entendeu a essência do problema discutido neste tópico.

Compreendo, mas você transferiu a discussão do problema para suas habilidades (não pequenas).

E afinal minha resposta foi a um exemplo específico de um código de um potro, e não em resposta a suas habilidades e um exemplo de transferência de dados com regulamento de seqüência de execução On_Init e On_Deinit.

Qual é o propósito de continuar o diálogo? Você está tentando me convencer de que coçar a orelha direita com o dedo mindinho esquerdo é muito agradável? Ou outro propósito?

 
Alexey Viktorov:

Ou é um alvo diferente?

O exemplo que você refez não correspondeu perfeitamente ao problema que você estava discutindo. Você poderia mostrar outro exemplo que não teria uma solução através daUninicializeReason.