Monday 11 December 2017

Excel vba moving average code


Rolling Average Table Poniżej przyjrzymy się programowi w programie Excel VBA, który tworzy średnią tabelę kroczącą. Umieść przycisk polecenia w arkuszu i dodaj następującą linię kodu: Range (quotB3quot).Value WorksheetFunction. RandBetween (0, 100) Ta linia kodu wprowadza liczbę losową między 0 a 100 do komórki B3. Chcemy, aby program Excel VBA podjął nową wartość zapasów i umieścić ją na pierwszej pozycji tabeli średniej kroczącej. Wszystkie pozostałe wartości powinny być przemieszczane w dół w jednym miejscu, a ostatnia wartość powinna zostać usunięta. Utwórz zdarzenie zmiany kompozycji. Kod dodany do zdarzenia zmiany planu zostanie wykonany przez program Excel VBA po zmianie komórki w arkuszu. 2. Kliknij dwukrotnie na Sheet1 (Sheet1) w Eksploratorze projektu. 3. Wybierz Arkusz roboczy z lewej listy rozwijanej. Z rozwijanej listy prawym przyciskiem wybierz polecenie Zmień. Dodaj następujące wiersze kodu do zdarzenia zmiany zdarzenia: 4. Zanotuj zmienną o nazwie newvalue typu Integer i dwa zakresy (wartości pierwszego i ostatniego okresu). Dim newvalue As Integer. firstfourvalues ​​As Range, lastfourvalues ​​As Range 5. Zdarzenie Change Schedule śledzi wszystkie zmiany w Sheet1. Chcemy, aby program Excel VBA coś zrobił, jeśli coś się zmieni w komórce B3. Aby to osiągnąć, dodaj następującą linię kodu: Jeśli Target. Address quotB3quot Następnie 6. Inicjalizujemy newvalue z wartością komórki B3, wartością pierwszego wiersza z zakresem (quotD3: D6quot) i wartościami lastfour z zakresem (quotD4: D7quot). newvalue Zakres (quotB3quot).Value Ustaw wartość firstfourvalues ​​Zakres (quotD3: D6quot) Ustaw wartość lastfourvalues ​​(D4: D7quot) 7. Teraz jest prosty trick. Chcemy zaktualizować tabelę średniej kroczącej. Można to osiągnąć, zastępując ostatnie cztery wartości czterema pierwszymi wartościami tabeli i wprowadzając nową wartość zapasów w pierwszej pozycji. lastfourvalues. Value firstfourvalues. Value Range (quotD3quot).Wartość newvalue 8. Nie zapomnij zamknąć instrukcji if. 9. Na koniec wprowadź wzór AVERAGE (D3: D7) do komórki D8. 10. Sprawdź program klikając przycisk polecenia. Chcę obliczyć średnią ruchomej ostatniej, powiedzmy 20, liczby kolumny. Problem polega na tym, że niektóre komórki kolumny mogą być puste, powinny być ignorowane. Przykład: średnia ruchoma z ostatnich trzech stanowisk będzie (155167201) 3. Ive próbował wdrożyć to przy użyciu średniej, offset, indeksu, ale po prostu nie wiem jak. Im trochę znajomy makr, więc takie rozwiązanie działałoby poprawnie: MovingAverage (A13) Dzięki za wszelkie porady lub rozwiązania zapytał Marzec 12 11 w 15:36 Wprowadź to za pomocą controlshiftenter, aby utworzyć formułę tablicową. Znajdą tam Państwo trzy ostatnie wartości. Jeśli chcesz mniej lub bardziej, zmień dwie instancje 3 we wzorze na cokolwiek chcesz. Ta część zwraca czwartą najwyższą liczbę wierszy wszystkich komórek, które mają wartość lub 5 w tym przykładzie, ponieważ wiersze 6, 8 i 9 są najwyższymi rzędami od 1 do 3 najwyższych. Ta część zwraca 9 TRUE lub FALSE w oparciu o to, czy liczba wierszy jest większa niż czwarta co do wielkości. Powoduje to pomnożenie wartości w A1: A9 przez te 9 TRUE lub FALSE. TRUE są konwertowane na 1 i FALSE na zero. Pozostawia to funkcję SUMA w ten sposób Ponieważ wszystkie wartości powyżej 155 nie spełniają kryterium numeru wiersza, to mnożone przez zero. Napisałem krótki skrypt w programie VBA. Hopefull robi to, co chcesz. Oto: 1) ustawiłem limity na 360 komórek. Oznacza to, że skrypt nie będzie szukał więcej niż 360 komórek. Jeśli chcesz to zmienić, zmień wartość początkową licznika. 2) Skrypt zwraca nie zaokrągloną średnią. Zmień ostatni wiersz na MovingAverage Round (CDbl (tmp i), 2) 3) Użycie jest takie, jak chcesz, więc wpisz MovingAverage (a13) do komórki. Wszelkie komentarze są mile widziane. Średnia Średnia wartość tego przykładu objaśnia sposób obliczania średniej ruchomej serii czasowej w programie Excel. Średnia ruchoma służy do wyrównywania nieprawidłowości (szczytów i dolin) w celu łatwego rozpoznania trendów. 1. Po pierwsze, spójrz na naszą serię czasową. 2. Na karcie Dane kliknij pozycję Analiza danych. Uwaga: nie można znaleźć przycisku analizy danych Kliknij tutaj, aby załadować dodatek Analysis ToolPak. 3. Wybierz opcję Moving Average i kliknij przycisk OK. 4. Kliknąć w polu Zakres wejściowy i wybrać zakres B2: M2. 5. Kliknij w polu Interwał i wpisz 6. 6. Kliknij w polu Zakres wyjściowy i wybierz komórkę B3. 8. Wykres wykresu tych wartości. Objaśnienie: ponieważ ustawiamy przedział na 6, średnia ruchoma jest średnią z poprzednich 5 punktów danych i bieżącego punktu danych. W rezultacie szczyty i doliny są wygładzone. Wykres pokazuje tendencję wzrostową. Excel nie może obliczyć średniej ruchomej dla pierwszych 5 punktów danych, ponieważ nie ma wystarczająco dużo poprzednich punktów danych. 9. Powtórz kroki od 2 do 8 dla przedziału 2 i przedziału 4. Podsumowanie: Im większy odstęp, tym więcej szczytów i dolin są wygładzone. Im mniejsze odstępy, tym dokładniejsze są średnie ruchome, do rzeczywistych punktów danych. Oto kod, który powinien być przydatny dla tych, którzy używają analizy technicznej w handlu i chcą testować strategie w programie Excel. Oblicza prostą, liniową ważoną i wykładniczą średnią ruchliwą. Dalej przedstawię i wyjaśnię kroki tworzenia formularza i kodu VBA. Wstawianie UserForm 8211 Nazwa: MAForm Dodawanie czterech etykiet z elementów sterowania przybornikami Toolbox 8211 Załączniki do powyższego ekranu drukowania Dodaj ComboBox do wybierania typu średniej ruchomej. Naziemnie jest comboTypeMA Dodaj dwie kontrolki RefEdit dla zakresu wejściowego i zakresu wyjściowego. Dodawanie pola tekstowego do wybierania średniej ruchomej Dodać dwa przyciski: Nazwa: przyciskSubmit, Caption: Submit and Name: przyciskCancel, Caption: Cancel Aby wygenerować listę rozwijaną dla wyboru typu MA i załadować formularz użytkownika, nowy moduł zostanie wstawiony z poniższym kodem. Elementy ComboBox będą wypełniane przez przechodzenie średnich typów i formularz użytkownika zostaną załadowane. Opcja Explicit Sub loadMAForm () Z MAFormboTypeMA. RowSource. AddItem Prosty element. AddItem ważony. AddItem End Exponential End With MAForm. Show End Sub Poniżej znajduje się kod przypisany do przycisku Submit. Private Sub buttonSubmitClick () Dim inputRange, outputRange As Range WejścieRange będzie zawierało serie cen stosowane do obliczania MAs i outputRange zostanie wypełnione wartościami średniej ruchomej. Dim inputPeriod As Integer Określa się średni okres ruchomy. Dim inputAddress, outputAddress As String Zakresy wejścia i wyjścia zadeklarowane jako ciąg znaków. Jeśli parametr comboTypeMA. Value ltgt Exponential And comboTypeMA. Value ltgt Prosty i comboTypeMA. Value ltgt Ważony Prawda Następnie MsgBox Proszę wybrać typ średniej ruchomej z listy. RefInputRange. SetFocus Exit Sub Ta część procedury wymusza pierwsze ograniczenia dotyczące dostarczonych danych. Jeśli w rozwijanej liście nie znajduje się typ przeciętnego ruchu, procedura nie zostanie podjęta w następnym kroku, a użytkownik zostanie poproszony o jego wybranie. ElseIf RefInputRange. Value Then MsgBox Proszę wybrać zakres wejściowy. RefInputRange. SetFocus Exit Sub ElseIf RefOutputRange. Value Następnie MsgBox Proszę wybrać zakres wyjściowy. RefOutputRange. SetFocus Exit Sub ElseIf RefInputPeriod. Value Następnie MsgBox Proszę wybrać średni okres przejściowy. RefInputPeriod. SetFocus Exit Sub ElseIf Nie IsNumeric (RefInputPeriod. Value) Następnie MsgBox Przekroczony średni okres musi być liczbą. RefInputPeriod. SetFocus Exit Sub End Jeśli tworzone są inne ograniczenia. Zakres wejściowy, zakres wyjściowy i okres wprowadzania nie mogą być puste. Również średni okres przejściowy musi być liczbą. inputAddress RefInputRange. Value Ustaw wartość inputRange Range (inputAddress) outputAddress RefOutputRange. Value Ustaw wartość outputRange Range (outputAddress) inputPeriod RefInputPeriod. Value Argumenty dla zakresów inputRange i outputRange to inputAddress i outputAddress zadeklarowane jako ciągi znaków. Jeśli inputRange. Columns. Count ltgt 1 Następnie MsgBox Zakres wprowadzania może mieć tylko jedną kolumnę. RefInputRange. SetFocus Exit Sub InputRange musi zawierać tylko jedną kolumnę. ElseIf inputRange. Rows. Count ltgt outputRange. Rows. Count Następnie zakres wyjściowy MsgBox ma inną liczbę wierszy niż zakres wejściowy. RefInputRange. SetFocus Exit Sub End Jeśli parametr inputRange i outputRange musi mieć taką samą liczbę wierszy. Dim RowCount jako Integer RowCount inputRange. Rows. Count Dim cRow As Integer ReDim inputarray (1 na RowCount) Dla cRow 1 Do InputRray RowCount (cRow) inputRange. Cells (cRow, 1).Value Następna cRow inputarray jest zadeklarowana jako elementy array i it8217s odpowiadają wartościom z każdego rzędu zakresu wejściowego. Jeśli inputPeriod gt RowCount Then MsgBox Liczba wybranych obserwacji to amp wzmacniacza RowCount, a okresem jest wzmacniacz wejściowy wzmacniacza. Zakres wejściowy musi mieć większą lub równą liczbę elementów niż wybrany okres. RefInputRange. SetFocus Exit Sub End Jeśli jest dodawane inne ograniczenie 8211 Zakres danych wejściowych musi mieć większą lub równą liczbę elementów niż okres. Jeśli wartość parametru InputPeriod lt 0 Then MsgBox Okres przeciętny musi być większy niż 0. RefInputPeriod. SetFocus Exit Sub End If Średni okres przejściowy musi być większy od zera. ReDim outputarray (inputPeriod To RowCount) Jako wariant Określone są również wymiary tablicowe. Dolna granica tablicy to wartość inputPeriod, a górna granica to wartość RowCount (liczba elementów w inputRange). Poniżej procedury obliczona jest prosta średnia ruchoma, jeśli wybór dla comboTypeMA jest prosty. SMA ----------------------------------------- Jeśli komendaTypeMA. Value Simple Then Dim i , j Jako Integer Dim temp As Double Dla i inputPeriod To RowCount temp 0 Dla j (i - (inputPeriod - 1)) Do i temp temp inputarray (j) Następna j outputarray (i) wejście tempPeriod outputRange. Cells (i, 1).Value outputarray (i) Następny i outputRange. Cells (0, 1).Value SMA (amp wzmacniacza wejściowego) Zasadniczo procedura oblicza średnią ruchu ostatnich liczb x (x równa się wejściowemu okresowi), zaczynając od elementu inputarray równy InputPeriod. Poniżej jest uproszczony przykład, który pokazuje każdy krok procedury. W tym przykładzie istnieją cztery liczby (nr01, nr02, nr03 i nr04) z wiersza 1 do wiersza 4, a średni okres ruchomy wynosi 3. Po obliczeniu każdej nowej średniej ruchomej każda komórka parametru outputRange przyjmuje wartość z outputarray. I po przeanalizowaniu wszystkich średnich ruchów w komórce powyżej typu outputRange zostanie wstawiony tytuł zawierający typ i okres przeciętnego ruchu. Następna część obliczy wykładniczą średnią ruchomą. EMA ------------------------------------------ ElseIf comboTypeMA. Value wykładniczy następnie Dim alfa As Double alpha 2 (inputPeriod 1) dla j 1 W celu wprowadzenia danych wejściowych temp. temperatury temp. podgrzewacza (j) Następna wartość parametru outputarray (inputPeriod )Powód temp. pierwszego Najpierw określana jest wartość alfa. Ponieważ w obliczeniach wartość EMA jest oparta na poprzedniej EMA, pierwsza będzie prostą średnią ruchoma. Dla i inputPeriod 1 Dla OutputCarriage (i) outputarray (i-1) alpha (inputarray (i) - outputarray (i-1)) Dalej i Zaczynając od drugiej średniej ruchomej, będą obliczane na podstawie powyższego wzoru: poprzednia EMA plus alfa pomnożona przez różnicę pomiędzy bieżącym numerem od wartości parametru inputarray a poprzednią wartością EMA. Dla i inputPeriod To RowCount outputRange. Cells (i, 1).Wynik wyjściowy (i) Następny i outputRange. Cells (0, 1).Value EMA (amp wzmacniacza wejściowego) Podobnie jak kod SMA, format wyjściowy zostanie zapełniony i komórka powyżej parametru outputarray będzie reprezentować rodzaj i okres średniej ruchomej. Poniżej znajduje się kod do obliczania ważonej średniej ruchomej. WMA ------------------------------------------ ElseIf comboTypeMA. Value Weighted Then Dim temp2 As Integer Dla i inputPeriod To RowCount temp 0 temp2 0 Dla j (i - (inputPeriod - 1)) Do i temp temp inputarray (j) (j - i inputPeriod) temp2 temp2 (j - i inputPeriod) Następna wersja outputarray (i ) temp temp2 outputRange. Cells (i, 1).Rozmiar wyjściowy (i) Następny i outputRange. Cells (0, 1).Value WMA (wzmacniacz wzmacniacza wejściowego) Koniec Jeśli poniższa tabela zawiera kroki obliczania każdej zmiennej używanej dla Obliczanie WMA. Podobnie jak w poprzednim przykładzie, w tym przypadku są liczby w inputRange. a okres wprowadzania wynosi 3. Poniżej znajduje się końcowy kod procedury, który usuwa formularz użytkownika. Rozładuj MAForm End Sub Poniższa procedura dotyczy przycisku Anuluj. Zostanie dodany w tym samym module. Private Sub buttonCancelClick () Wyładuj MAForm End Sub

No comments:

Post a Comment