Sunday 12 November 2017

Exponencial Moving Average Algorithm C


Eu sei que isso é viável com o impulso de acordo com: Mas eu realmente gostaria de evitar o uso de impulso. Eu mencionei e não encontrei nenhum exemplo adequado ou legível. Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os números 1000 mais recentes como uma amostra de dados. Qual é a maneira mais fácil de conseguir isso, experimentei usar uma matriz circular, uma média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular correspondiam melhor às minhas necessidades. 12 de junho 12 às 4:38 Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador e, conforme seu código examina cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1, e calcula isso: Você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu coloquei aqui. O problema é que 1000 é uma janela bastante longa para uma média móvel exponencial. Não tenho certeza se houver um alfa que espalhe a média nos últimos 1000 números, sem fluxo inferior no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 às 4:44 1 na sua postagem. A média móvel exponencial pode permitir que o alfa seja variável. Então isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo decorrido desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar o alfa ser (usecs desde a última atualização1000000). Ndash jxh 12 de junho 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados substituídos, evitando a passagem O (N) dispendiosa para calcular a soma - necessária para a demanda média. Total é feito um parâmetro diferente de T para suportar, e. Usando um longo tempo quando totalizando 1000 long s, um int para char s, ou um duplo para float total s. Isso é um pouco falho em que numsamples poderia ultrapassar o INTMAX - se você se importar, você poderia usar um sinal não assinado por muito tempo. Ou use um membro adicional de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (o melhor que renomeou algo inócuo como pos). Respondeu 12 de junho 12 às 5:19 um assume que quotvoid operator (T sample) quot é realmente quotvoid operatorltlt (T sample) quot. Ndash oPless Jun 8 14 às 11:52 oPless ahhh. Bem visto. Na verdade, eu quis dizer que ele seria um operador vazio () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vou consertar, obrigado. Ndash Tony D Jun 8 14 no algoritmo 14: 27C para média móvel exponencial de latência zero Última modificação: 2012-08-13 Eu tenho tentado implementar um corte de baixa freqüência em c que essencialmente leva um fluxo de números e suaviza a saída ( Filtragem de movimento de alta freqüência), porém é importante que os números ponderados da frente sejam considerados imediatamente, pois os dados são críticos no tempo (é controlar uma base de simulação de movimento usando o resultado de um software de jogo). Eu tenho um algoritmo de média móvel ponderada trabalhando, mas poderia fazer com algo um pouco mais responsivo no front-end, e eu achei isso: - O pseudo-código é o seguinte: Entradas: Preço (NumericSeries), Periodo (NumericSimple) Variáveis: Fator (0), lag (0) se CurrentBar lt 1 começar ZLEMA Fator de preço 2 (Período1) atraso (Período-1) 2 final, então, começar Fator ZLEMA (2Preço-Pricelag) (1 fator) ZLEMA1 fim Eu traduzi isso em Para C e meu código é o seguinte: No entanto, ele não parece se comportar bem como espero. Parece estar quase lá, mas às vezes eu recebo um valor ligeiramente inferior ao de todos os itens na fila (quando eles são todos mais altos). Minha fila e o número de itens nele são passados ​​como parâmetros, sendo o mais recente na frente em todos os momentos, também passo um contador de incrementos a partir de 0, conforme exigido pela função. Eu não tenho certeza de que interpretei o significado do ZLEMA1 corretamente, pois não está claro em seu pseudocódigo, então eu considerei que isso é o último zlema de chamadas e também suponho que o preço realmente significa Price0. Talvez eu tenha feito isso errado. Eu deveria estar copiando os valores calculados zlema reais de volta para minha fila original antes da próxima chamada. Eu não mudo a fila original, exceto simplesmente deslocando todos os valores um para o final e inserindo o último no começo . O código que eu uso para fazer isso é: ficaria extremamente agradecido se alguém com uma melhor compreensão da matemática pudesse sanar a sanidade verifique isso para mim para ver se eu tenho algo um pouco errado. Agradeço muito com antecedência se você puder ajudar. Em primeiro lugar, agradeço tudo por Sua contribuição, muito apreciada. Isso faz sentido, acho, então suponho que o melhor que eu possa esperar é simplesmente uma média móvel exponencial, aceitando que haverá um pouco de atraso, mas isso será minimizado pela ponderação frontal mais pesada do que a dada em tipical ponderada Média móvel também tenho esse algoritmo, mas um problema semelhante na medida em que os valores não parecem bastante corretos (a menos que esta seja a natureza da fórmula). Por exemplo, diga que minha matriz contém 16 valores, todos os 0.4775 - a saída é 0.4983, mas espero que seja 0.4775 Isso parece diretamente para você. Média móvel exponencial. Float ema (float vals, int numVals, int currentSample) static float factor 0 static float lastema 0 float ema if (currentSample lt 1) ema vals0 factor 2.0 ((float) numVals) 1.0) else ema (factor vals0) ((1.0 - factor) lastema) lastema ema return ema Inversamente, as vezes a saída é inferior a todas e cada uma das entradas, mesmo que todas sejam mais altas. É chamado da mesma maneira que zlema (.) Acima, com um contador de incremento. A fórmula e o pseudocódigo para este estão aqui: - autotradingstrategy. wordpress20091130exposential-moving-average Obrigado novamente, desculpas pelo meu mal-entendido de alguns dos conceitos básicos: (Atenciosamente, Chris J Quanto ao código que postei, você está certo sobre o tamanho da matriz Situação. Isso deve ser facilmente corrigido. Quanto às suas perguntas: 1) A constante do filtro representa um corte de freqüência. Utilizei um Processamento de Sinal Digital (DSP) para esta técnica. En. wikipedia. orgwi kiLow-pas sfilter é uma explicação simples. Você quer a seção Realização de Tempo Discreto. No meu caso, o A é o RC-Constant de que falam. Portanto, a freqüência que ele corta é acima de 1 (2piA). Se você não tem uma compreensão da teoria do domínio de freqüência, isso pode se tornar complicado. No seu caso, quanto maior você fizer A, menor será a frequência que este filtro permitirá, o que significa que irá suavizar a curva mais e mais. Quanto mais baixo você conseguir, mais ruído é permitido no sistema. Lembre-se de que A deve ser maior ou igual a 1 para ser efetivo. Voltei a colocar o XLS novamente, desta vez sem os números mut rand (). Ajuste a constante A e veja como quotsmoothsquot (ou filtra) as variações de alta freqüência. 2) O último ponto da matriz de entrada tem o valor mais recente. 3) O mesmo é verdadeiro para a matriz de saída. O último é o valor mais recente. 5) O NUMVALS é arbitrário. Você pode adicionar continuamente à matriz de entrada e saída, quantas vezes você quiser e não afetará o filtro. Em particular, usei 49 pontos. Mas eu posso excluir facilmente os últimos 20 e as primeiras 29 saídas permaneceriam as mesmas. A função não é baseada em quantos pontos estão sendo usados. Gostaria de mencionar que desenvolvi essa função para uma conversão única. Se você quisesse fazer uma conversão para o próximo valor, pode tentar algo mais simples (em anexo). Novamente estou enferrujado em c. Espero que isso esteja certo. A única coisa que você precisaria fornecer é a constante de entrada e filtro. Avise-me se isso ajudar.

No comments:

Post a Comment