Erros, bugs, perguntas - página 434

 

komposter
Tem razão. Cometi um erro.
Obrigado pela sua resposta.

 
Silent:

Manual de Referência MQL5 - Biblioteca Standard - Classes para organização de dados - CArrayObj (no website e na ajuda):

2. O mecanismo de gestão da memória está desactivado.

Neste caso, o CArrayObj não é responsável pela libertação de memória

Fixou-o, obrigado.
 

Documentação. Secção de variáveis estáticas.

"...As variáveis estáticas existem desde o momento da execução do programa e são inicializadas uma vez antes de chamar a função especializada OnInit()..."

Código de verificação do Expert Advisor:

void OnInit() {
  Print("OnInit() begin!");

  static bool init = true;
  if (init) {
    Print("Static initialized!");
    init = false;
  } 

  Print("OnInit() end!");
}

"Colocar" a EA no gráfico:

2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() begin!
2011.06.27 20:10:56     Тест (EURUSD,H1)        Static initialized!
2011.06.27 20:10:56     Тест (EURUSD,H1)        OnInit() end!

Sem retirar a EA do gráfico, alteramos o período do gráfico:

2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() begin!
2011.06.27 20:11:00     Тест (EURUSD,M30)       OnInit() end!

É suposto funcionar desta forma?

Na verdade interpretei a informação da documentação como uma inicialização forçada de variáveis estáticas em qualquer chamada da função OnInit(), independentemente de ter sido causada por recompilação ou por uma mudança do símbolo ou outra coisa...

Acontece que eu estava enganado. Por favor, esclarece-me: quais são as excepções a esta regra?

 

Quando os parâmetros de entrada são alterados, é a mesma "confusão".

Quando a conta é alterada, no entanto, é tratada correctamente - as variáveis estáticas são reinicializadas.

Como mudar o símbolo do gráfico sem eliminar o perito(REASON_CHARTCHANGE)?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
voix_kas:

Documentação. Secção de variáveis estáticas.

"...As variáveis estáticas existem desde o momento da execução do programa e são inicializadas uma vez antes de chamar a função especializada OnInit()..."

Código de verificação do Expert Advisor:

"Colocar" a EA no gráfico:

Sem remover a EA do gráfico, alteramos o período do gráfico:

É suposto funcionar desta forma?

Sim, deve funcionar.

O programa (o seu código) já foi carregado uma vez e só executa uma reinicialização a quente (Deinit/Init sem descarga de código). Neste caso, cabe ao promotor assegurar que o ambiente é rubricado correctamente.

 
Renat:

Sim, deveria funcionar dessa forma.

O programa (o seu código) já está carregado uma vez e apenas faz uma reinicialização a quente (Deinit/Init sem descarga de código). Neste caso, o promotor deve preocupar-se com uma inicialização adequada do ambiente.

Em primeiro lugar, o seu comentário contradiz claramente a definição na documentação: inicializar uma vez antes de chamar o OnInit(). Depois deve especificar claramente a definição na documentação: "...inicializar uma vez antes de chamar o OnInit(). primeiro call OnInit()".
Em segundo lugar, o seu comentário contradiz claramente o caso de mudança de conta, em que a MT, obviamente, põe termo à força ao Expert Advisor e restaura-o novamente.

Pode a questão fundamental de saber se as variáveis estáticas devem ser reinicializadas à força em cada (e não apenas na primeira) chamada para o OnInit() ser trazida à consideração/votação?

 

Em geral, é engraçado como as coisas funcionam.
À primeira vista, pensei que a função OnDenit é uma espécie de destruidor, e OnInit - o construtor do Consultor Especialista.
De facto, acontece que o OnInit é um evento múltiplo (dentro do tempo de vida do perito). Então não é claro, porque é que precisamos de gerar explicitamente o evento OnDenit se sabemos que a EA não termina o seu funcionamento (por exemplo, em caso de mudança de período do gráfico)?

E outra questão.
A razão para a desinicialização de REASON_CHARTCHANGE é o símbolo ou período de um gráfico ter sido alterado.
Por favor, explique como é que um símbolo gráfico pode ser alterado sem apagar a EA nele?

 
voix_kas:

E outra questão.
Motivo da desinicialização REASON_CHARTCHANGE - O símbolo ou período do gráfico foi alterado.
Por favor, explique como é que um símbolo gráfico pode ser alterado sem apagar a EA nele?

ChartSetSymbolPeriodo()
 
voix_kas:

Na verdade, é engraçado.
Pela minha intuição, pensei que a função OnDenit era uma espécie de destruidor e que a função OnInit era o construtor do Expert Advisor.
De facto, parece que o OnInit é um evento múltiplo (dentro da vida de um Consultor Especialista). Então não é claro, porque é que precisamos de gerar explicitamente o evento OnDenit se sabemos que a EA não termina o seu funcionamento (por exemplo, em caso de mudança de período do gráfico)?

E outra questão.
A razão para a desinicialização de REASON_CHARTCHANGE - O símbolo ou período de um gráfico foi alterado.
Explique por favor como um símbolo gráfico pode ser alterado sem apagar a EA nele?

Da mesma forma, tudo foi chamado em MT4. E não se sabe se o perito termina ou não o seu trabalho (para este efeito, os parâmetros OnDeinit caem, embora a razão de um possível disparo OnInit também seja fácil de conhecer).

2. É muito simples, nas configurações do terminal permite ao Expert Advisor negociar quando o símbolo e o período mudam.

Depois seleccione outro símbolo na visão geral do mercado e "largue-o" no gráfico com o seu rato.

A EA em qualquer caso, com inicialização normal após a mudança de símbolo/período "não será apagada" (será "Reinício a quente", como Renat disse abaixo). Se o analisarmos a um nível simples, o Conselheiro Especialista será autorizado a negociar sob certas configurações de terminal.

Yedelkin:
ChartSetSymbolPeriodo()
Outra opção, mas programática. :)
 
voix_kas:

Em primeiro lugar, o seu comentário contradiz claramente a definição na documentação: eles são inicializados uma vez antes de chamar o OnInit(). Depois deve especificar claramente a definição na documentação: "...inicializar uma vez antes de chamar o OnInit(). primeiro OnInit() chamada".

Sim, isto deve ser definido com mais precisão na documentação.


Em segundo lugar, o seu comentário contradiz claramente o caso de mudança de conta, em que a MT, obviamente, termina à força a EA e restaura novamente.

Sim, quando a conta é alterada, o Expert Advisor descarrega-se obviamente da memória e efectua um reinício a frio. Fizemo-lo de propósito.


Podemos introduzir/votar uma questão fundamental sobre a necessidade de reinicialização forçada das variáveis estáticas a cada (e não apenas à primeira) chamada do OnInit()?

Infelizmente, não. Isto só pode ser resolvido através de um reinício a frio do Expert Advisor.