Simple Moving Average Vba Code




Simple Moving Average Vba CodeIch mochte einen gleitenden Durchschnitt der letzten, sagen 20, Zahlen einer Spalte zu berechnen. Ein Problem ist, dass einige Zellen der Spalte leer sein konnen, sie ignoriert werden sollten. Beispiel: Ein gleitender Durchschnitt der letzten drei ware (155167201) / 3. Ive versucht, dies zu implementieren mit Mittelwert, Offset, Index, aber ich wei? einfach nicht, wie. Im ein wenig vertraut mit Makros, so wurde eine solche Losung gut funktionieren: MovingAverage (A13) Vielen Dank fur alle Tipps oder Losungen Geben Sie dies mit Controlshiftenter, um es eine Matrix-Formel. Hier finden Sie die letzten drei Werte. Wenn Sie mehr oder weniger wollen, andern Sie die beiden Instanzen von 3 in der Formel, was auch immer Sie wollen. Dieses Teil gibt die 4. hochste Zeilennummer aller Zellen zuruck, die einen Wert haben, oder 5 in Ihrem Beispiel, da die Zeilen 6, 8 und 9 die 1. bis 3. hochsten Zeilen mit einem Wert sind. Dieser Teil gibt 9 TRUEs oder FALSEs zuruck, basierend darauf, ob die Zeilennummer gro?er als die 4. gro?te ist. Diese multipliziert die Werte in A1: A9 mit diesen 9 WAHREN oder FALSE. TRUEs werden in 1 und FALSEs auf null konvertiert. Dies lasst eine SUM-Funktion wie folgt Weil alle Werte uber 155 nicht das Zeilennummerkriterium erfullen, wird das Get mit Null multipliziert. Ich habe ein kurzes Skript in VBA geschrieben. Hopefull es tut, was Sie wollen. Hier sind Sie: 1) Ich habe Limit auf 360 Zellen gesetzt. Das bedeutet, dass das Skript nicht mehr als 360 Zellen sucht. Wenn Sie sie andern mochten, andern Sie den Anfangswert des Zahlers. 2) Das Skript gibt nicht gerundeten Durchschnitt zuruck. Andern Sie die letzte Zeile in MovingAverage Round (CDbl (tmp / i), 2) 3) Die Verwendung ist genau wie Sie wollten, so geben Sie einfach MovingAverage (a13) in die Zelle. Alle Kommentare sind willkommen. Wie Berechnung von EMA in Excel Erfahren Sie, wie die exponentiellen gleitenden Durchschnitt in Excel und VBA zu berechnen, und erhalten Sie eine kostenlose Web-Kalkulationstabelle. Die Kalkulationstabelle holt die Bestandsdaten von Yahoo Finance ab, berechnet die EMA (uber dem gewahlten Zeitfenster) und stellt die Ergebnisse dar. Der Download-Link ist unten. Die VBA kann angesehen und bearbeitet werden. Aber zuerst disover, warum EMA ist wichtig fur technische Handler und Marktanalysten. Historische Aktienkurse werden oft mit vielen hochfrequenten Gerauschen belastet. Das verbirgt oft gro?e Trends. Gleitende Durchschnitte helfen, diese kleinen Schwankungen auszugleichen, so dass Sie einen besseren Einblick in die allgemeine Marktrichtung erhalten. Der exponentielle gleitende Durchschnitt legt mehr Wert auf neuere Daten. Je gro?er die Zeitspanne, desto geringer die Wichtigkeit der aktuellsten Daten. EMA wird durch diese Gleichung definiert. (Multipliziert mit einem Gewicht) und yesterday8217s EMA (multipliziert mit 1-Gewicht) Sie mussen die EMA-Berechnung mit einer anfanglichen EMA (EMA 0) kickstart. Dies ist gewohnlich ein einfacher gleitender Durchschnitt der Lange T. Die obige Tabelle gibt beispielsweise die EMA von Microsoft zwischen dem 1. Januar 2013 und dem 14. Januar 2014 an. Technische Handler verwenden oft die Kreuzung zweier gleitender Durchschnitte 8211 mit einer kurzen Zeitskala Und ein anderer mit einer langen Zeitskala 8211, um Kauf / Verkaufssignale zu erzeugen. Haufig werden 12- und 26-Tage-Gleitmittel verwendet. Wenn der kurzere gleitende Durchschnitt uber dem langeren gleitenden Durchschnitt steigt, ist der Markt trends aufwandig, das ist ein Kaufsignal. Allerdings, wenn die kurzere gleitende Mittelwerte fallt unter den langlebigen Durchschnitt, der Markt sinkt dies ist ein Verkaufssignal. Let8217s erlernen zuerst, wie man EMA using Arbeitsblattfunktionen berechnet. Danach entdecken wir, wie man VBA zur Berechnung von EMA verwendet (und automatisch Plot Diagramme) Berechnen Sie EMA in Excel mit Worksheet-Funktionen Schritt 1. Let8217s sagen, dass wir die 12-Tage-EMA von Exxon Mobil8217s Aktienkurs berechnen wollen. Wir mussen zunachst historische Aktienkurse 8211 erhalten, die Sie mit diesem Bulk-Aktien-Downloader tun konnen. Schritt 2 . Berechnen Sie den einfachen Durchschnitt der ersten 12 Preise mit Excel8217s Average () - Funktion. In der Screengrab unten, in Zelle C16 haben wir die Formel AVERAGE (B5: B16) wo B5: B16 enthalt die ersten 12 schlie?en Preise Schritt 3. Unterhalb der Zelle, die in Schritt 2 verwendet wird, geben Sie die EMA Formel oben ein Dort haben Sie es You8217ve berechnete erfolgreich einen wichtigen technischen Indikator, EMA, in einer Kalkulationstafel. Berechnen EMA mit VBA Jetzt let8217s mechanisieren die Berechnungen mit VBA, einschlie?lich der automatischen Erstellung von Plots. Ich hab8217t zeigt Ihnen die volle VBA hier (es8217s in der Kalkulationstabelle unten), aber wir8217ll diskutieren die meisten kritischen Code. Schritt 1. Laden Sie historische Aktienkurse fur Ihren Ticker von Yahoo Finance (mit CSV-Dateien) und laden Sie sie in Excel oder verwenden Sie die VBA in dieser Tabelle, um historische Zitate direkt in Excel zu erhalten. Ihre Daten konnen so aussehen: Schritt 2. Dies ist, wo wir brauchen, um ein paar braincells 8211 wir brauchen, um die EMA-Gleichung in VBA implementieren. Wir konnen R1C1-Stil verwenden, um programmgesteuert Formeln in einzelne Zellen eingeben. Untersuchen Sie das Code-Snippet unten. EMAWindow ist eine Variable, die dem gewunschten Zeitfenster entspricht numRows ist die Gesamtzahl der Datenpunkte 1 (die 8220 18221 ist da we8217re unter der Annahme, dass die tatsachlichen Bestandsdaten in Zeile 2 beginnen) wird die EMA in Spalte berechnet h Angenommen, dass EMAWindow 5 und Numrows Die erste Zeile platziert eine Formel in der Zelle h6, die das arithmetische Mittel der ersten 5 historischen Datenpunkte berechnet. Die zweite Zeile platziert Formeln in den Zellen h7: h100, die die EMA der verbleibenden 95 berechnet Datenpunkte Schritt 3 Diese VBA-Funktion erzeugt einen Plot des engen Preises und der EMA. Gro?er Job auf Diagrammen und Erklarungen. Ich habe eine Frage though. Wenn ich das Anfangsdatum zu einem Jahr spater andere und neueste EMA Daten betrachte, ist es merklich unterschiedlich, als wenn ich den gleichen EMA Zeitraum mit einem fruheren Anfangsdatum fur die gleiche neue Datumsreferenz verwende. Ist das, was Sie erwarten. Es macht es schwierig, bei veroffentlichten Diagrammen mit EMAs angezeigt und nicht sehen, das gleiche Diagramm. Shivashish Sarkar sagt: Hallo, ich bin mit Ihrem EMA-Rechner und ich wirklich zu schatzen wissen. Allerdings habe ich festgestellt, dass der Taschenrechner nicht in der Lage, die Graphen fur alle Unternehmen (es zeigt Run time error 1004). Konnen Sie bitte eine aktualisierte Ausgabe Ihres Taschenrechners, in dem neue Unternehmen aufgenommen werden werden Lassen Sie eine Antwort Abbrechen Antwort Wie die kostenlose Spreadsheets Master Knowledge Base Aktuelle ArtikelHere ist ein Code, der fur diejenigen mit technischen Analyse im Handel hilfreich sein und wollen Strategien zu testen In Excel. Sie berechnet den einfachen, linear gewichteten und exponentiellen gleitenden Durchschnitt. Weiter werde ich die Schritte zur Erstellung des Formulars und des VBA-Codes vorstellen und erlautern. Einfugen einer UserForm 8211 Name: MAForm Fugen Sie vier Labels aus den Toolbox-Steuerelementen hinzu 8211 Beschriftungen wie im obigen Druckbildschirm Fugen Sie eine ComboBox fur die gleitende durchschnittliche Typauswahl hinzu. Es hei?t comboTypeMA Fugen Sie zwei RefEdit-Steuerelemente fur den Eingabebereich und den Ausgabebereich hinzu. Fugen Sie eine TextBox hinzu, um die gleitende durchschnittliche Periode zu selektieren. Fugen Sie zwei Schaltflachen hinzu: Name: buttonSubmit, Caption: Submit und Name: buttonCancel, Caption: Cancel Um die Dropdown-Liste fur die MA-Typ-Auswahl zu generieren und das User-Formular zu laden, ein neues Modul Wird mit dem unten stehenden Code eingefugt. Die ComboBox-Elemente, die mit gleitenden Durchschnittswerten und dem Benutzerformular gefullt werden, werden geladen. Option Explicit Sub loadMAForm () Mit MAFormboTypeMA. RowSource. AddItem Einfach. AddItem Gewichtet. AddItem Exponentielles Ende Mit MAForm. Show End Sub Unten ist der Code, der der Schaltflache Submit zugeschrieben wird. Private Sub buttonSubmitClick () Dim inputRange, outputRange Als Bereich Der inputRange enthalt die Preisreihen, die fur die Berechnung der MAs verwendet werden, und der outputRange wird mit den gleitenden Durchschnittswerten gefullt. Dim inputPeriod As Integer Der gleitende Durchschnittszeitraum wird deklariert. Dim inputAddress, outputAddress As String Die als String deklarierten Eingabe - und Ausgabebereiche. Wenn comboTypeMA. Value ltgt Exponential und comboTypeMA. Value ltgt Einfach und comboTypeMA. Value ltgt Weighted True Dann MsgBox Wahlen Sie einen gleitenden Durchschnittstyp aus der Liste aus. RefInputRange. SetFocus Exit Sub Dieser Teil der Prozedur erzwingt die ersten Einschrankungen bezuglich der ubermittelten Daten. Wenn der gleitende Durchschnittstyp nicht in der Dropdown-Liste enthalten ist, wird der Vorgang nicht zum nachsten Schritt fortgesetzt, und der Benutzer wird aufgefordert, ihn erneut auszuwahlen. ElseIf RefInputRange. Value Then MsgBox Bitte wahlen Sie den Eingabebereich. RefInputRange. SetFocus Exit Sub ElseIf RefOutputRange. Value Dann MsgBox Bitte wahlen Sie den Ausgabebereich. RefOutputRange. SetFocus Exit Sub ElseIf RefInputPeriod. Value Then MsgBox Bitte wahlen Sie die gleitende durchschnittliche Periode. RefInputPeriod. SetFocus Exit Sub ElseIf Nicht IsNumeric (RefInputPeriod. Value) Dann MsgBox Moving durchschnittliche Periode muss eine Zahl sein. RefInputPeriod. SetFocus Exit Sub End If Weitere Einschrankungen werden erstellt. Eingabebereich, Ausgabebereich und Eingabeperiode durfen nicht leer sein. Auch die gleitende durchschnittliche Periode muss eine Zahl sein. InputAddress RefInputRange. Value inputRange Range (inputAddress) outputAddress RefOutputRange. Value Set outputRange Range (outputAddress) inputPeriod RefInputPeriod. Value Die Argumente fur inputRange und outputRange werden inputAddress und outputAddress als Strings deklariert. If inputRange. Columns. Count ltgt 1 Dann kann der MsgBox-Eingabebereich nur eine Spalte haben. RefInputRange. SetFocus Exit Sub Der inputRange darf nur eine Spalte enthalten. ElseIf inputRange. Rows. Count ltgt outputRange. Rows. Count Dann hat der MsgBox-Ausgabebereich eine andere Anzahl von Zeilen als der Eingabebereich. RefInputRange. SetFocus Exit Sub End If Die inputRange und outputRange mussen eine gleiche Anzahl von Zeilen haben. Dim RowCount As Integer RowCount inputRange. Rows. Count Dim CROW As Integer ReDim inputarray (1 bis RowCount) Fur crow 1 Um RowCount inputarray (CROW) inputRange. Cells (krahe, 1).Value Next CROW inputarray als Array deklariert ist und it8217s Elemente Entsprechen den Werten aus jeder Zeile des Eingangsbereichs. Wenn inputPeriod gt RowCount Then MsgBox Anzahl der ausgewahlten Beobachtungen ist amp RowCount amp und die Periode ist amp inputPeriod amp. Der Eingangsbereich muss eine hohere oder gleiche Anzahl von Elementen haben als der ausgewahlte Zeitraum. RefInputRange. SetFocus Exit Sub End Wenn eine weitere Einschrankung hinzugefugt wird 8211 Der Eingabebereich muss eine hohere oder gleiche Menge an Elementen als die Periode haben. Wenn inputPeriod lt 0 dann MsgBox Moving durchschnittliche Periode gro?er als 0 sein muss. RefInputPeriod. SetFocus Exit Sub End If Die gleitende durchschnittliche Periode muss gro?er als Null sein. ReDim outputarray (inputPeriod To RowCount) Als Variant werden auch die Array-Dimensionen von outputarray bestimmt. Die untere Schranke des Arrays ist der Wert inputPeriod und die obere Schranke der Wert von RowCount (die Anzahl der Elemente im inputRange). Im folgenden Teil der Prozedur wurde der einfache gleitende Durchschnitt berechnet, wenn die Auswahl fur comboTypeMA einfach ist. SMA ----------------------------------------- Wenn comboTypeMA. Value Simple Then Dim i , j As Integer Dim Temp As Double Fur i inputPeriod Um RowCount Temp 0 fur j (i - (inputPeriod - 1)) bis i Temp Temp inputarray (j) Next j output (i) temp / inputPeriod outputRange. Cells (i, 1 ).Value outputarray (i) Next i outputRange. Cells (0, 1).Value SMA (amp inputPeriod amp) Grundsatzlich berechnet das Verfahren den gleitenden Durchschnitt der letzten x-Zahlen (x entspricht der inputPeriod), beginnend mit dem Element Des Eingangsarrays gleich der inputPeriod. Unten ist ein vereinfachtes Beispiel, das jeden Schritt des Verfahrens zeigt. In diesem Beispiel gibt es vier Ziffern (no01, no02, no03 und no04) von Zeile 1 bis Zeile 4 und die gleitende durchschnittliche Periode ist 3. Nach jedem neuen gleitenden Durchschnitt berechnet jede Zelle des outputRange den Wert aus dem Wert Ausgabearray. Und nachdem alle gleitenden Mittelwerte berechnet werden, wird in der Zelle uber outputRange ein Titel eingefugt, der den gleitenden Durchschnittstyp und die Periode enthalt. Dieser nachste Teil wird den exponentiellen gleitenden Durchschnitt berechnen. EMA ------------------------------------------ ElseIf comboTypeMA. Value Exponential Dann Dim Alpha As Doppel alpha 2 / (inputPeriod 1) Fur j 1 Zu inputPeriod temp temp inputarray (j) Weiter j outputarray (inputPeriod) temp / inputPeriod Zuerst wird der Wert von alpha bestimmt. Da bei der Berechnung der Wert der EMA auf der vorherigen EMA basiert, wird der erste der einfache gleitende Durchschnitt sein. (I - 1) alpha (inputarray (i) - outputarray (i - 1)) Next i Beginnend mit dem zweiten gleitenden Durchschnitt werden sie auf der Grundlage der obigen Formel berechnet: Vorherige EMA plus alpha multipliziert mit der Differenz zwischen der aktuellen Zahl aus dem Eingangsarray und dem vorherigen EMA-Wert. Denn ich RowCount outputRange. Cells (i, 1) inputPeriod. Wert output (i) Next i outputRange. Cells (0, 1).Value EMA (amp inputPeriod amp) Genau wie der Code fur SMA, wird die output bevolkert und Die Zelle uber Outputarray reprasentiert den Typ und die Periode des gleitenden Durchschnitts. Unten ist der Code fur die Berechnung der gewichteten gleitenden Durchschnitt. WMA ------------------------------------------ ElseIf comboTypeMA. Value Weighted Then Dim TEMP2 As Integer For i inputPeriod Um RowCount Temp 0 temp2 0 fur j (i - (inputPeriod - 1)) bis i Temp Temp inputarray (j) (j - i inputPeriod) TEMP2 TEMP2 (j - i inputPeriod) Next j output (i ) temp / temp2 outputRange. Cells (i, 1).Value output (i) Next i outputRange. Cells (0, 1).Value WMA (amp inputPeriod amp) End If Die folgenden Tabelle sind die Schritte zur Berechnung der einzelnen variablen enthalt verwendet fur Die WMA-Berechnung. Genau wie im vorherigen Beispiel, in diesem gibt es fur Zahlen im inputRange. Und die Eingabeperiode ist 3. Unten ist der endgultige Code der Prozedur, die das Benutzerformular entladt. Unload MAForm End Sub Die folgende Prozedur ist fur die Schaltflache Abbrechen. Es wird in demselben Modul hinzugefugt. Private Sub buttonCancelClick () Unload MAForm End Sub