Saturday 2 September 2017

Simple Moving Average Vba Code


Ich möchte einen gleitenden Durchschnitt der letzten, sagen 20, Zahlen einer Spalte zu berechnen. Ein Problem ist, dass einige Zellen der Spalte leer sein können, sie ignoriert werden sollten. Beispiel: Ein gleitender Durchschnitt der letzten drei wäre (155167201) / 3. Ive versucht, dies zu implementieren mit Mittelwert, Offset, Index, aber ich weiß einfach nicht, wie. Im ein wenig vertraut mit Makros, so würde eine solche Lösung gut funktionieren: MovingAverage (A13) Vielen Dank für alle Tipps oder Lösungen Geben Sie dies mit Controlshiftenter, um es eine Matrix-Formel. Hier finden Sie die letzten drei Werte. Wenn Sie mehr oder weniger wollen, ändern Sie die beiden Instanzen von 3 in der Formel, was auch immer Sie wollen. Dieses Teil gibt die 4. höchste Zeilennummer aller Zellen zurück, die einen Wert haben, oder 5 in Ihrem Beispiel, da die Zeilen 6, 8 und 9 die 1. bis 3. höchsten Zeilen mit einem Wert sind. Dieser Teil gibt 9 TRUEs oder FALSEs zurück, basierend darauf, ob die Zeilennummer größer als die 4. größ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 lässt eine SUM-Funktion wie folgt Weil alle Werte über 155 nicht das Zeilennummerkriterium erfüllen, 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 ändern möchten, ändern Sie den Anfangswert des Zählers. 2) Das Skript gibt nicht gerundeten Durchschnitt zurück. Ändern 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 (über dem gewählten 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 für technische Händler und Marktanalysten. Historische Aktienkurse werden oft mit vielen hochfrequenten Geräuschen 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 größ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 müssen die EMA-Berechnung mit einer anfänglichen EMA (EMA 0) kickstart. Dies ist gewöhnlich ein einfacher gleitender Durchschnitt der Länge T. Die obige Tabelle gibt beispielsweise die EMA von Microsoft zwischen dem 1. Januar 2013 und dem 14. Januar 2014 an. Technische Händler 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. Häufig werden 12- und 26-Tage-Gleitmittel verwendet. Wenn der kürzere gleitende Durchschnitt über dem längeren gleitenden Durchschnitt steigt, ist der Markt trends aufwändig, das ist ein Kaufsignal. Allerdings, wenn die kürzere gleitende Mittelwerte fällt 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 müssen zunächst historische Aktienkurse 8211 erhalten, die Sie mit diesem Bulk-Aktien-Downloader tun können. 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 enthält 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 für 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 können so aussehen: Schritt 2. Dies ist, wo wir brauchen, um ein paar braincells 8211 wir brauchen, um die EMA-Gleichung in VBA implementieren. Wir können R1C1-Stil verwenden, um programmgesteuert Formeln in einzelne Zellen eingeben. Untersuchen Sie das Code-Snippet unten. EMAWindow ist eine Variable, die dem gewünschten Zeitfenster entspricht numRows ist die Gesamtzahl der Datenpunkte 1 (die 8220 18221 ist da we8217re unter der Annahme, dass die tatsächlichen 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 Erklärungen. Ich habe eine Frage though. Wenn ich das Anfangsdatum zu einem Jahr später ändere und neueste EMA Daten betrachte, ist es merklich unterschiedlich, als wenn ich den gleichen EMA Zeitraum mit einem früheren Anfangsdatum für die gleiche neue Datumsreferenz verwende. Ist das, was Sie erwarten. Es macht es schwierig, bei veröffentlichten Diagrammen mit EMAs angezeigt und nicht sehen, das gleiche Diagramm. Shivashish Sarkar sagt: Hallo, ich bin mit Ihrem EMA-Rechner und ich wirklich zu schätzen wissen. Allerdings habe ich festgestellt, dass der Taschenrechner nicht in der Lage, die Graphen für alle Unternehmen (es zeigt Run time error 1004). Können 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 für 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 erläutern. Einfügen einer UserForm 8211 Name: MAForm Fügen Sie vier Labels aus den Toolbox-Steuerelementen hinzu 8211 Beschriftungen wie im obigen Druckbildschirm Fügen Sie eine ComboBox für die gleitende durchschnittliche Typauswahl hinzu. Es heißt comboTypeMA Fügen Sie zwei RefEdit-Steuerelemente für den Eingabebereich und den Ausgabebereich hinzu. Fügen Sie eine TextBox hinzu, um die gleitende durchschnittliche Periode zu selektieren. Fügen Sie zwei Schaltflächen hinzu: Name: buttonSubmit, Caption: Submit und Name: buttonCancel, Caption: Cancel Um die Dropdown-Liste für die MA-Typ-Auswahl zu generieren und das User-Formular zu laden, ein neues Modul Wird mit dem unten stehenden Code eingefügt. Die ComboBox-Elemente, die mit gleitenden Durchschnittswerten und dem Benutzerformular gefüllt 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 Schaltfläche Submit zugeschrieben wird. Private Sub buttonSubmitClick () Dim inputRange, outputRange Als Bereich Der inputRange enthält die Preisreihen, die für die Berechnung der MAs verwendet werden, und der outputRange wird mit den gleitenden Durchschnittswerten gefüllt. 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 Wählen Sie einen gleitenden Durchschnittstyp aus der Liste aus. RefInputRange. SetFocus Exit Sub Dieser Teil der Prozedur erzwingt die ersten Einschränkungen bezüglich der übermittelten Daten. Wenn der gleitende Durchschnittstyp nicht in der Dropdown-Liste enthalten ist, wird der Vorgang nicht zum nächsten Schritt fortgesetzt, und der Benutzer wird aufgefordert, ihn erneut auszuwählen. ElseIf RefInputRange. Value Then MsgBox Bitte wählen Sie den Eingabebereich. RefInputRange. SetFocus Exit Sub ElseIf RefOutputRange. Value Dann MsgBox Bitte wählen Sie den Ausgabebereich. RefOutputRange. SetFocus Exit Sub ElseIf RefInputPeriod. Value Then MsgBox Bitte wählen 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 Einschränkungen werden erstellt. Eingabebereich, Ausgabebereich und Eingabeperiode dürfen 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 für 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 müssen eine gleiche Anzahl von Zeilen haben. Dim RowCount As Integer RowCount inputRange. Rows. Count Dim CROW As Integer ReDim inputarray (1 bis RowCount) Für crow 1 Um RowCount inputarray (CROW) inputRange. Cells (krähe, 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 ausgewählten Beobachtungen ist amp RowCount amp und die Periode ist amp inputPeriod amp. Der Eingangsbereich muss eine höhere oder gleiche Anzahl von Elementen haben als der ausgewählte Zeitraum. RefInputRange. SetFocus Exit Sub End Wenn eine weitere Einschränkung hinzugefügt wird 8211 Der Eingabebereich muss eine höhere oder gleiche Menge an Elementen als die Periode haben. Wenn inputPeriod lt 0 dann MsgBox Moving durchschnittliche Periode größer als 0 sein muss. RefInputPeriod. SetFocus Exit Sub End If Die gleitende durchschnittliche Periode muss größ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 für comboTypeMA einfach ist. SMA ----------------------------------------- Wenn comboTypeMA. Value Simple Then Dim i , j As Integer Dim Temp As Double Für i inputPeriod Um RowCount Temp 0 für 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) Grundsätzlich 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 über outputRange ein Titel eingefügt, der den gleitenden Durchschnittstyp und die Periode enthält. Dieser nächste Teil wird den exponentiellen gleitenden Durchschnitt berechnen. EMA ------------------------------------------ ElseIf comboTypeMA. Value Exponential Dann Dim Alpha As Doppel alpha 2 / (inputPeriod 1) Für 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 für SMA, wird die output bevölkert und Die Zelle über Outputarray repräsentiert den Typ und die Periode des gleitenden Durchschnitts. Unten ist der Code für 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 für 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 enthält verwendet für Die WMA-Berechnung. Genau wie im vorherigen Beispiel, in diesem gibt es für Zahlen im inputRange. Und die Eingabeperiode ist 3. Unten ist der endgültige Code der Prozedur, die das Benutzerformular entlädt. Unload MAForm End Sub Die folgende Prozedur ist für die Schaltfläche Abbrechen. Es wird in demselben Modul hinzugefügt. Private Sub buttonCancelClick () Unload MAForm End Sub

No comments:

Post a Comment