Monday, 15 January 2018

Moving average code vba


Eu quero calcular uma média móvel dos últimos, 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 três últimos seria (155167201) 3. Ive tentou 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 qualquer dicas ou soluções pediu Mar 12 11 at 15:36 Digite isso com controlshiftenter para torná-lo uma fórmula de matriz. Isto irá encontrar os últimos três valores. Se você quiser mais ou menos, altere as duas instâncias de 3 na fórmula para o que você quiser. Esta parte retorna o 4o número de linha mais alto de todas as células que têm um valor, ou 5 no seu exemplo porque as linhas 6, 8 e 9 são a 1ª a 3ª linhas mais altas com um valor. Esta parte retorna 9 TRUEs ou FALSEs com base em se o número da linha é maior que o 4o maior. Isso multiplica os valores em A1: A9 pelos 9 TRUEs ou FALSEs. TRUEs são convertidos para 1 e FALSEs para zero. Isso deixa uma função SUM como este Como todos os valores acima de 155 não satisfazem o critério de número de linha, o get é multiplicado por zero. Eu escrevi um pequeno script na VBA. Hopefull faz o que você quer. Aqui você está: 1) Eu tenho limite para 360 células. Isso significa que o script não procurará mais de 360 ​​células. Se quiser alterá-lo, altere o valor inicial do contador. 2) O script não retorna a média arredondada. Altere a última linha para MovingAverage Round (CDbl (tmp i), 2) 3) O uso é exatamente como você queria, então basta digitar MovingAverage (a13) na célula. Todos os comentários são bem-vindos. Tabela Média de Rolar Abaixo vamos olhar para um programa no VBA do Excel que cria uma tabela média móvel. Coloque um botão de comando na folha de cálculo e adicione a seguinte linha de código: Range (quotB3quot).Value WorksheetFunction. RandBetween (0, 100) Esta linha de código introduz um número aleatório entre 0 e 100 na célula B3. Queremos que o Excel VBA adote o novo valor de estoque e o coloque na primeira posição da tabela de média móvel. Todos os outros valores devem mover para baixo um lugar eo último valor deve ser excluído. Criar um evento de alteração de planilha. Código adicionado ao evento de alteração de planilha será executado pelo Excel VBA quando alterar uma célula de uma folha de cálculo. 2. Faça duplo clique em Folha1 (Folha1) no Project Explorer. 3. Escolha Planilha na lista suspensa à esquerda. Escolha Alterar na lista suspensa direita. Adicione as seguintes linhas de código ao evento de alteração de planilha: 4. Declare uma variável chamada newvalue do tipo Integer e dois intervalos (firstfourvalues ​​e lastfourvalues). Dim newvalue As Integer. Firstfourvalues ​​As Range, lastfourvalues ​​As Range 5. O Evento de Mudança de Planilha escuta todas as alterações na Planilha1. Só queremos que o Excel VBA faça algo se algo mudar na célula B3. Para isso, adicione a seguinte linha de código: If Target. Address quotB3quot Then 6. Inicializamos newvalue com o valor da célula B3, firstfourvalues ​​com Range (quotD3: D6quot) e lastfourvalues ​​com Range (quotD4: D7quot). Newvalue Range (quotB3quot).Value Set firstfourvalues ​​Intervalo (quotD3: D6quot) Definir lastfourvalues ​​Intervalo (quotD4: D7quot) 7. Agora vem o simples truque. Queremos atualizar a tabela de média móvel. Você pode conseguir isso substituindo os quatro últimos valores pelos primeiros quatro valores da tabela e colocando o novo valor de estoque na primeira posição. Lastfourvalues. Value firstfourvalues. Value Range (quotD3quot).Value newvalue 8. Não se esqueça de fechar a instrução if. 9. Finalmente, digite a fórmula AVERAGE (D3: D7) na célula D8. 10. Teste o programa clicando no botão de comando. Aqui está um código que deve ser útil para aqueles que usam análise técnica na negociação e quer testar estratégias no Excel. Calcula a média móvel simples, linearmente ponderada e exponencial. Além disso, apresentarei e explicarei as etapas para criar o formulário e o código VBA. Inserir um UserForm 8211 Nome: MAForm Adicionar quatro etiquetas dos controles de caixa de ferramentas 8211 Legendas conforme a tela de impressão acima Adicione um ComboBox para a seleção de tipo de média móvel. Foi nomeado comboTypeMA Adicionar dois controles RefEdit para o intervalo de entrada eo intervalo de saída. Adicionar uma caixa de texto para selecionar o período de média móvel Adicionar dois botões: Nome: buttonSubmit, Legenda: Enviar e Nome: buttonCancel, Legenda: Cancelar Para gerar a lista drop-down 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 ComboBox com ser preenchido por tipos de médias móveis e o formulário de usuário será carregado. Option Explicit Sub loadMAForm () Com MAFormboTypeMA. RowSource. AddItem Simple. 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 eo outputRange será preenchido com os valores das médias móveis. Dim inputPeriod As Integer O período de média móvel é declarado. Dim inputAddress, outputAddress As String Os intervalos de entrada e saída declarados como string. Se comboTypeMA. Value ltgt Exponential E comboTypeMA. Value ltgt Simples e comboTypeMA. Value ltgt Weighted True Then MsgBox Selecione um tipo de média 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 avançará para a próxima etapa e o usuário será solicitado a selecioná-la novamente. ElseIf RefInputRange. Value Then MsgBox Selecione o intervalo de entrada. RefInputRange. SetFocus Sair Sub ElseIf RefOutputRange. Value Then MsgBox Selecione o intervalo de saída. RefOutputRange. SetFocus Exit Sub ElseIf RefInputPeriod. Value Then MsgBox Selecione o período da média móvel. RefInputPeriod. SetFocus Exit Sub ElseIf Not IsNumeric (RefInputPeriod. Value) Em seguida, MsgBox Moving average period deve ser um número. RefInputPeriod. SetFocus Exit Sub End Se outras restrições forem criadas. A faixa de entrada, a faixa de saída eo período de entrada não devem ficar em branco. Além disso, o período de média móvel deve ser um número. InputAddress RefInputRange. Value Definir inputRange Range (inputAddress) outputAddress RefOutputRange. Value Definir outputRange Range (outputAddress) inputPeriod RefInputPeriod. Value Os argumentos para os intervalos inputRange e outputRange serão inputAddress e outputAddress declarados como strings. Se inputRange. Columns. Count ltgt 1 Em seguida, MsgBox intervalo de entrada pode ter apenas uma coluna. RefInputRange. SetFocus Exit Sub O inputRange deve conter apenas uma coluna. ElseIf inputRange. Rows. Count ltgt outputRange. Rows. Count Then MsgBox O intervalo de saída tem um número diferente de linhas do que o intervalo de entrada. RefInputRange. SetFocus Exit Sub End If O inputRange eo outputRange devem ter um número igual de linhas. Dim RowCount As Inteiro RowCount inputRange. Rows. Count Dim cRow As Inteiro ReDim inputarray (1 Para RowCount) Para cRow 1 Para RowCount inputarray (cRow) inputRange. Cells (cRow, 1).Value Próximo cRow inputarray é declarado como array e it8217s elementos Correspondem aos valores de cada linha do intervalo de entrada. Se inputPeriod gt RowCount Then MsgBox Número de observações selecionadas é amplificador amp RowCount e o período é amplificador amp ampPeriod. O intervalo de entrada deve ter uma quantidade maior ou igual de elementos do que o período selecionado. RefInputRange. SetFocus Exit Sub End Se 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 Then MsgBox Moving período médio deve ser superior a 0. RefInputPeriod. SetFocus Exit Sub End If O período de média móvel deve ser maior que zero. ReDim outputarray (inputPeriod To RowCount) As Variant Também as dimensões de array de outputarray são determinadas. 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 calculou a média móvel simples, se a seleção para comboTypeMA é simples. SMA ----------------------------------------- Se comboTypeMA. Value Simples Então Dim i , J As Integer Dim temp As Double Para i inputPeriod Para RowCount temp 0 Para j (i - (inputPeriod - 1)) Para i temp temp inputarray (j) Próxima j outputarray (i) temp inputPeriod outputRange. Cells (i, 1).Value outputarray (i) Next i outputRange. Cells (0, 1).Valor SMA (amp inputPeriod amp) Basicamente, o procedimento calcula a média móvel dos últimos x números (x é igual ao inputPeriod), começando com o elemento de O inputarray igual ao inputPeriod. Abaixo está um exemplo simplificado, que mostra cada passo do procedimento. Neste exemplo, há quatro números (no01, no02, no03 e no04) da linha 1 à linha 4 e o período da média móvel é 3. Depois de cada nova média móvel ser calculada, cada célula da saídaRange tomará o valor da Outputarray. E depois de todas as médias móveis são computadas, na célula acima outputRange um título será inserido contendo o tipo de média móvel e período. Esta próxima parte calculará a média móvel exponencial. EMA ------------------------------------------ ElseIf comboTypeMA. Value Exponential Then Dim Alfa As Alfa 2 duplo (inputPeriod 1) Para j 1 Para inputPeriod temp temp inputarray (j) Próxima j outputarray (inputPeriod) temp inputPeriod Primeiro o valor de alfa é determinado. Porque na computação, o valor da EMA é baseado na 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 calculados com base na fórmula acima: Anterior EMA mais alfa multiplicado pela diferença entre o número atual do inputarray eo valor EMA anterior. Para i inputPeriod Para RowCount outputRange. Cells (i, 1).Value outputarray (i) Next 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 outputarray irá representar o tipo e 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 entradaPeriod) temp2 temp2 (j - i inputPeriod) ) Temp temp2 outputRange. Cells (i, 1).Value outputarray (i) Próxima 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 WMA. Assim como no exemplo anterior, neste aqui há para números na entradaRange. Eo período de entrada é 3. Abaixo está o código final do procedimento, que descarrega o formulário do usuário. Unload MAForm End Sub O procedimento abaixo é para o botão Cancelar. Ele será adicionado no mesmo módulo. Private Sub buttonCancelClick () Unload MAForm End Sub, onde 2 (1 n) O subscrito t é usado para denotar 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 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 se torna. Isto resulta num maior (1-) e mais EMA t-1 é retido em EMA t. O primeiro valor de EMA em uma série de tempo pode ser assumido como sendo uma média móvel simples de n dias de preços. Alguns usuários também podem preferir iniciar o primeiro valor da EMA a partir do segundo período em diante, onde EMA no Período 2 x 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 em série infinita onde os preços anteriores têm um peso cada vez menor sobre EMA t. Considere o seguinte: Isso resulta em EMA sendo mais responsivo e menos volátil do que a sua média móvel simples equivalente. Uma discussão mais detalhada sobre isso pode ser encontrada no meu artigo sobre filtros em finanças e análise técnica. Método A usa funções, enquanto método B usa sub procedimentos para calcular CMF. O método B é mais rápido e mais flexível. Cole esse código em sua janela de código 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 inclui estes na lista de funções, adicione descrições para eles e criar uma nova categoria chamada Technical Indicators. 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 último período de preço se o período atual for o primeiro. Amp Chr (10) amp Chr (10) amp Seguido pelo preço atual e n. O fator de decaimento da média móvel exponencial é calculado como alfa2 (n1), Função Pública EMA (EMAYeste dia, preço, n) EMA preço alfa (1 - alfa) EMAYesterday Uma vez que você é feito com o acima, você pode computar a média movente exponencial datilografando em toda a EMA da pilha (último período EMA, preço atual, n). Insira o preço do último período como EMA do último período se você estiver computando o primeiro EMA de seu conjunto de dados. Para executar o método B, você tem que copiar o sub Runthis da página na linha AccumulationDistribution em seu módulo. Você também deve executar EMA a partir do sub Runthis. Adicione a seguinte linha ao sub Runthis Coloque-o antes de End Sub e desative todas as outras macros que Runthis chamará Este sub irá começar a calcular EMA de t2 em diante Sub EMA (close1 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) Amp 1 amp 1 amp 1 amp 1 (amp 1 amp 1) amp 1 saída (2, 1).Value 2 (1 amp amp) amp close1a amp (1-2 amp 1 amp)) amp Close0 Como o que você acabou de ler Digg ou Tipd it. O objetivo de Finance4Traders é ajudar os comerciantes a começar trazendo-lhes pesquisa e idéias imparciais. Desde o final de 2005, tenho vindo a desenvolver estratégias de negociação numa base pessoal. Nem todos esses modelos são adequados para mim, mas outros investidores ou comerciantes podem encontrá-los úteis. Afinal, as pessoas têm diferentes investmenttrading metas e hábitos. Assim, Finance4Traders torna-se uma plataforma conveniente para divulgar o meu trabalho. (Leia mais sobre Finance4Traders) Por favor, use este site de forma apropriada e atenciosa. Isso significa que você deve citar Finance4Traders, pelo menos, fornecer um link para este site, se acontecer de você usar qualquer um dos nossos conteúdos. Além disso, você não tem permissão para fazer uso de nosso conteúdo de forma ilegal. Você também deve entender que nosso conteúdo é fornecido sem garantia e você deve verificar independentemente o nosso conteúdo antes de confiar neles. Consulte a política de conteúdo e a política de privacidade do site ao visitar este site. Uma estratégia de negociação é muito semelhante a uma estratégia corporativa. Estudar criticamente seus recursos o ajudará a tomar decisões mais eficazes. (Leia mais) 8226 Entender os 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 mais) 8226 Por que eu prefiro usar 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