pré_calculado

 
Comentários não relacionados a "bugs, bugs, problemas" foram movidos para este tópico.
 

MT5 construir 1455

Indicador para o teste:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Colocação do indicador na tabela

2. Feche o terminal

3. Terminal aberto

Diário de bordo:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

Estou perdendo algo ou é impossível confiar na variável pré-calculada, tenho que esmagar a muleta?

 
Alexander Puzanov:

MT5 construir 1455

Indicador para o teste:

#property indicator_chart_window
#property indicator_buffers     0
#property indicator_plots       0

int OnInit(void) {return(INIT_SUCCEEDED);}

int OnCalculate(const int rates_total,
  const int prev_calculated,
  const datetime &Time[],
  const double &Open[],
  const double &High[],
  const double &Low[],
  const double &Close[],
  const long &TickVolume[],
  const long &Volume[],
  const int &Spread[]
) {
  static int si_Tick = 0;
  Print(++si_Tick, ": prev_calculated = ", prev_calculated);
  
  return(rates_total);
}

1. Colocação do indicador na tabela

2. Feche o terminal

3. Terminal aberto

Diário de bordo:

2016.10.17 08:04:38.755 Test (USDJPY,M15)       1: prev_calculated = 0
2016.10.17 08:04:38.757 Test (USDJPY,M15)       2: prev_calculated = 100322
2016.10.17 08:04:39.060 Test (USDJPY,M15)       3: prev_calculated = 0
2016.10.17 08:04:39.837 Test (USDJPY,M15)       4: prev_calculated = 100322
2016.10.17 08:04:39.837 Test (USDJPY,M15)       5: prev_calculated = 100322
...

Estou perdendo algo ou é impossível confiar na variável pré-calculada, tenho que esmagar a muleta?

A variável pré-calculada pode ser zerada para 0 mesmo sem histórico de paginação se o checksum tiver mudado (esta é uma resposta aproximada do servicedesk).
 
Alexey Kozitsyn:
A variável pré_calculada pode ser redefinida para 0 mesmo sem histórico de paginação se o checksum mudou (esta é uma resposta aproximada do servicedesk).
Entendi. Obrigado. Por isso, ao carpinteiro...
 
Alexander Puzanov:
Estou vendo. Obrigado. Por isso, ao carpinteiro...
Não há necessidade de exagerar - o retorno zero do pré-cálculo é um evento comum. A tarefa do programador é capturar tal evento e preencher corretamente os buffers indicadores em tal caso. Nada mais e nada menos.
 
Ilyas:

Adicionados operadores *(Dereferência/Informação) e &(Endereço de), nenhuma mudança adicional de idioma será feita/planejada.

Por favor, esclareça o seguinte:

* obter uma variável por referência - só se aplica a:

1. objetos de classe

2. objetos de estrutura

3. Tipos fundamentais

Neste contexto, é apenas rlvalue ou lvalue também?

 
Karputov Vladimir:
A tarefa do programador é pegar um evento desse tipo

Portanto, eu não sou um programador - minhas tarefas são diferentes. Carpinteiro, eu acho - vou 'mutilar a muleta' e pensar que estou 'pegando o evento'.

E não estou exagerando, porque o objetivo declarado desta variável:

prev_calculated  // обработано баров на предыдущем вызове

Além desse propósito, também é suposto ser uma bandeira de mudança na história, além de ser suposto rastrear algumas outras mudanças. Tudo isso é útil, mas não podemos usá-lo para seu propósito direto - mostrar quantas "barras foram processadas na chamada anterior" - pré_calculadas.

 
Alexander Puzanov:

Portanto, eu não sou um programador - minhas tarefas são diferentes. Carpinteiro, eu acho - vou 'mutilar a muleta' e pensar que estou 'pegando o evento'.

E não estou exagerando, porque o objetivo declarado desta variável:

prev_calculated  // обработано баров на предыдущем вызове

Além desse propósito, também é suposto ser uma bandeira de mudança na história, além de ser suposto rastrear algumas outras mudanças. Tudo isso é útil, mas você não pode usá-lo para seu propósito direto - para mostrar quantas "barras foram processadas na chamada anterior" - pré_calculadas

E se nós simplesmente recalcularmos todo o indicador quando 0? Parece-me ser a melhor solução.
 
Alexander Puzanov:

Portanto, eu não sou um programador - minhas tarefas são diferentes. Carpinteiro, eu acho - vou 'mutilar a muleta' e pensar que estou 'pegando o evento'.

E não estou exagerando, porque o objetivo declarado desta variável:

prev_calculated  // обработано баров на предыдущем вызове

Além desse propósito, também é suposto ser uma bandeira de mudança na história, além de algumas outras mudanças a serem acompanhadas. Tudo isso é útil, mas não podemos usá-lo para seu propósito direto - mostrar quantas barras foram "processadas na chamada anterior" - pré_calculadas

Se pré_calculado=0, significa que um recálculo completo deve ser realizado. Neste caso, todos os indicadores padrão são completamente recalculados.

O que não está claro?

Diz-se que o checksum mudou na história. Seria mais barato recalcular o indicador do que descobrir por que o checksum mudou.

A documentação menciona explicitamente que

Observe a conexão entre o valor de retorno de OnCalculate() e o segundo parâmetro de entrada pré_calculado. O parâmetro pré_calculado na chamada de função contém um valor retornado pela OnCalculate() na chamada anterior.Isto permite algoritmos econômicos para calcular o indicador personalizado a fim de evitar cálculos repetidos para aquelas barras que não mudaram desde a chamada anterior desta função.

Para isso, geralmente é suficiente retornar o valor do parâmetro rate_total, que contém o número de barras na chamada de função atual. Se desde a última chamada do OnCalculate() os dados de preço mudaram (um histórico mais profundo foi bombeado ou o histórico foi preenchido), então o valor do parâmetro de entrada pré_calculado será ajustado a zero pelo terminal.

 
Alexey Kozitsyn:
Que tal apenas recalcular o indicador inteiro quando 0? Na minha opinião, a melhor solução.
Isto é exatamente o que você deve fazer: quando você obtém prev_calculate==0 você deve recalcular o indicador inteiro. Uma vez que rev_calculate==0 é normalmente uma troca de história. E se o histórico for trocado, isso significa que pode haver novas barras que não foram percebidas ou que não foram calculadas antes - ou seja, as leituras dos indicadores já estarão erradas.
 
Karputov Vladimir:
Isto é exatamente o que você deve fazer: quando prev_calculate==0 for recebido, você deve recalcular o indicador INTEGRAL. Uma vez que rev_calculate==0 é normalmente uma troca de história. E se o histórico for trocado, isso significa que pode haver novas barras que não foram percebidas ou que não foram calculadas antes - ou seja, as leituras dos indicadores estarão incorretas.
:) Isso é o que eu faço...
Razão: