Monday 25 December 2017

Simple moving average c ++


Na minha aplicação comercial eu tenho ticks ao vivo dos preços das ações. Preciso manter a SMA. Vamos supor que eu quero SMA de 20 velas, onde a duração de cada vela é de 10 segundos. Isso significa que a cada 10 segundos eu tenho um ponto de verificação onde: eu encerro a vela atual e armazene o preço médio nos últimos 10 segundos. A média é (máximo - min) 2 Eu lanço uma vela nova e armazeno o último preço. Eu limpo a vela desactualizada. Eu atualizo o último preço da vela de formação atual e recalculo o SMA. Então, em qualquer marca, preciso recalcular SMA. Na maioria dos casos, apenas o preço da última vela é alterado (porque usamos o último preço). Uma vez por 10 segundos, eu preciso de um pouco mais de trabalho extra - preciso esquecer a média da vela desatualizada e armazenar a média da vela apenas criada. Você pode sugerir como implementar isso com menor latência. A baixa latência é um requisito primário. Pediu 28 de abril às 10:21 Não estou certo se esta é a abordagem que você está procurando, mas aqui está o pseudocódigo para SMAs muito rápidos. Média de Movimento Simples: Eu suponho que seus dados estão vindo na forma de algum fluxo e armazenados na localização de memória contínua (pelo menos com endereços mappáveis ​​continuamente). Assim, com duas adições e uma multiplicação (com 12000) você pode gerar médias móveis subsequentes para Os novos carrapatos. Média móvel exponencial: Essa é uma alternativa decente, como mencionado acima: Aqui não é realmente uma média móvel N-dia. É apenas uma média móvel ponderada com 87 pesos até os últimos N-dias, então quase N-dias é mais parecido. Nota sobre otimizações do compilador: Observe que ativar as opções SSE ou AVX, se disponível, habilitará uma aceleração maciça desses algoritmos, pois vários cálculos podem ser produzidos em um único ciclo de CPU. É pouco provável que o algoritmo produza um erro, a menos que as áreas de memória que estão sendo utilizadas também estão sendo alteradas por outro segmento. Quanto ao recálculo completo. Uma maneira de acelerar seu código é transferir esse processo para um segmento alternativo para que ele não bloqueie a execução do seu cálculo MA principal. Uma vez que isso é uma operação independente, seria muito fácil paralelizar esse código ndash hnk 14 de julho às 12:30 Então você precisa de uma fila, de tamanho bastante fixo, onde você pode adicionar itens de forma eficiente e remover o item mais antigo ( Para removê-lo do seu total em execução). Por que não std :: fila Isso pode se sentar em cima de vários recipientes, mas se você realmente tiver apenas 20 elementos, eu suspeito que um vetor funcionaria bem. (Remover um item requer mover todos os outros itens para baixo - mas mover blocos contíguos de memória é rápido.) Você pode querer comparar o desempenho com um deque ou lista. (A resposta pode depender do que você armazena para cada vela - apenas um único flutuante, ou uma estrutura mais complexa) Eu sei que isso é viável com o impulso conforme: 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 1000 números mais recentes como amostra de dados. Qual é a maneira mais fácil de alcançar 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 adequavam 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, à medida que 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ê precisa apenas encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu já 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. Assim, isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar alpha be (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, evitando a trajetória O (N) cara para calcular a soma - necessária para a média - na demanda. 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 extra de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (melhor então renomeado 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 às 14: 27 Uma média móvel simples é uma média de dados calculada ao longo de um período de tempo. A média móvel é o indicador de preço mais popular usado nas análises técnicas. Esta média pode ser usada com qualquer preço incluindo Hi, Low, Open ou Close, e também pode ser aplicada a outros indicadores. Uma média móvel suaviza uma série de dados, que é muito importante em um mercado volátil, pois ajuda a identificar tendências significativas. Dundas Chart para ASP tem quatro tipos de médias móveis, incluindo Simple, Exponential. Triangular. E Ponderado. A diferença mais importante entre as médias móveis acima é a forma como eles pesam seus pontos de dados. Recomendamos que você leia usando fórmulas financeiras antes de prosseguir. O uso de fórmulas financeiras fornece uma explicação detalhada sobre como usar fórmulas e também explica as várias opções disponíveis para você ao aplicar uma fórmula. Um gráfico de linha é uma boa opção ao exibir uma média móvel simples. Interpretação financeira: a média móvel é usada para comparar os preços de segurança com sua média móvel. O elemento mais importante usado no cálculo da média móvel é um período de tempo, que deve ser igual ao ciclo de mercado observado. A média móvel é um indicador de atraso, e sempre estará por trás do preço. Quando o preço segue uma tendência, a média móvel é muito próxima do preço de segurança. Quando um preço está subindo, a média móvel provavelmente permanecerá baixa devido à influência dos dados históricos. Cálculo: a média móvel é calculada utilizando a seguinte fórmula: na fórmula anterior o valor-n representa um período de tempo. Os períodos de tempo mais comuns são: 10 dias, 50 dias e 200 dias. Uma média móvel se move porque, à medida que cada novo ponto de dados é adicionado, o ponto de dados mais antigo é descartado. Uma média móvel simples dá igual peso a cada preço do ponto de dados. Este exemplo demonstra como calcular uma média móvel de 20 dias usando o método Formula.

No comments:

Post a Comment