Se o desempenho desse código for crítico, poderá fazer sentido evitar alocações de heap para Candle s. Eu acho que a maneira mais razoável de fazer isso seria transformar Candle em struct. Embora os tipos de valores mutáveis sejam maus. então eu também refatoraria Candle 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 reajustável separada). Eu não vejo nenhum outro problema de desempenho potencial em seu código. Mas quando se trata de desempenho, você deve sempre confiar em criar perfis, não em sua (ou em outra pessoa) intuição. Além disso, eu não gosto de alguns nomes de seus métodos. Especificamente: ValueUpdated. Nomes de métodos geralmente devem estar na forma de fazer alguma coisa, não algo aconteceu. 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 os chamaria de algo como MoveAndSetCurrent e SetCurrent. respectivamente. Embora essa nomenclatura indique que as operações fundamentais devem ser Mover e SetCurrent. Eu essencialmente tenho uma matriz de valores como esta: A matriz acima é simplificada, Estou coletando 1 valor por milissegundo em meu código real e preciso processar a saída em um algoritmo que escrevi para encontrar o pico mais próximo antes de um ponto no tempo. Minha lógica falha porque, no meu exemplo acima, 0,36 é o pico real, mas meu algoritmo olha para trás e vê o último número 0,25 como o pico, já que há uma diminuição para 0,24 antes dele. O objetivo é pegar esses valores e aplicar um algoritmo a eles, que irá suavizá-los um pouco para que eu tenha mais valores lineares. (isto é: Id como meus resultados para ser curvy, não jaggedy) Ive sido dito para aplicar um filtro médio móvel exponencial aos meus valores. Como posso fazer isso? É muito difícil para mim ler equações matemáticas, eu lido muito melhor com código. Como faço para processar valores em minha matriz, aplicando um cálculo de média móvel exponencial para equacioná-los perguntou 8 de fevereiro 12 em 20:27 Para calcular uma média móvel exponencial. você precisa manter algum estado ao redor e precisa de um parâmetro de ajuste. Isso exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): Instancie com o parâmetro de decaimento desejado (a sintonização pode ser entre 0 e 1) e use average () para filtrar. Ao ler uma página sobre alguma recorrência matemática, tudo o que você realmente precisa saber ao transformá-la em código é que os matemáticos gostam de escrever índices em matrizes e seqüências com índices. (Eles também têm algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa lembrar de um valor antigo que não é necessário usar matrizes de estado complicadas. respondeu 8 fev 12 at 20:42 TKKocheran: Muito bonito. Não é bom quando as coisas podem ser simples (Se começar com uma nova sequência, consiga um novo averager). Note que os primeiros termos na seqüência média irão saltar um pouco devido aos efeitos de limite, mas você obtém aqueles com outras médias móveis. também. No entanto, uma boa vantagem é que você pode envolver a lógica da média móvel no averager e experimentar sem perturbar demais o resto do seu programa. ndash Donal Fellows 9 de fevereiro de 2012 às 0:06 Eu estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrou 0,25 em vez de 0,36, então está errado. Está errado porque assume um aumento ou diminuição monótona (que está sempre subindo ou sempre descendo). A menos que você calcule a média de TODOS os seus dados, seus pontos de dados - conforme você os apresenta - são não-lineares. Se você realmente quiser encontrar o valor máximo entre dois pontos no tempo, então divida sua matriz de tmin para tmax e encontre o máximo desse subarray. 2) Agora, o conceito de médias móveis é muito simples: imagine que eu tenho a seguinte lista: 1.4, 1.5, 1.4, 1.5, 1.5. Eu posso alisá-lo, tomando a média de dois números: 1,45, 1,45, 1,45, 1,5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro números) o segundo (nova lista) é a média de 1,4 e 1,5 (terceira e segunda lista antiga) a terceira (nova lista) a média de 1,5 e 1,4 (quarto e terceiro), e assim por diante. Eu poderia ter feito o período de três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver as médias móveis no trabalho é ir ao Google Finance, selecionar uma ação (experimente o Tesla Motors muito volátil (TSLA)) e clicar em technicals na parte inferior do gráfico. Selecione Média Móvel com um determinado período e Média Móvel Exponencial para comparar suas diferenças. A média móvel exponencial é apenas mais uma elaboração disso, mas pesa os dados mais antigos, menos que os novos dados, é uma maneira de influenciar a suavização em direção às costas. Por favor, leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários era apenas minúscula. Boa sorte. Se você está tendo problemas com a matemática, você poderia ir com uma média móvel simples em vez de exponencial. Assim, a saída que você obterá será o último x termos dividido por x. Pseudocódigo não testado: Note que você terá que lidar com as partes inicial e final dos dados, já que claramente você não consegue calcular a média dos últimos 5 termos quando está no seu segundo ponto de dados. Além disso, existem maneiras mais eficientes de calcular essa média móvel (soma total - a mais nova mais recente), mas isso é para obter o conceito do que está acontecendo. respondido fevereiro 8 12 at 20:41 Sua resposta 2016 Stack Exchange, Inc Média móvel exponencial (EMA) A fórmula clássica de EMA é: Ao contrário da média móvel simples. onde o peso de todas as barras anteriores é igual, a Média Móvel Exponencial torna a barra mais recente mais importante. O peso de cada barra mais antiga diminui exponencialmente. Abaixo está um gráfico de peso para N 10 (1 é o preço atual, 2 o anterior e assim por diante): A fórmula do peso é onde eu é uma distância até a barra mais recente. 0 significa o mais recente, 1 o anterior e assim por diante. Primeiro valor A fórmula faz referência ao valor anterior e não há um contrato padrão, ou seja, o primeiro valor (mais antigo). Implementação diferente dos usos da EMA: O primeiro preço (MT4, Marketscope) ou A média móvel simples dos primeiros N preços (Stockcharts). No lugar da média móvel simples A média móvel exponencial pode ser usada exatamente como média móvel simples. especialmente na situação em que a inércia da Média Móvel Simples não pode ser ignorada. Basta comparar EMA (10) e MVA (10) aplicados nos mesmos preços: Limitações A Média Móvel Exponencial baseia-se em todos os seus valores anteriores, portanto, o resultado do indicador para uma barra específica depende da quantidade de dados históricos levados em consideração. Assim, na situação em que mais dados históricos são carregados, o valor do indicador pode diferir do calculado anteriormente. Indicadores Este artigo em outros idiomas
No comments:
Post a Comment