Wednesday 11 October 2017

Moving Average Excel Vba Code


Esta publicação inclui links para dois exemplos de arquivos xls que mostram cálculos baseados em VBA e Fórmula para o indicador MACD ou Divergência de Convergência Médica Mover. Ambos os arquivos contêm o mesmo conjunto de dados Open High Low Close. A versão baseada em fórmulas é mais fácil de entender e serve como uma maneira de verificar se o código VBA que escrevi está correto. Ambos os métodos dão o mesmo resultado. O principal benefício do uso do VBA é que os parâmetros para MACD podem ser facilmente alterados das caixas de entrada. Além disso, o método VBA mostra apenas o resultado final em vez de ocupar cinco colunas. A versão baseada em VBA pode ser baixada aqui. A versão da fórmula pode ser baixada aqui. Abaixo está o código da versão baseada em VBA. Sub ETmacd () escrito por Exceltrader exceltrader. net Dim EMAslow As Double. EMAf As t como Double. Ws como planilha, LR como Integer Dim eMaF () como duplo. EMaS () como duplo. EMAdif (), emaPer () como duplo. MacDper como duplo. contam como Integer Dim DataRange Como Gama Dim ExPSlowWeight As Double Dim ExPFastWeight As Double Dim PerWeight As Double 160160The abaixo três linhas são o MACD settings.160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160160 Valores 160160The pode ser alterado aqui ou descomentar as linhas InputBox para ser solicitado. EMAslow 13 InputBox (Prompt: Digite Macd Configurações lentas., Título: MACD SLOW, Padrão: 13) EMAfAst 5 InputBox (Prompt: Digite Macd Fast settings., Título: MACD Fast, Default: 5) MacDper 6 InputBox (Prompt: Digite Macd Configurações do período., Título: Período MACD, Padrão: 6) ExPSlowWeight 2 (EMAslow 1) PerWeight 2 (MacDper 1) ExPFastWeight 2 (EMAfAst 1) Defina ws ThisWorkbook. Worksheets (VBA) ou use o nome exato da folha, por exemplo ThisWorkbook. worksheet ( Sheet1) lento 160160160160 Com ws 160160160160LR. Cells (Rows. coUnt, A).End (xlUp).Row 160160160160160160160160 Para cada DataRange In ws. Range (.Cells (2, A). Cells (LR, A)) 160160160160160160160160coUnt DataRange. linha 1 160160160160160160160160 preencher a matriz lento EMA 160160160160160160160160 ReDim Preserve EMAS (1 para contar) 160160160160160160160160160160160160160160160160 Se a contagem EMAslow 1 Então 160160160160160160160160160160160160160160160160160160160160 obter o primeiro valor que é a média móvel simples 160160160160160160160160160160160160160160160160 160160160160 Aplicação de eMaS (coUnt). Atividade (ws. Range (.Cells (2, E). As células (contagem, E))) 160160160160160160160160160160160160160160160160 ElseIf contagem EMAslow Então 160160160160160160160160160160160160160160160160160160160160eMaS (contagem) (.Cells (contagem, E) ExPSlowWeight) (EMAS (Contagem - 1) (1 - ExPSlowWeight)) 160160160160160160160160160160160160160160160160 End If 160160160160160160160160 Próxima DataRange rápido 160160160160160160160160 For Each DataRange Em ws. Range (.Cells (2, a). as células (LR, a)) 160160160160160160160160coUnt DataRange. Row 1 160160160160160160160160 preencher a matriz lento EMA 160160160160160160160160 ReDim Preserve EMAF (1 para contar) 160160160160160160160160160160160160160160160160 Se a contagem EMAfAst 1 Então 160160160160160160160160160160160160160160160160160160160160 obter o Primeiro valor que é a média de movimentação simples 160160160160160160160160160160160160160160160160160160160160 Aplicação de eMaF (coUnt). (Ws. Range (.Cells (2, E). Cells (coUnt, E))) 160160160160160160160160160160160160160160160160 ELSEIf coUnt EMAfAst Then 160160160160160160 160160160160160160160160160160160160160160eMaF (contagem) (.Cells (contagem, E) ExPFastWeight) (Emaf (contagem - 1) (1 - ExPFastWeight)) 160160160160160160160160160160160160160160160160 End If 160160160160160160160160 Próximo DataRange 160160160160160160160160 ReDim Preservar EMAdif (EM A partir Para LimiteSup (Emaf)) 160160160160160160160160160160160160 para a contagem EM Pouco 1 Para UBound (eMaF) 160160160160160160160160160160160160160160160160EMAdif (coUnt) eMaF (coUnt) - eMaS (coUnt) 160160160160160160160160160160160160 Próximo período coUnt MacD 160160160160160160160160 Dim x As Integer. Y Como Inteiro. Z As Integer. AVEE As Double 160160160160160160160160y EMAslow MacDper - 1 160160160160160160160160160160160160 Para xy Para UBound (EMAdif) - 2 160160160160160160160160160160160160160160160160 obter o SMA para o primeiro valor 160160160160160160160160160160160160160160160160 Se xy Então 160160160160160160160160160160160160160160160160160160160160160160160160 Para z EMAslow 1 Para EMAslow MacDper160160 (EMAslow MacDper - 1) 160160160160160160160160160160160160160160160160160160160160160160160160Ave Ave EMAdif (z) 160160160160160160160160160160160160160160160160160160160160160160160160 Próximo z 160160160160160160160160160160160160160160160160160160160160160160160160 ReDim emaPer (x Para LR) 160160160160160160160160160160160160160160160160160160160160160160160160emaPer (x) Ave MacDper 160160160160160160160160160160160160160160160160 ElseIf xy Então 160160160160160160160160160160160160160160160160emaPer (x) (EMAdif (x 1) PerWeight) (emaPer (x - 1) (1 - PerWeight)) 16016016016016016016016016016016016016016 0160160 End If 160160160160160160160160160160160160 Next x 160160x Vazio: y Vazio: z Vazio 160160x LBound (emaPer) 160160y UBound (emaPer) 160160 Para zx Para y - 1 160160.Cells (z 1, J) EMAdif (z 1) - emaPer (z) 160160 Next z End With End Sub escrito por Exceltrader exceltrader. net Kebaya Mwamba diz: itjockey, esta versão VBA mostrará o MACD, linha de sinal e histograma. A versão baseada em fórmula também mostra esses valores. O código alterado é a adição da 7ª e 8ª linha abaixo de 160160x Vazio: y Vazio: z Vazio 160160x LBound (emaPer) 160160y UBound (emaPer) 160160.Cells (x, L) MACD Histograma. Linha de sinal das células (x, K). Células (x, J) MACD 160160 Para zx Para y - 1 160160.Cells (z 1, L) EMAdif (z 1) - emaPer (z) 160160.Cells (z 1, K) emaPer (z) 160160.Cells (z 1, K) emaPer (z) 160160.Cells ( Z 1, J) EMAdif (z 1) 160160 Next z End With End Sub escrito por Exceltrader exceltrader. net Oi, eu tento mudar do EMAslow 13 InputBox (Prompt: Digite Macd Configurações lentas., Título: MACD SLOW, Padrão: 13 ) EMAfAst 5 InputBox (Prompt: Digite as configurações de Macd Fast., Título: MACD Fast, Padrão: 5) MacDper 6 InputBox (Prompt: Digite as configurações do período Macd., Título: Período MACD, Padrão: 6 para SlowMa InputBox (Prompt: Digite o Slow Moving MA.) FastMa InputBox (Prompt: Insira o Fast Moving MA.) MACDtime InputBox (Prompt: Enter total MACD Period.) Com 13. 5, 6 entrada, então a saída parece enorme diferente da anterior. É porque você está usando Novas variáveis ​​que você criou em vez das existentes. Você pode controlar as configurações de MACD inserindo suas configurações em caixas de entrada alterando o código como mostrado abaixo: EMAslow InputBox (Prompt: Digite Macd Configurações lentas., Título: MACD SLOW, Padrão: 13) EMAfAst InputBox (Prompt: Digite Macd Configurações rápidas., Título: MACD Rápido, Padrão: 5) MacDper InputBox (Prompt: Digite as configurações do período Macd., Título: MACD Período, Padrão: 6) Eu continuo vendo Exemplos em que os dados são estáticos. E quanto a onde os dados continuam mudando a cada 5 min, por exemplo, e é apenas uma célula que continua mudando. Você ainda deve copiar o valor dessa célula para diferentes células para que você possa fazer os cálculos para determinar os valores do macd. Eu quero fazer tudo em vba. Não quero copiar valores para outras células em uma planilha. Isto é possível, eu gostaria de saber se algum erro nos seguintes códigos ou não. Você tem alguma sugestão Obrigado antecipadamente por qualquer sugestão Erro. EmaPer (x) (EMAdif (x 1) PerWeight) (emaPer (x - 1) (1 - PerWeight)) Correto. EmaPer (x) (EMAdif (x 1) PerWeight) (emaPer (x) (1 - PerWeight)) se eu tentar usar seu macd vba e mudar (.Cells (count, E), por exemplo, em (.Cells (count, M) está vazia e será preenchida pelo início do programa VBA está dando um erro sem parar, onde eu digo errado, isso pode ser resolvido de alguma forma Fórmula de teste no Excel (Algo que eu não conheci até ontem) Publicado em 28 de janeiro de 2010 às 00:28 UTC por As fórmulas da tabela Ajay foram algo que eu descobri recentemente. Na verdade, nosso leitor mb comentou que ele prefere converter um intervalo em uma mesa e, em seguida, empregar fórmulas de mesa ao invés de intervalos nomeados. Isso me deixou curioso o suficiente para explorá-los ainda mais e aqui o que eu aprendi. Uma tabela no Excel Uma tabela é uma característica no Excel que torna mais fácil formatar e analisar um conjunto de pontos de dados em uma planilha. As tabelas foram introduzidas no Excel 2007 como uma extensão do recurso 8216Lists8217 nas versões anteriores. No Excel 2007 em diante , Você também pode usar as fórmulas da tabela para extrair dados de uma tabela . Como criar uma tabela No Excel 2007 e posterior, tudo o que você precisa fazer para converter um determinado intervalo em uma tabela é simplesmente selecionar o intervalo e, em seguida, clicar no botão 8216Table8217 na aba 8216Insert8217 na faixa de opções. Melhor ainda, como nosso leitor Sam apontou, use a tecla de atalho CTRL T. Então, o que é bom é a tabela para formatação: altere completamente a aparência e a sensação dos seus dados com alguns cliques do mouse. Resuma, adicionando linha para Total: basta ligar a caixa de seleção para 8216Total Row8217 e você tem uma nova linha inserida logo abaixo dos dados Conjunto com os totais. Não só totais, você pode selecionar qualquer célula nesta linha e escolher entre uma série de opções de agregação, como contagem, min, max, etc. Exporte e compartilhe: Exporte e compartilhe a tabela com outros usuários usando o SharePoint Forneça um nome para a tabela: Você pode dar à mesa um nome específico (diga 8216SalesData8217) e use-o mais tarde em suas fórmulas. Para dar um novo nome à tabela, abra o 8216Name Manager8217 na guia 8216Formulas8217 e, em seguida, edite o nome da tabela. Fórmulas de tabela no Excel 8220Flaming Bisons. Você me fez ler tudo isso apenas para mostrar o que uma tabela do Excel parece 8230. Eu já sei o que é, então por que don8217t você vem direto ao ponto 8221 Oh, isso foi grosseiro. Nunca ninguém lhe disse que a paciência é uma virtude real. As fórmulas de tabela permitem acessar a tabela de maneira fácil e intuitiva. Let8217s começam por converter um intervalo em uma tabela. Quando você cria uma nova tabela, o Excel fornecerá um nome padrão, diga algo como 8216Table18217. Isso pode não ser mais intuitivo dos nomes e você pode renomeá-lo para outra coisa que é mais fácil de lembrar e compreender para os outros. Abra a aba 8216Design8217 e substitua o texto na caixa 8216Table Name8217 por algo como 8216sales8217. Abre uma nova caixa de chocolates. Agora, você pode consultar e usar toda a tabela, colunas individuais, linhas, intervalo de dados, cabeçalhos ou totais nas suas fórmulas. Usando uma coluna específica da tabela em uma fórmula Diga que você queria saber a média de todos os itens na coluna 8216Revenue8217. Digite algo como AVERAGE (salesRevenue) em uma célula e sorria. A fórmula é tão intuitiva que dificilmente precisa ser explicada. No entanto, eu sou, deixe-me ser eu. A seqüência 8216salesRevenue8217 refere os pontos de dados na coluna 8216Revenue8217 da tabela de vendas. 8216salesTarget8217 teria se referido à coluna 8216Target8217 da mesma tabela. Agora podemos usar isso como qualquer outro intervalo em qualquer fórmula de excel. Então MAX (salesRevenue), LARGE (salesRevenue, 5) e COUNT (salesRevenue) são todas as fórmulas válidas. Usando uma linha específica da tabela em uma fórmula What8217s bom para uma coluna é bom para a linha. Formato, no entanto, diferente. Para se referir a uma linha em uma tabela, usamos o símbolo. Então, se você quiser se referir à 10ª linha da tabela, escreva vendas em qualquer célula na 10ª fila. Então, algo como countif (vendas, 8221ltgt8221) lhe daria contagem de células não vazias na linha particular da tabela. Se você copiar a mesma fórmula para a célula imediatamente abaixo, os valores correspondentes da próxima linha serão retornados 8211 mesmo que a fórmula hasn8217t tenha mudado. Usando a tabela completa em uma fórmula What8217s bom para uma coluna e uma linha deve ser bom para a tabela Para se referir a toda a tabela, use. SalesAll Para referir apenas a parte de dados da tabela, use. SalesData Para se referir aos cabeçalhos, use. SalesHeaders Usando a fórmula SUBTOTAL com a tabela Outra característica interessante da tabela é o uso da função SUBTOTAL. A fórmula SUBTOTAL tem duas partes 8211, a primeira indica a fórmula a ser usada para agregação e a segunda contém o intervalo a ser usado. Portanto, SUBTOTAL (9, A1: A10) daria a soma do intervalo de A1: A10, enquanto SUBTOTAL (1, A1: A10) forneceria a média para o mesmo intervalo. Ao voltar a tabela do Excel, você pode agregar sobre a tabela inteira (ou uma parte dela) os valores usando a fórmula SUBTOTAL e fornecendo-a com uma referência a uma linha, coluna ou a tabela inteira. Assim como no exemplo acima, você pode obter a média da coluna 8216Revenue8217 usando SUBTOTAL (1, salesRevenue). Se você notou, quando ativamos a opção 8216Total Row8217, uma nova linha com o total para colunas foi adicionada à tabela. Agora podemos seguir em frente e modificar as fórmulas usando qualquer uma das opções de fórmula mostradas acima. Portanto, os totais não se limitam a apenas somar, mas pode muito bem ser estendido para médias, min, max, variância, etc. Usando os totais para uma coluna particular em uma fórmula Para se referir ao total de uma coluna na tabela, diga Receita , Podemos agora escrever algo semelhante ao salesTotals, Revenue. Observe que o valor 8216total8217 retornado pode não ser o total (SUM), mas é determinado pelo parâmetro da função SUBTOTAL usado para agregar a coluna. Let8217s ilustram isso com um exemplo. Se a fórmula SUBTOTAL na 8216Total Row8217 para a coluna 8216Revenue8217 continha um parâmetro de função de agregação com um valor de 4, o total teria retornado o valor máximo da coluna. Agora, quando alguém quer se referir a este total usando salesTotals, Revenue, o 8220total8221 retornado não seria uma soma de valores de coluna, mas o máximo. Tenho a sensação de que mais isso pode ser feito com fórmulas de mesa. Você tentou usá-los Cuidado para compartilhar 29 Comentários O Subtotal Fuction também aceita 101,1028230109..111 como parâmetros. Isso funciona com linhas filtradas e as linhas ocultas. Os nomes das tabelas são dynamic8230 mas não verdadeiramente. Mantenha algumas linhas em branco e adicione alguns dados. Exclua as linhas em branco e a tabela não expande sam 8211 Touch. Na verdade, 101 corresponde a 1, 102 a 2, e assim por diante. Enquanto o primeiro ignorará os valores ocultos, o mais tarde os incluirá ao calcular o subtotal. Cópia útil de um recurso subutilizado. Observe que você pode substituir as fórmulas de totais com qualquer coisa que você gosta, você não está preso com apenas SUBTOTAL. Coisas como COUNTIFS e SUMIFS podem ser especialmente úteis. Você ainda pode se referir a eles usando a sintaxe usual TableNameTotals, ColumnName e sua fórmula total personalizada sobrevive a total linha sendo desativada e reiniciada. PCBabe 8211 na fita TableDesign, use o 8220convert para o intervalo8221, ou simplesmente clique com o botão direito do mouse na tabela gt gt converte para o intervalo Eu me apaixonei (um exagero) com o referenciamento da fórmula da tabela, então rapidamente teve que se divorciar por causa da incapacidade de fazer absoluto Referência celular, linha ou coluna (ou seja, o equivalente a a1). Como isso nunca foi considerado um caso de uso, eu não sei, mas isso tornou muito irritante para usar, então eu tive que desativar esse estilo de referência. Como posso uma fórmula de tabela absoluta. Quando eu arrasto uma fórmula de tabela em outra coluna, a fórmula é alterada. Nome da tabela: tblSales vendas-estoque 2-30 2-33 a fórmula é. Soma (tblsalessales) após a cópia ou arraste esta fórmula horizontalmente, muda para: sum (tblSalesStock) tentei usar esta função de tabela em formato condicional. O problema é que às vezes ele aceita, mas não produz nenhum resultado. Outras vezes dá um erro. A ausência de documentação adequada significa que não temos meios para se recuar ou se referir. A referida fórmula foi: IF (E (Tabela1 Esta Linha, Qtd Disponível DisponívelTesta1Esta Linha, Nível de Reembolso, Tabela1 Esta Linha, Qtd. No Pedido0), VERDADEIRO, FALSO) Quando eu referi este problema nos fóruns da Microsoft, um dos MVPs me pediu para remover o IF Cláusula: quot Assumindo que a sintaxe da sua tabela está correta (eu nunca uso esse referenciamento estruturado), livrar-se da função IF: AND (Tabela 1 Esta linha, Qty AvailableltTable1 Esta linha, Reordenar Nível, Tabela1 Esta linha, Qtd On Order0) Se isso não funciona, então I039d use referências de células A1 normais. Eu simplesmente não consigo entender por que as pessoas usariam o anterior em comparação com: 8221 Se um recurso é introduzido, por que não elaborar Você tem alguma idéia que tentei usar o recurso de fórmula 8220Evaluar o recurso8221, mas mesmo isso mostra erro em cada etapa. Eu acho que todos se beneficiarão se pudermos levar a discussão à frente. De qualquer forma, obrigado pelas entradas. Publicação de blog incrível Ajay. Não tinha idéia de que isso poderia ser feito no Excel 2007. Suponho que agora que eu sei disso, é hora de evoluir após o antigo método de seleção de faixas de células ao criar fórmulas. Isso faz muito mais sence e abre novas portas. Obrigado por fornecer

No comments:

Post a Comment