Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1468

 

Não consigo entender o que significam rates_total e prev_calculated no final.

A documentação diz: O primeiro parâmetro rates_total contém o número de barras disponíveis para o indicador para cálculo e corresponde ao número de barras disponíveis no gráfico.

Por exemplo, MA5, média de 5 barras, definida para exibir 100 barras. Então, o indicador calculará da 104ª até a 100ª barra e começará a desenhar a linha a partir da 100ª barra. Então, rates_total=5, ou 100, ou 104?

 
Novichokkk número de barras disponíveis para o indicador para cálculo e corresponde ao número de barras disponíveis no gráfico.

Por exemplo, MA5, média de 5 barras, definida para exibir 100 barras. Então, o indicador calculará da 104ª até a 100ª barra e começará a desenhar a linha a partir da 100ª barra. Então, rates_total=5, ou 100, ou 104?

Rates_total é o número de barras do gráfico disponíveis para cálculo. Em outras palavras, é Bars().

prev_calculated é o número de barras que o indicador calculou na chamada OnCalculate() anterior. É necessário para organizar cálculos econômicos.

Se prev_calculated for igual a rates_total, significa que nada foi calculado ainda, e é necessário inicializar os buffers do indicador e executar um cálculo completo de todo o histórico.

Em geral, podemos usar a seguinte construção:

//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      // Присваиваем limit значение количества доступных баров-1
      limit=rates_total-1;
      // Вот тут нужно инициализировать все буферы пустыми значениями
      ArrayInitialize(Buffer0,EMPTY_VALUE);
      ArrayInitialize(Buffer1,0);
      ArrayInitialize(Buffer2,clrNONE);
      // ... и т.д.
     }
//--- Экономный просчёт индикатора
   for(int i=limit;i>=0;i--)
     {
      Buffer0[i]=(/*что-то там*/);
     }
 
Artyom Trishkin #:

rates_total é o número de barras do gráfico disponíveis para cálculo. Em outras palavras, é Bars().

prev_calculated é o número de barras que o indicador calculou na chamada anterior OnCalculate(). É necessário organizar os cálculos econômicos.

Se prev_calculated for igual a rates_total, isso significa que nada foi calculado ainda e que é necessário inicializar os buffers do indicador e executar um cálculo completo de todo o histórico.

Em geral, podemos usar a seguinte construção:

Por que não escrever em vez de rates_total - Bars()?

int limit=Bars()-prev_calculated;

Desculpe-me, é claro, por ser um idiota. Estou pesquisando a documentação e vários livros sobre MKL5. Nem todas as nuances são explicadas. Também não nos livros. Separadamente, a linguagem nos livros é clara. Como as construções são montadas - mas, o que, de onde e para quê.... Estou começando a trabalhar nisso. Muitas verificações e verificações duplas. Abri um código simples do mashki, e há muitas linhas. E parecia que tudo o que você precisava fazer era descarregar uma matriz (ou acessá-la), calcular um valor de tal e tal índice na matriz para tal e tal, e passar por uma janela deslizante com esses cálculos na matriz indicando por índices de onde para onde. Sim para exibir a linha na tela. Não.
 
Novichokkk #:

Por que não escrever Bars() em vez de rates_total ?

Desculpe-me, é claro, por ser um idiota. Estou pesquisando a documentação e vários livros sobre MKL5. Nem todas as nuances são explicadas. Nos livros também. Separadamente, a linguagem nos livros é clara. Como as construções são montadas - mas, o que, de onde e para quê.... Estou começando a trabalhar nisso. Muitas verificações e verificações duplas. Abri um código simples do mashki, e há muitas linhas. E parecia que tudo o que você precisava fazer era descarregar uma matriz (ou acessá-la), calcular um valor de tal e tal índice na matriz para tal e tal, e passar por uma janela deslizante com esses cálculos na matriz indicando por índices de onde para onde. Sim para exibir a linha na tela. E não.

Você também pode usar essa construção. Mas por quê? Quando já existem variáveis predefinidas nos parâmetros do manipulador...

Bars() deve ser usado quando você realmente precisar dele - ao obter o número de barras disponíveis por outro símbolo/carimbo de data/hora.

 
Artyom Trishkin #:

Você também pode usar esse design. Mas por quê? Quando já existem variáveis predefinidas nos parâmetros do manipulador...

Bars() deve ser usada quando for realmente necessária - ao obter o número de barras disponíveis em outro símbolo/timeframe.

Artyom, às vezes qualquer um fica cansado e comete erros. Não considere isso uma crítica, mas rates_total - Bars() sempre será zero...

Em geral, é muito difícil explicar a esse personagem. Uma vítima do USE...

 
Alexey Viktorov #:

Artyom, às vezes todo mundo fica cansado e comete erros. Não considere isso uma crítica, mas rates_total - Bars() sempre será zero...

Em geral, é muito difícil explicar a esse personagem. Uma vítima da USE...

Sim, você está certo. Não imaginei que alguém decidiria calcular dessa forma. Vi Bars no cálculo com o canto do olho e pensei que fosse em vez de rates_total.

Isso acontece, obrigado.

 
Artyom Trishkin #:
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      // Присваиваем limit значение количества доступных баров-1
      limit=rates_total-1;
      // Вот тут нужно инициализировать все буферы пустыми значениями
      ArrayInitialize(Buffer0,EMPTY_VALUE);
      ArrayInitialize(Buffer1,0);
      ArrayInitialize(Buffer2,clrNONE);
      // ... и т.д.
     }
//--- Экономный просчёт индикатора
   for(int i=limit;i>=0;i--)
     {
      Buffer0[i]=(/*что-то там*/);
     }

Entendo que você queria ajudar a pessoa, mas aparentemente, por engano, você só a confundiu.

O erro de cálculo econômico nesse caso parece um pouco diferente.

for(int i=limit;i<rates_total;i++)
 
Aleksandr Slavskii #:

Entendo que você queria ajudar a pessoa, mas, aparentemente, por engano, apenas a confundiu.

O erro de cálculo econômico nesse caso parece um pouco diferente.

O que você acha que eu escrevi errado? Justifique, por favor.

Qual é o limite e de onde virá o loop no meu e no seu exemplo.

 
Novichokkk #:

Por que não escrever Bars() em vez de rates_total ?

Em essência, rates_total e Bars() são a mesma coisa, masBars() é uma função, portanto, sua chamada custará mais em termos de tempo de execução do que a leitura do valor da variável rates_total.

 
Artyom Trishkin #:

O que você acha que escrevi errado? Justifique, por favor.

Qual é o limite e de onde virá o loop no meu e no seu exemplo.

Oops))))))

Eu não vi direito

if(limit>1)

Não vi o que você escreveu.

Peço desculpas.