Sunday 13 January 2019

Moving average code vba


Eu quero calcular uma média móvel do último, digamos 20, números de uma coluna. Um problema é que algumas das células da coluna podem estar vazias, elas devem ser ignoradas. Exemplo: uma média móvel dos últimos três seria (155167201) 3. Eu tentei implementar isso usando média, offset, índice, mas eu simplesmente não sei como. Estou um pouco familiarizado com as macros, então essa solução funcionaria bem: MovingAverage (A13) Obrigado por quaisquer dicas ou soluções solicitadas 12 de março 11 às 15:36 Digite isso com controlshiftenter para torná-lo uma fórmula de matriz. Isto irá encontrar os últimos três valores. Se quiser mais ou menos, altere as duas instâncias de 3 na fórmula para o que quiser. Esta parte retorna o 4º número de linha mais alta de todas as células que possuem um valor ou 5 no seu exemplo porque as linhas 6, 8 e 9 são as linhas 1 a 3 maiores com um valor. Esta parte retorna 9 TRUEs ou FALSEs com base em se o número da linha é maior do que o 4º maior. Isso multiplica os valores em A1: A9 por esses 9 TRUEs ou FALSEs. TRUEs são convertidos para 1 e FALSEs para zero. Isso deixa uma função SUM como essa. Porque todos os valores acima de 155 não satisfazem o critério do número da linha, o resultado é multiplicado por zero. Escrevi um pequeno script no VBA. Espero que faça o que quiser. Aqui você está: 1) Eu estabeleci o limite para 360 células. Isso significa que o script não procurará mais de 360 ​​células. Se você deseja alterá-lo, mude o valor inicial do contador. 2) O script retorna a média não arredondada. Altere a última linha para MovingAverage Round (CDbl (tmp i), 2) 3) O uso é exatamente como você queria, então digite MovingAverage (a13) na célula. Todos os comentários são bem-vindos. Aqui é um código que deve ser útil para aqueles que usam análise técnica na negociação e que desejam testar estratégias no Excel. Calcula a média móvel simples, linearmente ponderada e exponencial. Além disso, vou apresentar e explicar as etapas para criar o formulário e o código VBA. Inserir um UserForm 8211 Nome: MAForm Adicionar quatro etiquetas dos controles da caixa de ferramentas 8211 Legendas conforme a tela de impressão acima Adicione uma ComboBox para a seleção do tipo de média móvel. Foi chamado comboTypeMA. Adicione dois controles RefEdit para o intervalo de entrada e o intervalo de saída. Adicionar uma caixa de texto para selecionar o período médio móvel Adicionar dois botões: Nome: botãoSubmit, Legenda: Enviar e Nome: botãoCancelar, Legenda: Cancelar Para gerar a lista suspensa para a seleção do tipo MA e carregar o formulário do usuário, um novo módulo Será inserido com o código abaixo. Os itens da ComboBox devem ser preenchidos por tipos de médias móveis e o formulário do usuário será carregado. Option Explicit Sub loadMAForm () Com MAFormboTypeMA. RowSource. AddItem Simples. AddItem Ponderado. AddItem Exponential End Com MAForm. Show End Sub Abaixo está o código atribuído ao botão Enviar. Private Sub buttonSubmitClick () Dim inputRange, outputRange As Range O inputRange conterá a série de preços usada para computar as MAs e o outputRange será preenchido com os valores das médias móveis. Dim InputPeriod As Integer O período médio móvel é declarado. Dim inputAddress, outputAddress As String Os intervalos de entrada e saída declarados como string. Se comboTypeMA. Value ltgt Exponencial e comboTypeMA. Value ltgt Simples e comboTypeMA. Value ltgt Ponderado True então MsgBox Selecione um tipo médio móvel da lista. RefInputRange. SetFocus Exit Sub Esta parte do procedimento impõe as primeiras restrições relativas aos dados enviados. Se o tipo de média móvel não estiver contido na lista suspensa, o procedimento não procederá ao próximo passo e o usuário será solicitado a selecioná-lo novamente. ElseIf RefInputRange. ValueThen MsgBox Selecione o intervalo de entrada. RefInputRange. SetFocus Exit Sub ElseIf RefOutputRange. ValueThen MsgBox Selecione o intervalo de saída. RefOutputRange. SetFocus Exit Sub ElseIf RefInputPeriod. ValueThen MsgBox Por favor, selecione o período médio móvel. RefInputPeriod. SetFocus Exit Sub ElseIf Not IsNumeric (RefInputPeriod. Value) Então MsgBox Moving período médio deve ser um número. RefInputPeriod. SetFocus Exit Sub End Se outras restrições forem criadas. O intervalo de entrada, o intervalo de saída eo período de entrada não devem estar em branco. Além disso, o período médio móvel deve ser um número. InputAddress RefInputRange. Value Set inputRange Range (inputAddress) outputAddress RefOutputRange. Value Set outputRange Range (outputAddress) inputPeriod RefInputPeriod. Value Os argumentos para intervalos inputRange e outputRange serão entradaAddress e outputAddress declarados como strings. Se inputRange. Columns. Count ltgt 1 Então o intervalo de entrada MsgBox pode ter apenas uma coluna. RefInputRange. SetFocus Exit Sub O inputRange deve conter apenas uma coluna. ElseIf inputRange. Rows. Count ltgt outputRange. Rows. Count Então o intervalo de saída MsgBox tem um número diferente de linhas do que o intervalo de entrada. RefInputRange. SetFocus Exit Sub End If O inputRange e outputRange devem ter um número igual de linhas. Dim RowCount As Integer RowCount inputRange. Rows. Count Dim cRow As Integer ReDim inputarray (1 para RowCount) Para cRow 1 Para RowCount inputarray (cRow) inputRange. Cells (cRow, 1).Value Next cRow inputarray é declarado como array e it8217s Corresponde aos valores de cada linha do intervalo de entrada. Se inputPeriod gt RowCount Then MsgBox O número de observações selecionadas é amplificador amp RowCount e o período é amplificador amplificador InputPeriod. O intervalo de entrada deve ter uma quantidade maior ou igual de elementos que o período selecionado. RefInputRange. SetFocus Exit Sub End If Outra restrição é adicionada 8211 O intervalo de entrada deve ter uma quantidade maior ou igual de elementos do que o período. Se inputPeriod lt 0, então o período médio de MsgBox Moving deve ser superior a 0. RefInputPeriod. SetFocus Exit Sub End If O período médio móvel deve ser superior a zero. ReDim outputarray (inputPeriod To RowCount) Como Variant Também são determinadas as dimensões da matriz do outputarray. O limite inferior da matriz é o valor inputPeriod eo limite superior é o valor de RowCount (o número de elementos na entradaRange). Abaixo parte do procedimento calculado a média móvel simples, se a seleção para comTypeMA for simples. SMA ----------------------------------------- Se comboTypeMA. Value Simples Então Dim i , J Como Inteiro Dim temp Como Duplo Para i InputPeriod Para Temp de RowCount 0 Para j (i - (inputPeriod - 1)) Para i temp temp inputarray (j) Próximo j outputarray (i) entrada de temperaturaPeriod output outputRange. Cells (i, 1).Value outputarray (i) Next i outputRange. Cells (0, 1).Value SMA (amp inputPeriod amp) Basicamente, o procedimento calcula a média móvel dos últimos números x (x é igual ao InputPeriod), começando com o elemento de O inputarray é igual ao InputPeriod. Abaixo está um exemplo simplificado, que mostra cada etapa do procedimento. Neste exemplo, existem quatro números (no01, no02, no03 e no04) da linha 1 para a linha 4 e o período médio móvel é 3. Após cada nova média móvel, cada célula do outputRange irá tirar o valor do Outputarray. E depois de todas as médias móveis são computadas, na célula acima do outputRange, um título será inserido contendo o tipo e período médio móvel. Esta próxima parte computará a média móvel exponencial. EMA ------------------------------------------ ElseIf comboTypeMA. Value Exponential Then Dim Alpha Como duplo alfa 2 (inputPeriod 1) Para j 1 Para inputPeriod temp temp temparrayar (j) Próximo j outputarray (inputPeriod) temp inputPeriod Primeiro o valor de alpha é determinado. Porque na computação, o valor da EMA é baseado no EMA anterior, o primeiro será a média móvel simples. Para i inputPeriod 1 Para RowCount outputarray (i) outputarray (i - 1) alfa (inputarray (i) - outputarray (i - 1)) Próximo i Começando com a segunda média móvel, eles serão computados com base na fórmula acima: Anterior EMA plus alpha multiplicado pela diferença entre o número atual do inputarray e o valor EMA anterior. Para i inputPeriod Para RowCount outputRange. Cells (i, 1). Outputarray de Válido (i) Próximo i outputRange. Cells (0, 1).Value EMA (amp inputPeriod amp) Assim como o código para SMA, o outputarray será preenchido e A célula acima do outputarray representará o tipo eo período da média móvel. Abaixo está o código para calcular a média móvel ponderada. WMA ------------------------------------------ ElseIf comboTypeMA. Value Weighted Then Dim Temp2 As Integer Para i inputPeriod Para RowCount temp 0 temp2 0 Para j (i - (inputPeriod - 1)) Para i temp temp inputarray (j) (j - i inputPeriod) temp2 temp2 (j - i inputPeriod) Next j outputarray (i ) Temp temp2 outputRange. Cells (i, 1).Value outputarray (i) Next i outputRange. Cells (0, 1).Value WMA (amp inputPeriod amp) End If A tabela abaixo contém as etapas para calcular cada variável usada para o Cálculo de WMA. Assim como no exemplo anterior, neste há os números na entradaRange. E o período de entrada é 3. Abaixo está o código final do procedimento, que descarrega o formulário de usuário. Descarregar o MAForm End Sub O procedimento abaixo é para o botão Cancelar. Será adicionado no mesmo módulo. Botão Sub privadoCancelClick () Descarregue MAForm End Sub, onde2 (1 n) O subtítulo t é usado para indicar o tempo, por exemplo, T-1 refere-se ao período antes de t e n, a ser especificado pelo usuário, refere-se ao período de notificação média da EMA. Por exemplo, o equivalente EMA de uma média móvel simples de 3 períodos tem n de 3. Quanto maior o valor de n, menor será. Isso resulta em um maior (1-) e mais de EMA t-1 é retido em EMA t. O primeiro valor da EMA em uma série temporal pode ser assumido como uma média móvel simples de n dias8217 de preços. Alguns usuários também podem preferir iniciar o primeiro valor da EMA a partir do segundo período em que EMA no período 2x período 2 preço (1 8211) x período 1 preço. Os usuários devem entender que a média móvel exponencial é realmente uma expansão de série infinita onde os preços anteriores têm um peso cada vez menor em EMA t. Considere o seguinte: Isso resulta em que o EMA é mais responsivo e menos volátil do que o equivalente em média móvel simples. Uma discussão mais detalhada sobre isso pode ser encontrada no meu artigo sobre filtros em finanças e análise técnica. O Método A usa funções, enquanto o Método B usa procedimentos secundários para calcular CMF. O método B é mais rápido e flexível. Cole este código na sua janela de código do ThisWorkBook no VBA. Clique com o botão direito do mouse neste WorkBook no Project Explorer e clique em View Code. Private Sub WorkbookOpen () O resto pertence a qualquer módulo Tells Excel para incluir estes na lista de funções, adicionar descrições a eles e criar uma nova categoria chamada de Indicadores Técnicos. Macro Application. MacroOptions: EMA, Descrição: Retorna a média móvel exponencial. Amp Chr (10) amp Chr (10) amp Selecione os últimos períodos EMA ou o preço dos últimos períodos se o período atual for o primeiro. Amp Chr (10) amplificador Chr (10) amp Seguido pelo preço atual e n. Amp Chr (10) amp Chr (10) amp Chr (10) amp O fator de decaimento da média móvel exponencial é calculado como alpha2 (n1), Public Function EMA (EMAYesterday, price, n) EMA alpha price (1-alpha) EMAYesterday Uma vez que você concluiu o acima, você pode calcular a média móvel exponencial digitando em qualquer célula EMA (Última Período EMA, Preço Atual, n). Insira o preço do último período como o último período EMA se você estiver calculando o primeiro EMA do seu conjunto de dados. Para executar o Método B, você deve copiar o Subárbol Runthis da página na Linha de Distribuição Accumulation para o seu módulo. Você também deve executar o EMA do submarino Runthis. Adicione a seguinte linha ao sub Runthis Coloque-o imediatamente antes do End Sub E desative todas as outras macros que o Runthis chamará Este Sub começará a calcular EMA a partir de T2 em diante Sub EMA (fechar1 como Range, output As Range, n As Long) close0 close1 ( 1, 1).Address (False, False) close1a close1 (2, 1).Address (False, False) output1 output (1, 1).Address (False, False) output (2, 1).Value 2 (1 Amplificador amp amp) amplificador close1a amp (1-2 (1 amp. Amp)) saída do amplificador1 saída (2, 1).Valor 2 (amp 1 amp. Amp) amp close1a amp (1-2 (1 amp. Am)) amplificador Close0 Como o que você acabou de ler Digg it or Tipd it. O objetivo do Finance4Traders é ajudar os comerciantes a começar trazendo idéias e pesquisas imparciais. Desde o final de 2005, tenho vindo a desenvolver estratégias comerciais de forma pessoal. Nem todos esses modelos são adequados para mim, mas outros investidores ou comerciantes podem achar úteis. Afinal, as pessoas têm metas e hábitos de investimento diferentes. Assim, Finance4Traders torna-se uma plataforma conveniente para disseminar meu trabalho. (Leia mais sobre Finanças4Traders) Por favor, use este site de forma apropriada e atenciosa. Isso significa que você deve citar o Finance4Traders pelo menos fornecendo um link para este site se você usar qualquer um de nossos conteúdos. Além disso, você não tem permissão para usar nosso conteúdo de forma ilegal. Você também deve entender que nosso conteúdo é fornecido sem garantia e você deve verificar de forma independente o nosso conteúdo antes de confiar neles. Consulte a política de conteúdo do site e a política de privacidade ao visitar este site. 0 comentários: Publique um comentário Uma estratégia de negociação é muito semelhante a uma estratégia corporativa. Estudar criticamente seus recursos o ajudará a tomar decisões mais efetivas. (Leia mais) 8226 Compreendendo indicadores técnicos Os indicadores técnicos são mais do que apenas equações. Indicadores bem desenvolvidos, quando aplicados cientificamente, são realmente ferramentas para ajudar os comerciantes a extrair informações críticas de dados financeiros. (Leia) 8226 Por que eu prefiro usar o Excel Excel apresenta dados para você visualmente. Isso torna muito mais fácil para você entender seu trabalho e economizar tempo. (Leia)

No comments:

Post a Comment