Wednesday 19 July 2017

Média Móvel Sem Buffer


MetaTrader 5 - Indicadores Averaging Price Series para Cálculos Intermediários Sem Usar Buffers Adicionais Introdução Em meu artigo Os Princípios de Cálculo Econômico de Indicadores Eu fiz testes razoavelmente convincentes que provam o fato de que nem toda chamada de um indicador personalizado ou técnico em um código é a Forma mais ótima de realizar cálculos intermediários em um indicador desenvolvido. A velocidade final de execução pode parecer muito menor, comparando com o que teríamos se colocássemos o código para cálculos intermediários diretamente em nosso indicador. Este tipo de abordagem para escrever um código seria muito atraente, se fosse bastante simples. De fato, parece ser uma complicação séria de um código com a descrição de buffers adicionais usados ​​para armazenar resultados intermediários de cálculo. Apesar da variedade de cálculos intermediários, a maioria deles necessita de algoritmos diferentes de cálculo da média. Na maioria dos casos, para eles podemos usar funções personalizadas simples e universais que simplificam significativamente a tarefa de escrever esse código. O processo de criar essas funções e trabalhar com elas será descrito neste artigo. 1. A idéia geral de funções de média que trabalham com uma barra A abordagem clássica para a média em uma barra atual consiste em um buffer indicador intermediário, que preenchemos com as informações necessárias e, em seguida, selecionar um intervalo de valores anteriores, que é igual a O período de média e calcular o valor médio. O procedimento de processamento desta seleção é o seguinte: SmoothVar (barra) Função Var (bar - (n-1)), Var (bar - (n-2)) Var (bar)) SmoothVar Número de uma barra, para a qual o cálculo é realizado Var (bar - (n-1)) parâmetros médios com uma mudança em (n-1) barras n número de barras para a média. Tal abordagem para a média, no nosso caso, leva à aparição de dois ciclos de cálculo. No primeiro ciclo, os dados são calculados e colocados num tampão intermediário. No segundo ciclo, a média utilizando outro ciclo de pesquisa adicional de células do tampão indicador é realizada com base na fórmula sugerida acima. Este cálculo será muito mais fácil se acumularmos a seleção de dados intermediários dentro da própria função. Neste caso, a função da média será a seguinte: SmoothVar (bar) Função (Var (barra), bar) Um novo valor Var (bar) é escrito para a seleção de valores dentro da função em uma barra atual eo Valores de Var (bar - n) que se tornam desnecessários são excluídos da seleção. Com esta abordagem, um código de média parece muito trivial e não requer tampões indicadores adicionais. Dentro da função, a matriz armazena a quantidade exata necessária de dados necessários para o cálculo de uma barra, e não os dados de todo o histórico. Neste caso, há também apenas um ciclo de cálculo de dados. Note-se que, para chamar esta função de média em uma barra atual, você deve chamá-la em todas as barras anteriores primeiro 2. A média clássica como um exemplo de implementação de uma função que funciona com uma barra Essas funções de média deve conter Variáveis ​​que não devem perder seus valores entre as chamadas dessas funções. Além disso, a média de um único tipo com diferentes parâmetros pode ser usado em um código por muitas vezes, portanto, para evitar um conflito de usar recursos de memória compartilhada, devemos implementar essas funções como classes e isso é o que eu fiz. Os algoritmos da média clássica são descritos na classe CMovingAverage: Esta classe é derivada da classe base CMovSeriesTools que contém funções protegidas adicionais-métodos e uma verificação de correção do período de médias móveis. A classe base contém um código universal adicional que é usado em todas as classes que eu sugiro, e não há nenhum ponto em copiá-lo para muitas vezes para as classes derivadas. Em tarefas aplicadas de utilização da média, os membros da classe protegida não são utilizados de forma explícita, por isso permite suspender a sua visão geral de momento. A classe CMovingAverage consiste em cinco funções de média de um único tipo, cujos nomes falam por si, e eles não precisam ser descritos em detalhes. A primeira função MASeries () é uma coleção integral de quatro outras funções que permitem selecionar um algoritmo de média usando o parâmetro MAMethod. O código dos algoritmos de média é otimizado para o desempenho máximo, e é por isso que os principais parâmetros de funções (comprimento, série, barra) são complementados com parâmetros adicionais começam, prevcalculated, ratestotal e set, cujo objetivo é absolutamente idêntico As variáveis ​​indicadoras com os mesmos nomes. O conjunto de parâmetros define o sinalizador de indexação de elementos de uma série de séries de preços nas funções de média para ser o mesmo que os arrays de variáveis. Devemos considerar que todas as funções de média desta classe têm o parâmetro Comprimento fixo e não pode ser alterado quando o código de programa está sendo executado A função EMASeries () da classe CMovingAverage tem este parâmetro do tipo double Agora, conforme nos familiarizamos Com a classe CMovingAverage. Podemos começar a usá-lo em indicadores. Para fazê-lo, usando a diretiva include adicione o conteúdo do arquivo MASeriesCls. mqh no escopo global ao código de indicador que você desenvolve: Em seguida, você deve determinar o número necessário de procedimentos de média no código do indicador e, em seguida, no OnCalculate () (Antes dos operadores de loop e chaves) declarar as variáveis ​​estáticas da classe CMovingAverage de acordo com o número necessário de procedimentos de média. Deve haver uma variável separada da classe e uma célula separada na matriz da classe para cada procedimento de cálculo da média. As variáveis ​​da classe na função OnCalculate () são declaradas como estáticas, porque seus valores devem ser mantidos entre as chamadas dessa função. Agora podemos começar a trabalhar com a média. Como exemplo, eu vou mostrar quatro procedimentos consecutivos de média da série de preços - SMA / EMA / SMMA / LWMA (o indicador MAx4.mq5): O resultado de cada média anterior (excluindo o último) é usado no próximo algoritmo De média, e o resultado final é passado para o tampão indicador. Acho que a parte mais importante deste código é muito cuidado inicialização preliminar de variáveis ​​de índices que mostram o início de barras confiáveis. Nessa situação, ele terá a seguinte aparência: Observe que, nesta situação, o algoritmo LWMA de média é o último e não afeta nada, mas se não fosse o último, então o deslocamento do início da informação confiável seria igual Para Length41, não Length4 Eu quero adicionar, se não for claro a partir do código anterior, que número a informação confiável começa, pegue um número maior e, em seguida, diminuí-lo experimentalmente se necessário. 3. Comparando o Indicador Criado usando Classes com seus Analogos que Usam Indicadores Técnicos e Personalizados Seria muito interessante comparar o desempenho do indicador criado MAx4.mq5 com seu análogo idêntico (iMAx4.mq5) que usa o indicador técnico iMA () . Bem, assim que tivermos decidido realizar o teste, será razoável testar outro indicador (MAx3x1.mq5) semelhante ao MAx4.mq5, mas com a primeira média feita usando a chamada do indicador técnico iMA () ea Outros três usando a classe CMovingAverage. E assim que o conjunto padrão de indicadores do terminal cliente inclui o indicador Custom Moving Average. mq5, fiz outro indicador análogo em suas bases para fins de teste (cMAx4.mq5). Para a próxima análise que preparei para o teste Expert Advisors: MAx4Test. mq5, iMAx4Test. mq5, MAx3x1Test. mq5 e cMAx4Test. mq5, respectivamente. As condições de realização de tais testes foram descritas em detalhes no artigo Princípios de Cálculo Econômico de Indicadores. Neste artigo, eu não vou descrever os detalhes do teste, mas eu vou mostrar os resultados finais de execução de todos os quatro Expert Advisor no testador de estratégia para os últimos 12 meses no EURUSD 4 com a modelagem de cada tick eo valor Dos parâmetros de entrada período de todos os EAs igual a 500. Os piores resultados em nossos testes são mostrados pelo indicador que chama indicadores personalizados, portanto, esta variante de escrever um código pode ser recomendado apenas para os preguiçosos Claro, outro líder vinda última Mas que se baseia em chamadas de indicadores técnicos tem resultados muito melhores, no entanto, eles estão muito longe de um ideal. O verdadeiro líder dos testes é o indicador que é desenvolvido usando classes O híbrido que usa classes e indicadores técnicos tomou o segundo lugar, mas isso não acontece sempre se o tempo de teste de um indicador é crucial, então é melhor verificar essas variantes Pessoalmente para cada situação. Visão geral das classes implementadas de média A classe CMovingAverage previamente descrita inclui cinco algoritmos de cálculo de média. A classe CCMO contém algoritmos de média e oscilador. As outras classes incluem algoritmos simples de média. A ideologia de usar qualquer uma das classes sugeridas é absolutamente a mesma para o procedimento de usar a classe CMovingAverage descrita acima. O código de todos os algoritmos de média (exceto o parabólico) é otimizado para a máxima velocidade de execução. O código de média parabólica não foi otimizado, devido à complexidade deste processo. Os últimos três algoritmos não representam uma média. Eu os adicionei por causa de sua alta popularidade e compatibilidade com os trabalhos de analistas técnicos populares. Para facilitar a compreensão das informações, é melhor representar os algoritmos de média em arquivos. mqh separados e para uso prático, a melhor variante é tê-los em um único arquivo. Para usar em indicadores, todas as classes sugeridas são compactadas para o único arquivo SmoothAlgorithms. mqh. Além disso, o arquivo é complementado com as funções do arquivo iPriceSeries. mqh. Apenas a função PriceSeries () é utilizada nos exemplos deste artigo: Esta função destina-se a trabalhar com bases de indicadores sobre a utilização do segundo tipo de chamada da função OnCalculate (). A idéia principal de criar esta função é estender o conjunto de timeseries de preço da enumeração ENUMAPPLIEDPRICE com variantes personalizadas. A função retorna o valor de um timeseries de preço por seu número que varia de 1 a 11. 4. Exemplos Práticos de Implementação de um Código de Programa usando as classes de média Se é suficiente para mostrar outro exemplo de usar as outras classes, para ter certeza de que Tudo é feito da mesma forma que com a média quádrupla. Eu vou mostrar uma variante de implementação da função OnCalculate () em um analógico do indicador CCI usando as classes CJJMA e CJurX (JCCX. mq5) Mas desta vez eu adicionei as classes apropriadas de outro arquivo no escopo global no código Do indicador: Agora, eu quero manter sua atenção em outra coisa. A questão é um grande número de indicadores podem ser representados como funções de uma barra, que são realmente confortáveis ​​para trabalhar com o uso de classes. Por exemplo, seria interessante desenhar o canal de Bollinger com base na média móvel Vidya de Tushar Chande. Neste caso, duas classes CCMO e CStdDeviation são usadas. Usando a primeira classe, obtemos o valor da média móvel VIDYA e usando a segunda, calculamos o valor do desvio padrão da série de preços para a média móvel. Depois disso, usamos esse desvio para o cálculo da borda superior e inferior do canal: Então, temos uma classe simples e pequena Os últimos três parâmetros de entrada da função VidyaBandsSeries () passam os valores necessários do canal através de um link . Gostaria de observar que, neste caso, você não pode declarar as variáveis ​​de classes dentro da função VidyaBandsSeries () e torná-las estáticas, porque as variáveis ​​estáticas nas classes têm um significado muito diferente. É por isso que esta declaração deve ser feita no escopo global da classe: Em um canal de Bollinger normal, o período de média da média móvel e o período de média do canal em si são sempre iguais. Nesta classe, Ive feita esses parâmetros separados para lhe dar mais liberdade (EMAperiod e BBLength). O próprio indicador (VidyaBBands. mq5) feito com base nesta classe é tão simples na utilização da classe CVidyaBands que não precisamos analisar seu código no artigo. Essas classes de funções de indicador devem ser colocadas em um arquivo mqh separado. Eu coloquei essas funções no arquivo IndicatorsAlgorithms. mqh. 5. Comparando o Desempenho de um Indicador que Usa Classes com um que não é Primeiro de tudo, eu quero descobrir, como o uso de classes ao escrever um código de um indicador diminui o seu desempenho Para este efeito, o código do indicador JJMA. mq5 foi escrito sem usar as classes (JMA. mq5). Então foi testado nas mesmas condições que durante o teste anterior. Os resultados finais dos testes não têm uma grande diferença: Claro, existem algumas taxas adicionais para usar as classes, mas eles não são significativos em comparação com as vantagens que proporcionam. 6. Vantagens de usar as classes de média Uma vantagem de usar esses algoritmos, que é realmente convincente, é que a substituição de chamadas de indicadores técnicos e personalizados leva a um grande aumento de desempenho do código desenvolvido descrito acima. Outra vantagem prática de tais classes é uma grande conveniência de usá-los. Por exemplo, tudo o que é descrito no popular livro de William Blau Momentum, Direção e Divergência parece ser um verdadeiro campo de testes para este tipo de abordagem para escrever indicadores. O código dos indicadores sai como máximo comprimido, compreensível e muitas vezes consistindo de um único ciclo de recálculo de barras. Você pode facilmente desenvolver qualquer indicador - um clássico ou técnico, usando os métodos alternativos de média. Uma grande variedade de algoritmos de média oferece amplas possibilidades para a criação de sistemas de comércio não-tradicionais, muitas vezes com uma detecção precoce de tendências e menor número de falso disparo. 7. Algumas recomendações sobre como usar os algoritmos de média em um código de indicador específico Uma rápida olhada simples em qualquer indicador desenvolvido usando diferentes algoritmos de média aqui descritos é suficiente para entender quão diferentes são esses algoritmos. Portanto, seria razoável supor que nem todos os algoritmos sugeridos são igualmente bons em cada situação. Embora seja difícil determinar um limite estrito de uso de um ou outro algoritmo, é possível fornecer algumas recomendações gerais sobre como usá-las. Por exemplo, os algoritmos de Tushar Chande e Kaufman destinam-se a determinar situações de tendência e não são adequados para suavização adicional para efeitos de filtragem de ruído. Por conseguinte, é melhor introduzir séries de preços não processados ​​ou valores de indicadores sem uma média para estes algoritmos. Aqui está o resultado do processamento de valores do indicador Momentum usando o algoritmo de Kaufmans (o indicador 4cMomentumAMA. mq5) Eu acho que os algoritmos de média clássica não precisam de recomendações especiais. Sua área de aplicação é bastante larga. Em todos os lugares, onde esses algoritmos são usados, você pode usar com sucesso os quatro algoritmos à esquerda (JMA, T3, ultralinear e parabólico). Aqui está um exemplo do indicador MACD onde EMA e SMA são substituídos com a média JMA (o indicador JMACD. mq5): E aqui está o resultado da suavização do indicador calculado em vez de mudar seu algoritmo de média para uma melhor qualidade de determinação A tendência atual (o indicador JMomentum. mq5): Não é uma surpresa que o comportamento dos mercados muda constantemente, portanto, seria ingênuo pensar que você pode encontrar o único algoritmo ideal para uma certa parte do mercado financeiro agora e Para sempre Alas Nada neste mundo dura para sempre No entanto, como para mim por exemplo, neste mercado eternamente em mudança eu uso frequentemente os indicadores de tendências rápidas e de médio prazo como JFATL. mq5 e J2JMA. mq5. Estou bastante satisfeito com as previsões em sua base. Outra coisa que quero acrescentar. Os algoritmos de cálculo de média são reutilizáveis. Bons resultados podem ser obtidos quando se aplica a média repetida a valores já médios. Por uma questão de fato, neste artigo comecei a analisar o processo de desenho do indicador a partir dele (o indicador MAx4.mq5). 8. A idéia geral do código de composição dos algoritmos de avaliação E agora, no final do artigo, gostaria de prestar atenção ao mecanismo das funções de calcular a média. Em primeiro lugar, a maioria dos algoritmos de média inclui arrays dinâmicos de variáveis ​​do tipo mSeriesArray para armazenar os valores da série de parâmetros de entrada. Assim que as informações significativas para cálculo aparecer, você deve alocar a memória para essa matriz por um tempo. É feito usando a função SeriesArrayResize () da classe CMovSeriesTools. Em seguida, em cada barra você deve escrever o valor atual da série de séries de preços para o valor mais antigo da matriz e memorizar o número de sua posição na variável mcount. É feito usando a função RecountArrayZeroPos () da classe CMovSeriesTools. E agora, se precisarmos encontrar um elemento com uma mudança relativa para o elemento atual, devemos usar a função RecountArrayNumber () da classe CMovSeriesTools: Normalmente, em tais situações, o elemento mais novo é gravado em uma posição zero e os outros Exceto a mais antiga) são substituídas preliminarmente às próximas posições por turno no entanto, não é salvar os recursos do computador, ea abordagem mais complexa descrita acima parece ser mais racional. Além dos algoritmos de média, os corpos dessas funções contêm As chamadas de funções utilizadas para a determinação de posições de barra relativamente ao início do cálculo de barras: o momento em que há informação suficiente para a inicialização inicial de variáveis ​​e situações quando a última barra é fechada: A primeira verificação determina uma situação quando há Não são barras suficientes para a função de média funcionar, e ele retorna um resultado vazio. Uma vez que a segunda verificação é passada com êxito e há dados suficientes para o primeiro cálculo, a inicialização das variáveis ​​é executada por uma vez. Duas últimas verificações são necessárias para o correto processamento múltiplo de valores na barra não fechada atual. Já o descrevi no meu artigo dedicado à otimização de um código de programa. E agora algumas palavras sobre a otimização do código do programa de tais funções para o máximo desempenho. Por exemplo, o algoritmo SMA implica a média dos valores selecionados de um período de uma série de preços em cada barra. Esses valores são literalmente somados e divididos pelo período em cada barra. Mas a diferença entre a soma na barra anterior ea soma na barra atual é a primeira é somada com o valor da série de preços com um deslocamento em um período relativamente ao período atual e o segundo - com o valor atual . Portanto, seria muito racional calcular essa soma apenas uma vez durante a inicialização das funções e, em seguida, em cada barra adicionar apenas novos valores da série de preços a esta soma e subtrair os valores mais antigos a partir dele. Isso exatamente é feito em tal função. Conclusão Sugerido nas implementações do artigo dos algoritmos de média usando as classes são simples, de tipo único e universal, então você não terá problemas para estudá-los. Os arquivos anexados ao artigo contêm muitos exemplos para facilitar a compreensão desta abordagem para escrever código de indicadores. No arquivo Includeen. zip todas as classes são distribuídas em arquivos. O arquivo Includeen. zip contém apenas dois arquivos que são suficientes para compilar todos os indicadores no arquivo Indicators. zip. Os Expert Advisors para testes estão no arquivo Experts. zip. Eu estou tentando completar um projeto de atribuição Matlab com a seguinte pergunta: Escreva uma função chamada movingaverage que leva um escalar chamado x como um argumento de entrada e retorna um escalar. A função usa um buffer para armazenar entradas anteriores, eo buffer pode conter no máximo 25 entradas. Especificamente, a função deve salvar as mais recentes 25 entradas em um vetor (o buffer). Cada vez que a função é chamada, ele copia o argumento de entrada em um elemento do buffer. Se já houver 25 entradas armazenadas no buffer, descarta o elemento mais antigo e salva o atual no buffer. Depois de ter armazenado a entrada no buffer, ele retorna a média de todos os elementos no buffer. A solução que eu forneço é a seguinte: De acordo com o auto grader minha função funciona corretamente quando valores 1-50 estão passando consecutivamente, mas falha quando os valores de uma onda senoidal barulhenta estão passando consecutivamente (o que eu tenho sido informado que pode ser devido a alguns Tipo de um erro de arredondamento). Eu ficaria grato se algum de vocês pudesse me fornecer algumas dicas sobre as possíveis etapas de erro no meu código (anexado acima). Obrigado antecipadamente Um método simples e geral para preencher os dados em falta, se você tiver execuções de dados completos, é usar a regressão linear. Digamos que você tem 1000 execuções de 5 em uma linha com nenhum em falta. Configure o vetor 1000 x 1 y e 1000 x 4 matriz X: Regressão lhe dará 4 números a b c d que dão uma melhor correspondência para suas 1000 linhas de dados mdash dados diferentes, diferentes a b c d. Então você usa estas a b c d para estimar (prever, interpolar) wt0 ​​ausente. (Para os pesos humanos, eu esperaria que abcd ficasse em torno de 1/4.) (Há centenas de livros e artigos sobre regressão, em todos os níveis. Para a conexão com a interpolação, porém, eu não sei de uma boa introdução ninguém) Sei que isso é viá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: 27É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Ive descobri que eu posso otimizar um pouco, escolhendo um tamanho de janela thats um poder de dois para permitir bit - shifting em vez de dividir, mas não precisando de um buffer seria bom. Existe uma maneira de expressar um novo resultado da média móvel apenas como uma função do antigo resultado e da nova amostra Definir um exemplo de média móvel, através de uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada recursivamente , Mas para um cálculo exato da média móvel você deve se lembrar da amostra de entrada mais antiga na soma (ou seja, o a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito recursivamente como Então você sempre precisa lembrar a amostra xn-N para calcular (2). Como indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa), que permite calcular a saída somente da saída anterior e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas uma média exponencial Ponderada média móvel, onde as amostras mais no passado obter um peso menor, mas (pelo menos em teoria) você nunca esquecer nada (os pesos apenas ficar menor e menor para amostras no passado). Inicialize total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), uma add totalnewValue, um incremento (count), uma divide average (total / count) Esta seria uma média móvel sobre todas as entradas Para calcular a média Sobre apenas as 4 últimas entradas, exigiria 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga, calculando a nova média móvel como a soma das 4 variáveis ​​de entrada, dividida por 4 (desvio para a direita 2 seria bom se todas as entradas fossem Positivo para fazer o cálculo médio

No comments:

Post a Comment