Skip to main content

Fila Média Em Movimento


Estou tentando calcular a média móvel de um sinal. O valor do sinal (um duplo) é atualizado em horários aleatórios. Estou procurando uma maneira eficiente de calcular sua média ponderada no tempo ao longo de uma janela de tempo, em tempo real. Eu poderia fazê-lo sozinho, mas é mais desafiante do que eu pensava. A maioria dos recursos que eu encontrei pela internet calculam a média móvel do sinal periódico, mas as atualizações das minas em tempo aleatório. Alguém conhece bons recursos para isso. O truque é o seguinte: você obtém atualizações em horários aleatórios através da atualização vazia (tempo int, valor flutuante). No entanto, você também precisa acompanhar quando uma atualização cai fora da janela de tempo, então você define um alarme chamado no momento N, que remove a atualização anterior de ser novamente considerado novamente na computação. Se isso acontecer em tempo real, você pode solicitar que o sistema operacional faça uma chamada para um método void dropoffoldestupdate (int time) para ser chamado no tempo N Se esta é uma simulação, você não pode obter ajuda do sistema operacional e você precisa Faça isso manualmente. Em uma simulação, você chamaria métodos com o tempo fornecido como um argumento (que não se correlaciona com o tempo real). No entanto, uma suposição razoável é que as chamadas são garantidas de tal forma que os argumentos de tempo estão aumentando. Neste caso, você precisa manter uma lista ordenada de valores do tempo de alarme e, para cada atualização e leitura, você verifica se o argumento de tempo é maior do que a cabeça da lista de alarmes. Embora seja maior, você faz o processamento relacionado ao alarme (abandone a atualização mais antiga), remova a cabeça e verifique novamente até que todos os alarmes anteriores ao tempo fornecido sejam processados. Em seguida, faça a chamada de atualização. Tenho até agora assumido que é óbvio o que você faria para a computação real, mas vou elaborar apenas no caso. Eu suponho que você tenha um método flutuante lido (int time) que você usa para ler os valores. O objetivo é tornar este chamado tão eficiente quanto possível. Então você não calcula a média móvel sempre que o método de leitura é chamado. Em vez disso, você precomputa o valor a partir da última atualização ou o último alarme, e ajuste esse valor por algumas operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. (I. E. Um número constante de operações, exceto para talvez processar uma lista de alarmes empilhados). Esperemos que isso seja claro - este deve ser um algoritmo bastante simples e bastante eficiente. Otimização adicional. Um dos problemas restantes é se uma grande quantidade de atualizações acontecer dentro da janela de tempo, então há muito tempo para o qual não há leituras nem atualizações e, em seguida, uma leitura ou atualização vem junto. Nesse caso, o algoritmo acima será ineficiente para atualizar de forma incremental o valor de cada uma das atualizações que está caindo. Isso não é necessário porque nos preocupamos apenas com a última atualização além da janela de tempo, então, se houver uma maneira de descartar as atualizações mais antigas, isso ajudaria. Para fazer isso, podemos modificar o algoritmo para fazer uma busca binária de atualizações para encontrar a atualização mais recente antes da janela de tempo. Se houver relativamente poucas atualizações que precisam ser descartadas, pode-se incrementar o valor para cada atualização descartada. Mas se houver muitas atualizações que precisam ser descartadas, pode-se recalcular o valor a partir do zero depois de deixar as atualizações antigas. Apêndice sobre Computação Incremental: Devo esclarecer o que quero dizer com a computação incremental acima na frase ajustar esse valor por um par de operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. Computação inicial não incremental: então iterar sobre os atuais relevantes em ordem crescente de tempo: tempo de exibição de motionaverage (sum tempo de atualização). Agora, se exatamente uma atualização cai fora da janela, mas nenhuma nova atualização chegou, ajuste a soma como: (note que é priorupdate que tem o timestamp modificado para iniciar o início da última janela). E se exatamente uma atualização entrar na janela, mas nenhuma nova atualização cai, ajuste a soma como: Como deve ser óbvio, este é um esboço áspero, mas espero que mostre como você pode manter a média de que é O (1) operações por atualização Em uma base amortizada. Mas observe uma otimização adicional no parágrafo anterior. Observe também as questões de estabilidade aludidas em uma resposta mais antiga, o que significa que os erros de ponto flutuante podem se acumulam em um grande número de tais operações incrementais, de modo que existe uma divergência com o resultado da computação total que é significativa para o aplicativo. Se uma aproximação é OK e há um tempo mínimo entre amostras, você pode tentar super-amostragem. Tenha uma matriz que represente intervalos de tempo uniformemente espaçados que sejam menores do que o mínimo, e em cada período de tempo armazene a última amostra que foi recebida. Quanto menor for o intervalo, mais próxima será a média para o valor verdadeiro. O período não deve ser superior a metade do mínimo ou há uma chance de perder uma amostra. Respondido 15 de dezembro às 18:12 respondido 15 de dezembro às 22:38 Obrigado pela resposta. Uma melhoria que seria necessário para realmente quotcachequot o valor da média total, então nós não vamos fazer o loop o tempo todo. Além disso, pode ser um ponto menor, mas não seria mais eficiente usar um deque ou uma lista para armazenar o valor, já que assumimos que a atualização virá na ordem correta. A inserção seria mais rápida do que no mapa. Ndash Arthur 16 de dezembro 11 às 8:55 Sim, você pode armazenar em cache o valor da soma. Subtrair os valores das amostras que você apaga, adicione os valores das amostras que você inseriu. Além disso, sim, um dequeltpairltSample, Dategtgt pode ser mais eficiente. Eu escolhi o mapa para legibilidade e a facilidade de invocar o mapa :: upperbound. Como sempre, escreva primeiro o código correto, depois perfile e mude as mudanças incrementais. Ndash Rob Dec 16 11 at 15:00 Nota: Aparentemente, esta não é a maneira de abordar isso. Deixando-o aqui para referência sobre o que há de errado com essa abordagem. Verifique os comentários. ATUALIZADO - com base no comentário Olis. Não tenho certeza sobre a instabilidade de que ele está falando. Use um mapa ordenado dos tempos de chegada contra valores. Após a chegada de um valor, adicione a hora de chegada ao mapa ordenado juntamente com seu valor e atualize a média móvel. Advertindo isso é pseudo-código: aí. Não totalmente elaborado, mas você consegue a ideia. Coisas a serem observadas. Como eu disse, o acima é pseudo-código. Você precisará escolher um mapa apropriado. Não remova os pares à medida que você itera, pois você invalidará o iterador e terá que começar de novo. Veja o comentário Olis abaixo também. Respondeu 15 de dezembro às 12:22 Isso não funciona: ele não leva em consideração a proporção do comprimento da janela para cada valor. Além disso, essa abordagem de adicionar e depois subtrair é apenas estável para tipos inteiros, não flutuadores. Ndash Oliver Charlesworth 15 de dezembro às 12:29 OliCharlesworth - desculpe, perdi alguns pontos-chave na descrição (dupla e ponderada no tempo). Vou atualizar. Obrigado. Ndash Dennis 15 de dezembro às 12:33 O tempo de ponderação é mais um problema. Mas isso não é o que eu estou falando. Eu estava me referindo ao fato de que quando um novo valor primeiro entra na janela de tempo, sua contribuição para a média é mínima. Sua contribuição continua a aumentar até um novo valor entrar. Ndash Oliver Charlesworth 15 de dezembro 11 às 12: 35Se o desempenho deste código é crítico, então pode ser sensato evitar alocações de heap para Candle s. Eu acho que a maneira mais razoável de fazer isso seria fazer da Candle uma estrutura. Embora os tipos de valores mutables sejam maus. Então eu também refino a Vela para ser imutável. Isso também significa que a implementação do NewestCandle teria que mudar, provavelmente em um par de campos duplos (ou, alternativamente, uma classe mutável e reinicializável separada). Não vejo nenhum outro problema potencial de desempenho em seu código. Mas quando se trata de desempenho, você deve sempre confiar no perfil, não na intuição (ou em alguém). Além disso, não gosto de alguns nomes de seus métodos. Especificamente: ValueUpdated. Os nomes dos métodos normalmente devem estar na forma de fazer algo, não aconteceu algo. Então eu acho que um nome melhor seria UpdateValue. Adicionar. Modificar. Estas são as duas operações fundamentais do seu MovingAverage e eu acho que esses nomes não expressam bem o significado. Eu chamaria-lhes algo como MoveAndSetCurrent e SetCurrent. respectivamente. Embora tal nomeação indique que as operações fundamentais deveriam ser Mover e Definir atual. Eu tenho um programa científico de registro de dados que eu tenho desenvolvido há vários anos. Agora precisamos adicionar algumas funcionalidades para que ela produza uma média móvel dos dados que estão sendo reunidos. Eu posso criar uma fila de myDataClass para fazer o buffer fifo, mas eu queria saber qual seria a melhor maneira de fazer a média. Como você pode ver no exemplo de código abaixo myDataClass contém várias estruturas de dados, algumas das quais podem ser calculadas em média e algumas que não podem (por exemplo, a string). A questão principal é se existe uma maneira fácil de conseguir isso ou preciso escrever código para medir cada item dentro de myDataClass ou devo redesenhar meuDataClass Obrigado. Terça-feira, 12 de julho de 2011 9:14 AM Pessoalmente, eu criaria uma Classe quotDataQueue (de MyDataClass) que se desamarcava se a contagem na fila passar 10 itens. Desta forma, você nunca terá que cuidar do número de item na fila do seu código, isso será cuidar da classe da fila Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:56 PM Terça-feira, 12 de julho de 2011 9h40 Depois de um pouco mais de investigação, acho que encontrei a solução para você. Você pode usar o método CopyTo para copiar os itens à esquerda na fila para uma matriz. Esteja ciente de que não calculo a média, eu mostrei apenas como você pode obter a base de seus cálculos, mas isso é apenas adicionar seus próprios cálculos com base em sua regra de negócios para isso. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:56 PM Sexta-feira, 15 de julho de 2011 5:16 AM Com base no meu entendimento, seu requisito é algo como isto: Este é o dado na fila: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl uma matriz dupla myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl uma matriz dupla myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl uma matriz dupla Agora, você deseja calcular o número médio de feild datadbl em cada objeto myDataClass e obter o número médio de dataarraydbl feild. Se assim for, sugiro que você faça o mesmo que Crazypenie sugeriu: crie uma nova classe chamada DataQueue: Espero que isso seja útil, se eu tiver mal entendido, sinta-se à vontade para me informar. Mike Feng MSFT Suporte Comunidade MSDN Feedback para nós Obtenha ou solicite um exemplo de código da Microsoft Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcar se não fornecem ajuda. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:55 PM sexta-feira, 15 de julho de 2011 3:33 AM Obrigado Cor, eu poderia fazê-lo assim, mas myDataClass é realmente bastante grande e o sistema de registro pode ser executado para Há muito tempo, então é mais eficiente para mim cópias de lixo da classe que eu realmente não preciso para calcular a média. A fila parecia a maneira mais fácil de conseguir isso. Minha pergunta principal é, no entanto, como é que a média de uma classe, como essa, estou tendo a sensação de que precisarei escrever código que especificamente para cada tipo de dados em myDataClass. Classe pública myDataClass terça-feira, 12 de julho de 2011 10:40 AM Com base no meu entendimento, seu requisito é algo como isto: Este é o dado na fila: myDataClass1. Datadbl 2.1 datastr quotsomeString1quot dataarraydbl uma matriz dupla myDataClass2. Datadbl 3.5 datastr quotsomeString2quot dataarraydbl uma matriz dupla myDataClass10. Datadbl 9.1 datastr quotsomeString10quot dataarraydbl uma matriz dupla Agora, você deseja calcular o número médio de feild datadbl em cada objeto myDataClass e obter o número médio de dataarraydbl feild. Se assim for, sugiro que você faça o mesmo que Crazypenie sugeriu: crie uma nova classe chamada DataQueue: Espero que isso seja útil, se eu tiver mal entendido, sinta-se à vontade para me informar. Mike Feng MSFT Suporte Comunidade MSDN Feedback para nós Obtenha ou solicite um exemplo de código da Microsoft Lembre-se de marcar as respostas como respostas se elas ajudarem e desmarcar se não fornecem ajuda. Marcado como resposta por Mike Feng Moderador quarta-feira, 20 de julho de 2011 1:55 PM sexta-feira, 15 de julho de 2011 3:33

