Discussão do artigo "Receitas MQL5 - Criamos um buffer circular para calcular rapidamente indicadores numa janela deslizante" - página 3

 
Vasiliy Sokolov:

Calcular apenas o último valor do indicador, e não recalculá-lo completamente com a chegada de um novo tick, é uma história tão padrão que é estranho que você tenha começado a discuti-la. É duplamente estranho que você fale sobre isso como se fosse um truque que você descobriu. Na realidade, é um padrão para escrever todos os indicadores. Ele também é mencionado na documentação. É por isso que absolutamente todo mundo usa o recálculo na última barra/ tick.


Tentarei responder de forma mais detalhada:

Há um indicador bastante pesado. Ele é solicitado no Expert Advisor muito raramente, ou seja, até que todas as condições sejam acionadas. Por exemplo, a cada, digamos, 300-1000 barras (na verdade, isso depende de várias condições, que são expressas em operadores condicionais). E se você obtiver o valor mesmo uma vez em cada barra, será mais vezes do que a chamada do indicador oculto no corpo dos operadores condicionais.

if(условие1)
{
if(условие2)
{
if(условие3)
{
if(условие4)
{
 и тут вызываю индикатор(mql4), такая ситуация встречается совсем редко
}
}
}
}

Mais ou menos assim.

Em princípio, o limite com essa abordagem deve ser sempre igual a P.
 
forexman77:


Tentarei lhe dar uma resposta mais detalhada:

há um indicador bastante pesado. No Expert Advisor, ele é solicitado muito raramente, ou seja, até que todas as condições sejam acionadas. Por exemplo, a cada, digamos, 300-1000 barras (na verdade, isso depende de várias condições, que são expressas em operadores condicionais). E se você obtiver o valor mesmo que seja uma vez em cada barra, isso será mais vezes do que a chamada do indicador oculto no corpo dos operadores condicionais.

Essa abordagem, a propósito, nem sempre economiza dinheiro. Porque as barras perdidas ainda são calculadas ao chamar o indicador.
 
Andrey Khatimlianskii:
Essa abordagem, a propósito, nem sempre gera economia. Porque as barras perdidas ainda são calculadas quando o indicador é chamado.


Mas se eu souber que a condição será cumprida raramente, usarei esse método e, se o indicador for chamado com frequência, será melhor contar todo o histórico.

E, é claro, devo calcular apenas uma nova barra, pois as antigas já são conhecidas, está claro.

Agora pensei que é necessário começar estritamente a partir de P sem comparação

if (limit > P)limit=P;//эту строку вообще убрать и сделать сразу  limit=P;

Se, no ciclo, o cálculo começar a partir de P, e ele for igual a 10, por exemplo, o cálculo começará a partir da barra 10.

P=Period_+10;
  
limit=P;
for(int i=limit;i>=0;i--)

Mas isso não é tão importante, podemos deixar como está. Não vale a pena.

"As barras perdidas ainda são calculadas quando o indicador é chamado ", pode ser mais detalhado?

Para ser sincero, agora eu tenho esses indicadores apenas em uma barra zero ou na primeira.

Por exemplo, aqui está a parte principal do código de um deles:

int start()
  {
    double summaP,d,Q;

   summaP=0.0;
   for (int k=0;k<Period_;k++)
   {
   d=MathAbs(Close[k]-Close[k+1]);
   summaP=summaP+d;
   }
   if(summaP==0.0) summaP=0.000000001;
   Q=Close[0]-Close[Period_];  
   ExtMapBuffer1[0]=Q/summaP;

   return(0);
  }

Ou seja, esses são indicadores para o testador. É claro que eles não serão usados para visualização, não é possível ver nada neles).

Mas um buffer em anel será necessário se o indicador consistir em vários buffers, em que uma matriz é construída a partir de outra.

 
forexman77:

"As barras perdidas ainda são calculadas quando o indicador é chamado ", você pode ser mais detalhado?

Vamos supor que o indicador foi chamado quando havia 1.000 barras no gráfico e ele as contou. Na próxima chamada - barras 1001, ele contou uma barra.
Mas se a próxima chamada for quando as barras já forem 1500, ele contará todas as novas (499) barras.


forexman77:

Para ser honesto, agora eu tenho esses indicadores que significam apenas uma barra zero ou a primeira barra.

Então, qual é o objetivo dos indicadores? Se você transferir esses cálculos para a forma de uma função no Expert Advisor, será ainda mais rápido.

 
forexman77:


Tentarei responder de forma mais detalhada:

O indicador é calculado em cada barra, independentemente de você chamá-lo ou não. Leia a especificação.

Se você quiser uma aceleração real, mova os cálculos para dentro do EA. Não há outra maneira. Ponto final. Todas as postagens sobre como você pode inserir isso com sucesso são engraçadas de ler.

Seu tópico está fora do assunto deste tópico. Vamos encerrá-lo aqui.

 

Prezado Vasiliy

Antes de mais nada, obrigado por esse excelente artigo e suas implementações com diferentes indicadores.

Gostaria de perguntar se seria possível publicar um exemplo de código para a seção de cálculo de máximos/mínimos com o buffer de anel. Estou achando difícil obter os resultados corretos quando o mercado está funcionando. Parece que perco o ponteiro ao atualizar os preços variáveis com a função OnChangeValue().

Desde já, obrigado.

 
Savio Araujo:

Prezado Vasiliy

Antes de mais nada, obrigado por esse excelente artigo e suas implementações com diferentes indicadores.

Gostaria de perguntar se seria possível publicar um exemplo de código para a seção de cálculo de máximos/mínimos com o buffer de anel. Estou achando difícil obter os resultados corretos quando o mercado está funcionando. Parece que perco o ponteiro ao atualizar os preços variáveis com a função OnChangeValue().

Desde já, obrigado.


Veja este exemplo: https://www.mql5.com/pt/articles/3047#c6

 
Vasiliy Sokolov:

Veja este exemplo: https://www.mql5.com/pt/articles/3047#c6


Eu já vi isso. Assim como verifiquei os exemplos que você forneceu. Eles mostram o mesmo problema que eu tive ao lidar com a atualização dos valores enquanto o mercado está em execução. Verifique o Stochastic que você forneceu. Adicionar um novo valor não é um problema, mas quando tentamos usar Stoch.ChangeLast() ou OnChangeValue() na classe CRiMaxMin, isso não funciona. Ele não altera o valor adequadamente. Se você puder verificar ou enviar um exemplo de um código funcional, seria muito bom.

Muito obrigado.

 

Um ótimo artigo, o homem sabe programar!

Se ao menos a tradução alemã não fosse tão horrível!!!!!

Onde posso encontrar a versão em inglês?

Posso trocá-la em algum lugar?

 
No link:https://www.mql5.com/pt/articles/3047 substitua o ../en/... por ../en/...
Die Rezepte MQL5 - Die Erstellung des Ringpuffers für eine schnelle Berechnung der Indikatoren im gleitenden Fenster
Die Rezepte MQL5 - Die Erstellung des Ringpuffers für eine schnelle Berechnung der Indikatoren im gleitenden Fenster
  • 2017.05.29
  • Vasiliy Sokolov
  • www.mql5.com
Der Ringpuffer — ist die einfachste und zugleich die wirksamste Organisationsart der Daten für die Berechnungen im gleitenden Fenster. Im Artikel ist beschrieben, wie dieser Algorithmus gestaltet ist, und es ist gezeigt, wie mit seiner Hilfe eine Berechnung im gleitenden Fenster ein einfacher und wirksamer Prozess sein wird.