Monday 24 February 2020

C code exponential moving average


Eu sei que isso é possível com o impulso como por: Mas eu realmente gostaria de evitar usar impulso. Eu tenho googled e não encontrei qualquer exemplos adequados ou legível. Basicamente, eu quero acompanhar a média móvel de um fluxo em andamento de um fluxo de números de ponto flutuante usando os mais recentes números de 1000 como uma amostra de dados. Qual é a maneira mais fácil de conseguir isso que eu experimentei com o uso de uma matriz circular, média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequado às minhas necessidades. Se suas necessidades são simples, você pode apenas tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador, e como seu código olha para 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 só dura cerca de 1000 amostras. Hmm, Im realmente não tenho certeza que isso é adequado para você, agora que Ive colocá-lo aqui. O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Não tenho certeza se há um alfa que estenderia a média nos últimos 1000 números, sem subfluxo no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou assim, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 em 4:44 1 em seu borne. A média móvel exponencial pode permitir que o alfa seja variável. Portanto, isso permite que ele seja usado para calcular médias de base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última actualização do acumulador for superior a 1 segundo, deixe alfa ser 1.0. Caso contrário, você pode deixar alfa ser (usecs desde a última atualização / 1000000). Ndash jxh Jun 12 12 at 6:21 Basicamente, eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números de ponto flutuante usando os mais recentes números de 1000 como uma amostra de dados. Observe que o abaixo atualiza o total como elementos como adicionado / substituído, evitando costal O (N) traversal para calcular a soma - necessária para a média - on demand. Total é feito um parâmetro diferente de T para suporte, e. Usando um longo longo quando totalizando 1000 s longos, um int para char s, ou um dobro ao total float s. Este é um pouco falho em que numsamples poderia ir passado INTMAX - se você se importa que você poderia usar um unsigned longo longo. Ou usar um membro de dados bool extra para gravar quando o recipiente é preenchido pela primeira vez enquanto ciclismo numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondida em 12 de junho de 12 às 5:19, assume-se que o operador quotvoid (amostra T) é, na verdade, operador quotvoid (T amostra) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer para ser void operador () (T amostra), mas é claro que você poderia usar qualquer nota que você gostava. Vai corrigir, obrigado. Ndash Tony D Jun 8 14 em 14: 27Exponential Moving Average - EMA Carregando o player. Os EMAs de 12 e 26 dias são as médias de curto prazo mais populares e são usados ​​para criar indicadores como a divergência de convergência média móvel (MACD) eo oscilador de preços percentuais (PPO). Em geral, as EMA de 50 e 200 dias são usadas como sinais de tendências de longo prazo. Traders que empregam análise técnica encontrar médias móveis muito útil e perspicaz quando aplicado corretamente, mas criar havoc quando usado de forma inadequada ou são mal interpretados. Todas as médias móveis normalmente utilizadas na análise técnica são, pela sua própria natureza, indicadores de atraso. Conseqüentemente, as conclusões tiradas da aplicação de uma média móvel a um gráfico de mercado específico devem ser para confirmar um movimento de mercado ou para indicar sua força. Muitas vezes, quando uma linha de indicadores de média móvel fez uma alteração para refletir uma mudança significativa no mercado, o ponto ótimo de entrada no mercado já passou. Um EMA serve para aliviar este dilema em certa medida. Porque o cálculo EMA coloca mais peso sobre os dados mais recentes, ele abraça a ação de preço um pouco mais apertado e, portanto, reage mais rápido. Isto é desejável quando um EMA é usado para derivar um sinal de entrada de negociação. Interpretando a EMA Como todos os indicadores de média móvel, eles são muito mais adequados para mercados de tendências. Quando o mercado está em uma tendência de alta forte e sustentada. A linha de indicador EMA também mostrará uma tendência de alta e vice-versa para uma tendência de queda. Um comerciante vigilante não só prestar atenção à direção da linha EMA, mas também a relação da taxa de mudança de uma barra para a próxima. Por exemplo, à medida que a ação de preço de uma forte tendência de alta começar a se nivelar e reverter, a taxa de mudança da EMA de uma barra para a próxima começará a diminuir até que a linha de indicador se aplana ea taxa de mudança seja zero. Por causa do efeito retardado, por este ponto, ou mesmo alguns bares antes, a ação de preço já deve ter invertido. Por conseguinte, segue-se que a observação de uma diminuição consistente da taxa de variação da EMA poderia ser utilizada como um indicador que poderia contrariar o dilema causado pelo efeito retardado das médias móveis. Usos comuns do EMA EMAs são comumente usados ​​em conjunto com outros indicadores para confirmar movimentos significativos do mercado e para avaliar a sua validade. Para os comerciantes que negociam intraday e mercados em rápido movimento, a EMA é mais aplicável. Muitas vezes os comerciantes usam EMAs para determinar um viés de negociação. Por exemplo, se um EMA em um gráfico diário mostra uma forte tendência ascendente, uma estratégia de comerciantes intraday pode ser o comércio apenas a partir do lado longo em um gráfico intraday. C algoritmo para zero latência exponencial de média móvel Última modificação: 13 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 / jitter), no entanto, é importante que os números ponderados dianteiros são considerados imediatamente como os dados é o tempo Crítico (é controlar uma base de simulação de movimento usando a saída de um pouco de software de jogo). Eu tenho um algoritmo de média móvel ponderada de trabalho, mas poderia fazer com algo um pouco mais responsivo no front end, e eu achei isso: - O pseudo-código lá é o seguinte: Entradas: Preço (NumericSeries), Period (NumericSimple) Variáveis: (0), lag (0) se CurrentBar lt 1 então começar ZLEMA Fator de preço 2 / (Period1) lag (Period-1) / 2 end else begin Fator ZLEMA (2Price-Pricelag) (1-factor) ZLEMA1 end Ive translated Ele em C e meu código é o seguinte: No entanto, ele doesnt parecem se comportar bastante como Id esperar. Parece estar quase lá, mas às vezes eu recebo um valor ligeiramente menor do que todos os itens na fila (quando eles são todos mais elevados). 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 eu passar um contador de incremento começando em 0 como exigido pela função. Eu não tenho certeza Ive interpretou o significado de ZLEMA1 corretamente como seu não claro em seu pseudocódigo, então Ive assumiu isso para ser as últimas chamadas zlema e também Im assumindo preço realmente significa Price0. Talvez eu tenha entendido isso errado Eu deveria estar copiando os valores zlema reais calculados de volta à minha fila original antes da próxima chamada Eu não mudo a fila original em todos os outros apenas mudando todos os valores um para o fim e inserindo o mais recente no início . O código que eu uso para fazer isso é: Seria extremamente grato se alguém com uma melhor compreensão da matemática poderia agradar sanidade verificar isso para mim para ver se eu tenho algo ligeiramente errado Obrigado com antecedência se você pode ajudar Em primeiro lugar, graças a todos por Sua entrada, muito apreciada Isso faz sentido eu acho, então eu suponho que então o melhor que eu posso esperar é simplesmente uma média móvel exponencial, aceitando haverá um pouco de atraso, mas isso será minimizado pela ponderação mais pesada frente do que dado em tipcial ponderada Eu tenho esse algoritmo também, mas um problema semelhante em que os valores não parecem muito corretos (a menos que esta seja a natureza da fórmula). Por exemplo, digamos que minha matriz contém 16 valores, todos os 0.4775 - a saída é 0.4983, mas Id espero que seja 0.4775 Isso parece certo para você. / Média móvel exponencial. / Flutuante ema (float vals, int numVals, int currentSample) fator de flutuação estático 0 static float lastema 0 float ema se (currentSample lt 1) ema vals0 fator 2.0 / ((float) numVals) 1.0) else ema (factor vals0) (1,0 - factor) lastema) ema ema ema retornar Ao contrário, por vezes, a saída é inferior a cada uma das entradas, mesmo se todos são mais elevados. É chamado da mesma forma que zlema (.) Acima, com um contador de incremento. A fórmula e o pseudocódigo para este estão aqui: - autotradingstrategy. wordpress / 2009/11/30 / expo nential-mo ving-avera ge / Agradecemos novamente, desculpas por meu mal-entendido de alguns dos princípios :( Atenciosamente, Chris J As Para o código que eu postei, você está certo sobre a situação do tamanho da matriz. Isso deve ser facilmente fixado. Como para as suas perguntas: 1) A constante do filtro representa um corte de freqüência. Eu usei um Digital Signal Processing (DSP) para esta técnica. En. wikipedia. org/wi ki / Low-pas sfilter é uma explicação simples. Você deseja a seção Discrete-Time Realization. No meu caso, o A é o RC-Constant que eles falam. Assim, a freqüência de corte é acima de 1 / (2piA). Se você não tem uma compreensão da teoria de domínio de freqüência, isso pode ficar complicado. No seu caso, Quanto mais alto você faz A, menor a freqüência que este filtro permitirá, o que significa que vai suavizar a curva mais e mais. Quanto mais baixo você fizer, mais ruído é permitido no sistema. Lembre-se A deve ser maior ou igual a 1 para ser eficaz. Eu reattached o XLS outra vez, esta vez sem os números mudando do rand (). Ajustar a constante A e ver como ele quotsmoothsquot (ou filtros) 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 para a matriz de entrada e saída quantas vezes você gosta e não afetaria o filtro. Em particular, usei 49 pontos. Mas eu posso apagar facilmente os últimos 20 e as primeiras 29 saídas permanecerão as mesmas. A função não é baseada em quantos pontos estão sendo usados. Gostaria de mencionar que desenvolvi esta função para uma conversão de uma só vez. Se você quisesse fazer uma conversão para o valor seguinte na mosca você poderia tentar algo mais simples (como anexado). Novamente Im rusty em c. Espero que isto 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