Comments

Popular posts from this blog

Intermediários De Opções Binárias De 1 Minuto (2)

Como 038 Onde negociar 60 opções binárias diferentes Apostar em opções de 60 segundos é uma grande precipitação. É o comércio mais rápido disponível na internet disponível hoje. Você pode literalmente fazer ou perder dinheiro em um apartamento de um minuto. Se você é bom, você pode fazer mais dinheiro esperando na fila para pegar o McDonalds para o almoço do que o caixa faz toda a semana, o It8217s é irreal. It8217s divertido e it8217s excitante para apostar 60 segundos binários. Esta publicação lista os melhores corretores de opções binárias de um minuto e fornece os conceitos básicos sobre como negociar uma opção de 60 segundos. Se você é bom, você pode fazer mais dinheiro esperando na fila para pegar o McDonalds do que o caixa do Mickey D8217s faz todas as negociações da semana abertas e fechadas em um minuto. A pergunta que você tem para se perguntar é, você acha que o preço de 8216x8217 vai subir ou descer um minuto a partir de agora. Coloque suas apostas Sim, parece que é uma eno...

Forex Market Open Hours Indicator Mt4

Finalmente, depois de anos de esforço. Chega um indicador, permitindo que os comerciantes escolham tops e fundos como nenhum outro. Apresentando, o incrível: FOREX REVERSAL INDICATOR v5 GOSTARIA CLARO, COMPRAR E VENDER SETAS, DIZENDO-LHE QUANDO O MERCADO MUDARÁ A DIRECÇÃO Bem, agora é a sua chance de adquirir um indicador MT4 forex que faz isso. Se você esteve envolvido na negociação forex por qualquer período de tempo, você saberá que houve inúmeros sistemas e estratégias que visam prever inversões de tendências, aconselhando você a seguir esse padrão ou aquela ação de preço. E, na realidade, não há dúvida de que tem um grande benefício em métodos e técnicas de inversão clássicas, como harmônicos (gartley butterfly) ou outras teorias de ondas como Elliot, Wolf e Hurst Cycles, ou Andrews Pitchfork, ou a linha de tendência rejeita, usando suporte e resistência , Tapas duplas, mais retrações de Fibonacci e confluência, para não mencionar o uso de sobrecapas oversold Stochastic, CCI, RSI ...

Opções Binárias Metatrader

O que são opções binárias As opções binárias são um tipo de opção em que a recompensa está estruturada para ser um montante fixo de compensação se a opção expirar no dinheiro, ou nada, se a opção expirar para fora do dinheiro. Esses tipos de opções são diferentes das opções simples de baunilha e também são algumas vezes designados como opções de tudo ou nada ou opções digitais. A verdade sobre as opções binárias As opções binárias tornaram-se muito populares e atraem muitos comerciantes novatos, que acham mais fácil trocar opções binárias do que fazer negócios reais, porque o gerenciamento de posição está fora da equação. A maioria deles sente que eles têm uma vantagem porque podem ler gráficos técnicos, mas ignoram que os movimentos de preços de curto prazo são completamente aleatórios e não têm nada a ver com a análise técnica. As opções binárias têm um tempo de expiração e, portanto, tampar seus lucros em duas dimensões: preço e hora. As chances de o preço futuro estar acima do preç...