Wednesday, November 23, 2016

Gleitender Durchschnittsfilter C

Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren kann, indem Sie eine Fenstergröße, die eine Macht von zwei für Bit-Verschiebung statt zu teilen, aber nicht brauchen zu ermöglichen Ein Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die a in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Initialize total 0, count0 (jedes Mal, wenn ein neuer Wert angezeigt wird) Dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein Divide-Durchschnitt (total / count) Dies wäre ein gleitender Durchschnitt über alle Eingänge Als nur die letzten 4 Eingänge, würde 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einer älteren inputvariable, dann die Berechnung der neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (rechte Verschiebung 2 wäre gut, wenn alle Eingänge waren Positiv, um die Durchschnittsberechnung zu machen, wie andere schon erwähnt haben, sollten Sie einen IIR-Filter (Endlosimpulsantwort) anstelle des FIR (Finite Impulse Response) - Filter, den Sie jetzt verwenden, berücksichtigen, aber auf den ersten Blick sind FIR-Filter implementiert Als explizite Windungen und IIR-Filter mit Gleichungen. Das besondere IIR-Filter, das ich viel in Mikrocontrollern verwenden, ist ein einpoliges Tiefpaßfilter. Dieses ist das digitale Äquivalent eines einfachen RC-Analogfilter. Für die meisten Anwendungen haben diese bessere Eigenschaften als die Box-Filter, den Sie verwenden. Die meisten Verwendungen eines Box-Filter, die ich begegnet bin, sind ein Ergebnis von jemand nicht Aufmerksamkeit in der digitalen Signalverarbeitung Klasse, nicht als Ergebnis der Notwendigkeit ihrer besonderen Eigenschaften. Wenn Sie nur wollen, um hohe Frequenzen zu dämpfen, dass Sie wissen, Rauschen sind, ist ein einpoliges Tiefpassfilter besser. Der beste Weg, um ein digitales in einem Mikrocontroller zu implementieren, ist in der Regel: FILT lt - FILT FF (NEW - FILT) FILT ist ein Stück persistenten Zustand. Dies ist die einzige persistente Variable, die Sie benötigen, um diesen Filter zu berechnen. NEU ist der neue Wert, den der Filter mit dieser Iteration aktualisiert. FF ist die Filterfraktion. Die die Schwere des Filters einstellt. Betrachten Sie diesen Algorithmus und sehen Sie, dass für FF 0 der Filter unendlich schwer ist, da sich der Ausgang nie ändert. Für FF 1 ist das eigentlich gar kein Filter, da der Ausgang nur dem Eingang folgt. Nützliche Werte sind dazwischen. Bei kleinen Systemen wählen Sie FF auf 1/2 N, so dass die Multiplikation mit FF als Rechtsverschiebung um N Bits erreicht werden kann. Beispielsweise kann FF 1/16 betragen und das Multiplizieren mit FF daher eine Rechtsverschiebung von 4 Bits. Andernfalls benötigt dieses Filter nur eine Subtraktion und eine Addition, obwohl die Zahlen in der Regel größer als der Eingangswert sein müssen (mehr über die numerische Genauigkeit in einem separaten Abschnitt weiter unten). Ich normalerweise nehmen A / D-Messwerte deutlich schneller als sie benötigt werden und wenden Sie zwei dieser Filter kaskadiert. Dies ist das digitale Äquivalent von zwei R-C-Filtern in Serie und dämpft um 12 dB / Oktave über der Rolloff-Frequenz. Für A / D-Messungen ist es jedoch gewöhnlich relevanter, den Filter im Zeitbereich zu betrachten, indem er seine Sprungantwort betrachtet. Dies zeigt Ihnen, wie schnell Ihr System eine Änderung sehen wird, wenn die Sache, die Sie messen, ändert. Zur Erleichterung der Gestaltung dieser Filter (was nur bedeutet Kommissionierung FF und entscheiden, wie viele von ihnen zu kaskadieren), benutze ich mein Programm FILTBITS. Sie legen die Anzahl der Schaltbits für jede FF in der kaskadierten Filterreihe fest und berechnen die Schrittantwort und andere Werte. Eigentlich habe ich in der Regel laufen diese über mein Wrapper-Skript PLOTFILT. Dies führt FILTBITS, die eine CSV-Datei macht, dann die CSV-Datei. Beispielsweise ist hier das Ergebnis von PLOTFILT 4 4: Die beiden Parameter zu PLOTFILT bedeuten, dass es zwei Filter gibt, die von dem oben beschriebenen Typ kaskadiert sind. Die Werte von 4 geben die Anzahl der Schaltbits an, um die Multiplikation mit FF zu realisieren. Die beiden FF-Werte sind in diesem Fall 1/16. Die rote Spur ist die Einheit Schritt Antwort, und ist die Hauptsache zu betrachten. Dies bedeutet beispielsweise, dass sich der Ausgang des kombinierten Filters auf 90 des neuen Wertes in 60 Iterationen niederschlägt, falls sich der Eingang sofort ändert. Wenn Sie ca. 95 Einschwingzeit kümmern, dann müssen Sie etwa 73 Iterationen warten, und für 50 Einschwingzeit nur 26 Iterationen. Die grüne Kurve zeigt Ihnen den Ausgang einer einzelnen Amplitude. Dies gibt Ihnen eine Vorstellung von der zufälligen Rauschunterdrückung. Es sieht aus wie keine einzelne Probe wird mehr als eine 2,5 Änderung in der Ausgabe verursachen. Die blaue Spur soll ein subjektives Gefühl geben, was dieser Filter mit weißem Rauschen macht. Dies ist kein strenger Test, da es keine Garantie gibt, was genau der Inhalt der Zufallszahlen war, die als der weiße Rauscheneingang für diesen Durchlauf von PLOTFILT ausgewählt wurden. Seine nur, um Ihnen ein grobes Gefühl, wie viel es gequetscht werden und wie glatt es ist. PLOTFILT, vielleicht FILTBITS, und viele andere nützliche Dinge, vor allem für PIC-Firmware-Entwicklung ist verfügbar in der PIC Development Tools-Software-Release auf meiner Software-Downloads-Seite. Hinzugefügt über numerische Genauigkeit Ich sehe aus den Kommentaren und nun eine neue Antwort, dass es Interesse an der Diskussion der Anzahl der Bits benötigt, um diesen Filter zu implementieren. Beachten Sie, dass das Multiplizieren mit FF Log 2 (FF) neue Bits unterhalb des Binärpunkts erzeugt. Bei kleinen Systemen wird FF gewöhnlich mit 1/2 N gewählt, so daß diese Multiplikation tatsächlich durch eine Rechtsverschiebung von N Bits realisiert wird. FILT ist daher meist eine feste Ganzzahl. Beachten Sie, dass dies ändert keine der Mathematik aus der Prozessoren Sicht. Wenn Sie beispielsweise 10-Bit-A / D-Messwerte und N 4 (FF 1/16) filtern, benötigen Sie 4 Fraktionsbits unter den 10-Bit-Integer-A / D-Messungen. Einer der meisten Prozessoren, youd tun 16-Bit-Integer-Operationen aufgrund der 10-Bit-A / D-Lesungen. In diesem Fall können Sie immer noch genau die gleichen 16-Bit-Integer-Opertions, aber beginnen mit der A / D-Lesungen um 4 Bits verschoben verschoben. Der Prozessor kennt den Unterschied nicht und muss nicht. Das Durchführen der Mathematik auf ganzen 16-Bit-Ganzzahlen funktioniert, ob Sie sie als 12,4 feste oder wahre 16-Bit-Ganzzahlen (16,0 Fixpunkt) betrachten. Im Allgemeinen müssen Sie jedem Filterpole N Bits hinzufügen, wenn Sie aufgrund der numerischen Darstellung kein Rauschen hinzufügen möchten. Im obigen Beispiel müsste das zweite Filter von zwei 1044 18 Bits haben, um keine Informationen zu verlieren. In der Praxis auf einer 8-Bit-Maschine bedeutet, dass youd 24-Bit-Werte verwenden. Technisch nur den zweiten Pol von zwei würde den größeren Wert benötigen, aber für Firmware Einfachheit ich in der Regel die gleiche Darstellung, und damit der gleiche Code, für alle Pole eines Filters. Normalerweise schreibe ich eine Unterroutine oder Makro, um eine Filterpol-Operation durchzuführen, dann gelten, dass für jeden Pol. Ob eine Unterroutine oder ein Makro davon abhängt, ob Zyklen oder Programmspeicher in diesem Projekt wichtiger sind. So oder so, ich benutze einige Scratch-Zustand, um NEU in die Subroutine / Makro, die FILT Updates, sondern auch lädt, dass in den gleichen Kratzer NEU war in. Dies macht es einfach, mehrere Pole anzuwenden, da die aktualisierte FILT von einem Pol ist Die NEUE der nächsten. Wenn ein Unterprogramm, ist es sinnvoll, einen Zeiger auf FILT auf dem Weg in, die auf nur nach FILT auf dem Weg nach draußen aktualisiert wird. Auf diese Weise arbeitet das Unterprogramm automatisch auf aufeinanderfolgenden Filtern im Speicher, wenn es mehrmals aufgerufen wird. Mit einem Makro benötigen Sie nicht einen Zeiger, da Sie in der Adresse passieren, um auf jeder Iteration zu arbeiten. Code-Beispiele Hier ein Beispiel für ein Makro wie oben für eine PIC 18 beschrieben: Und hier ist ein ähnliches Makro für eine PIC 24 oder dsPIC 30 oder 33: Beide Beispiele werden als Makros unter Verwendung meines PIC-Assembler-Präprozessors implementiert. Die mehr fähig ist als eine der eingebauten Makroanlagen. Clabacchio: Ein weiteres Thema, das ich erwähnen sollte, ist die Firmware-Implementierung. Sie können eine einpolige Tiefpassfilter-Subroutine einmal schreiben und dann mehrmals anwenden. Tatsächlich schreibe ich normalerweise solch ein Unterprogramm, um einen Zeiger im Gedächtnis in den Filterzustand zu nehmen, dann ihn voranbringen den Zeiger, so daß er nacheinander leicht aufgerufen werden kann, um mehrpolige Filter zu verwirklichen. Ndash Olin Lathrop Apr 20 12 at 15:03 1. Dank sehr viel für Ihre Antworten - alle von ihnen. Ich beschloss, dieses IIR-Filter zu verwenden, aber dieser Filter wird nicht als Standard-Tiefpaßfilter verwendet, da ich die Zählerwerte berechnen und sie vergleichen muss, um Änderungen in einem bestimmten Bereich zu erkennen. Da diese Werte von sehr unterschiedlichen Dimensionen abhängig von Hardware Ich wollte einen Durchschnitt nehmen, um in der Lage sein, auf diese Hardware spezifischen Änderungen automatisch reagieren. Wenn Sie mit der Beschränkung einer Macht von zwei Anzahl von Elementen zu durchschnittlich leben können (dh 2,4,8,16,32 etc), dann kann die Teilung einfach und effizient auf einem getan werden Low-Performance-Mikro ohne dedizierte Division, weil es als Bit-Shift durchgeführt werden kann. Jede Schicht rechts ist eine Macht von zwei zB: Der OP dachte, er hatte zwei Probleme, die Teilung in einem PIC16 und Speicher für seinen Ringpuffer. Diese Antwort zeigt, dass die Teilung nicht schwierig ist. Zwar adressiert es nicht das Gedächtnisproblem, aber das SE-System erlaubt Teilantworten, und Benutzer können etwas von jeder Antwort für selbst nehmen oder sogar redigieren und kombinieren andere39s Antworten. Da einige der anderen Antworten eine Divisionsoperation erfordern, sind sie ähnlich unvollständig, da sie nicht zeigen, wie dies auf einem PIC16 effizient erreicht werden kann. Ndash Martin Apr 20 12 at 13:01 Es gibt eine Antwort für einen echten gleitenden Durchschnitt Filter (auch bekannt als Boxcar-Filter) mit weniger Speicher Anforderungen, wenn Sie dont mind Downsampling. Es heißt ein kaskadiertes Integrator-Kamm-Filter (CIC). Die Idee ist, dass Sie einen Integrator, die Sie nehmen Differenzen über einen Zeitraum, und die wichtigsten Speicher-sparende Gerät ist, dass durch Downsampling, müssen Sie nicht jeden Wert des Integrators zu speichern. Es kann mit dem folgenden Pseudocode implementiert werden: Ihre effektive gleitende durchschnittliche Länge ist decimationFactorstatesize, aber Sie müssen nur um Stateize Proben zu halten. Offensichtlich können Sie bessere Leistung erzielen, wenn Ihr stateize und decimationFactor Potenzen von 2 sind, so dass die Divisions - und Restoperatoren durch Shifts und Masken ersetzt werden. Postscript: Ich stimme mit Olin, dass Sie sollten immer erwägen, einfache IIR-Filter vor einem gleitenden durchschnittlichen Filter. Wenn Sie die Frequenz-Nullen eines Boxcar-Filters nicht benötigen, wird ein 1-poliger oder 2-poliger Tiefpassfilter wahrscheinlich gut funktionieren. Auf der anderen Seite, wenn Sie für die Zwecke der Dezimierung filtern (mit einer hohen Sample-Rate-Eingang und Mittelung es für die Verwendung durch einen Low-Rate-Prozess), dann kann ein CIC-Filter genau das, was Sie suchen. (Vor allem, wenn Sie stateize1 verwenden und den Ringbuffer insgesamt mit nur einem einzigen vorherigen Integrator-Wert zu vermeiden) Theres einige eingehende Analyse der Mathematik hinter der Verwendung der ersten Ordnung IIR-Filter, Olin Lathrop bereits beschrieben hat auf der Digital Signal Processing Stack-Austausch (Enthält viele schöne Bilder.) Die Gleichung für diese IIR-Filter ist: Dies kann mit nur Ganzzahlen und keine Division mit dem folgenden Code implementiert werden (möglicherweise benötigen einige Debugging, wie ich aus dem Speicher wurde.) Dieser Filter approximiert einen gleitenden Durchschnitt von Die letzten K Proben durch Einstellen des Wertes von alpha auf 1 / K. Führen Sie dies im vorherigen Code durch die Definition von BITS auf LOG2 (K), dh für K 16 gesetzt BITS auf 4, für K 4 gesetzt BITS auf 2, etc. (Ill Überprüfung der Code hier aufgelistet, sobald ich eine Änderung und Bearbeiten Sie diese Antwort, wenn nötig.) Antwort # 1 am: Juni 23, 2010, um 4:04 Uhr Heres ein einpoliges Tiefpassfilter (gleitender Durchschnitt, mit Cutoff-Frequenz CutoffFrequency). Sehr einfach, sehr schnell, funktioniert super, und fast kein Speicher Overhead. Hinweis: Alle Variablen haben einen Bereich über die Filterfunktion hinaus, mit Ausnahme des übergebenen newInput Hinweis: Dies ist ein einstufiger Filter. Mehrere Stufen können zusammen kaskadiert werden, um die Schärfe des Filters zu erhöhen. Wenn Sie mehr als eine Stufe verwenden, müssen Sie DecayFactor anpassen (was die Cutoff-Frequenz betrifft), um sie zu kompensieren. Und natürlich alles, was Sie brauchen, ist die beiden Zeilen überall platziert, brauchen sie nicht ihre eigene Funktion. Dieser Filter hat eine Rampenzeit, bevor der gleitende Durchschnitt diejenige des Eingangssignals darstellt. Wenn Sie diese Rampenzeit umgehen müssen, können Sie MovingAverage auf den ersten Wert von newInput anstelle von 0 initialisieren und hoffen, dass der erste newInput kein Ausreißer ist. (CutoffFrequency / SampleRate) einen Bereich zwischen 0 und 0,5 aufweist. DecayFactor ist ein Wert zwischen 0 und 1, in der Regel in der Nähe von 1. Single-precision Schwimmer sind gut genug für die meisten Dinge, ich bevorzuge nur Doppel. Wenn Sie mit ganzen Zahlen bleiben müssen, können Sie DecayFactor und Amplitude Factor in Fractional Integers umwandeln, in denen der Zähler als Integer gespeichert wird und der Nenner eine Ganzzahl von 2 ist (so können Sie Bit-Shift nach rechts als die Nenner, anstatt sich während der Filterschleife teilen zu müssen). Zum Beispiel, wenn DecayFactor 0.99, und Sie Ganzzahlen verwenden möchten, können Sie DecayFactor 0.99 65536 64881. Und dann immer wenn Sie multiplizieren mit DecayFactor in Ihrer Filterschleife, nur verschieben Sie das Ergebnis 16. Für weitere Informationen über dieses, ein ausgezeichnetes Buch thats Online, Kapitel 19 auf rekursive Filter: www. dspguide / ch19.htm PS Für das Moving Average-Paradigma, einen anderen Ansatz für die Einstellung DecayFactor und AmplitudeFactor, die möglicherweise mehr relevant für Ihre Bedürfnisse, können Sie sagen, Sie wollen die vorherigen, etwa 6 Artikeln gemittelt, diskret tun es, fügen Sie 6 Elemente und teilen durch 6, so Können Sie den AmplitudeFactor auf 1/6 und DecayFactor auf (1.0 - AmplitudeFactor) einstellen. Antwortete May 14 12 at 22:55 Jeder andere hat kommentiert gründlich über den Nutzen der IIR vs FIR, und auf Power-of-two-Division. Id nur, um einige Implementierungsdetails zu geben. Das unten genannte funktioniert gut auf kleinen Mikrocontrollern ohne FPU. Es gibt keine Multiplikation, und wenn Sie N eine Potenz von zwei halten, ist die gesamte Division ein-Zyklus-Bit-Verschiebung. Basic FIR-Ringpuffer: Halten Sie einen laufenden Puffer der letzten N-Werte und einen laufenden SUM aller Werte im Puffer. Jedes Mal, wenn eine neue Probe kommt, subtrahieren Sie den ältesten Wert im Puffer von SUM, ersetzen Sie ihn durch das neue Sample, fügen Sie das neue SUM zu SUM hinzu und geben Sie SUM / N aus. Modifizierter IIR-Ringpuffer: Halten Sie einen laufenden SUM der letzten N-Werte. Jedes Mal, wenn ein neues Sample eingeht, SUM - SUM / N, fügen Sie das neue Sample hinzu und geben SUM / N aus. Antwort # 1 am: August 28, 2008, um 13:45 Uhr Wenn Sie 399m lesen Sie Recht, you39re beschreiben einen First-Order IIR-Filter der Wert you39re Subtraktion isn39t der älteste Wert, der herausfällt, sondern ist stattdessen der Durchschnitt der vorherigen Werte. Erstklassige IIR-Filter können sicherlich nützlich sein, aber I39m nicht sicher, was du meinst, wenn Sie vorschlagen, dass der Ausgang ist der gleiche für alle periodischen Signale. Bei einer Abtastrate von 10 kHz liefert das Einspeisen einer 100 Hz-Rechteckwelle in ein 20-stufiges Kastenfilter ein Signal, das für 20 Abtastungen gleichmäßig ansteigt, für 30 sitzt, für 20 Abtastungen gleichmäßig sinkt und für 30 sitzt. Ein erster Ordnung IIR-Filter. Ndash Supercat Aug 28 13 bei 15:31 wird eine Welle, die scharf anfängt zu steigen und allmählich Niveaus in der Nähe (aber nicht auf) das Eingabe-Maximum, dann scharf beginnt zu fallen und schrittweise Niveaus in der Nähe (aber nicht auf) der Eingabe Minimum. Sehr unterschiedliches Verhalten. Ndash Supercat Ein Problem ist, dass ein einfacher gleitender Durchschnitt kann oder auch nicht nützlich sein. Mit einem IIR-Filter können Sie einen schönen Filter mit relativ wenigen Calcs erhalten. Die FIR Sie beschreiben kann Ihnen nur ein Rechteck in der Zeit - ein sinc in freq - und Sie können nicht die Seitenkeulen zu verwalten. Es kann lohnt sich, in ein paar ganzzahlige Multiplikatoren zu werfen, um es eine schöne symmetrische abstimmbare FIR, wenn Sie die Zeitschaltuhren ersparen können. Ndash ScottSeidman: Keine Notwendigkeit für Multiplikatoren, wenn man einfach jede Stufe der FIR entweder den Durchschnitt der Eingabe auf diese Stufe und ihre vorherigen gespeicherten Wert, und dann speichern Sie die Eingabe (wenn man hat Der numerische Bereich, man könnte die Summe anstatt den Durchschnitt verwenden). Ob das besser ist als ein Box-Filter, hängt von der Anwendung ab (die Sprungantwort eines Boxfilters mit einer Gesamtverzögerung von 1ms wird zum Beispiel eine böse d2 / dt-Spitze aufweisen, wenn der Eingang geändert wird, und wieder 1ms später, wird aber haben Die minimal mögliche d / dt für einen Filter mit einer Gesamtverzögerung von 1ms). Ndash supercat Wie mikeselectricstuff sagte, wenn Sie wirklich brauchen, um Ihren Speicherbedarf zu reduzieren, und Sie dont dagegen Ihre Impulsantwort ist eine exponentielle (anstelle eines rechteckigen Puls), würde ich für einen exponentiellen gleitenden durchschnittlichen Filter gehen . Ich nutze sie ausgiebig. Mit dieser Art von Filter, brauchen Sie nicht jeden Puffer. Sie brauchen nicht zu speichern N Vergangenheit Proben. Nur einer. So werden Ihre Speicheranforderungen um einen Faktor von N reduziert. Auch brauchen Sie keine Division für das. Nur Multiplikationen. Wenn Sie Zugriff auf Gleitpunktarithmetik haben, verwenden Sie Fließkomma-Multiplikationen. Andernfalls können ganzzahlige Multiplikationen und Verschiebungen nach rechts erfolgen. Allerdings sind wir im Jahr 2012, und ich würde Ihnen empfehlen, Compiler (und MCUs), mit denen Sie mit Gleitkommazahlen arbeiten können. Abgesehen davon, dass mehr Speicher effizienter und schneller (Sie dont haben, um Elemente in jedem kreisförmigen Puffer zu aktualisieren), würde ich sagen, es ist auch natürlich. Weil eine exponentielle Impulsantwort besser auf die Art und Weise reagiert, wie sich die Natur verhält, in den meisten Fällen. Ein Problem mit dem IIR-Filter fast berührt von Olin und Supercat, aber anscheinend von anderen ignoriert ist, dass die Rundung nach unten führt einige Ungenauigkeiten (und möglicherweise Bias / Trunkierung). Unter der Annahme, dass N eine Potenz von zwei ist und nur ganzzahlige Arithmetik verwendet wird, beseitigt das Shift-Recht systematisch die LSBs des neuen Samples. Das bedeutet, dass, wie lange die Serie jemals sein könnte, wird der Durchschnitt nie berücksichtigen. Nehmen wir z. B. eine langsam abnehmende Reihe (8,8,8,8,7,7,7,7,6,6) an und nehmen an, daß der Durchschnitt tatsächlich 8 ist. Die Faust 7 Probe bringt den Durchschnitt auf 7, unabhängig von der Filterstärke. Nur für eine Probe. Gleiche Geschichte für 6, usw. Jetzt denke an das Gegenteil. Die serie geht auf. Der Durchschnitt bleibt auf 7 für immer, bis die Probe groß genug ist, um es zu ändern. Natürlich können Sie für die Bias korrigieren, indem Sie 1 / 2N / 2, aber das nicht wirklich lösen, die Präzision Problem. In diesem Fall wird die abnehmende Reihe für immer bei 8 bleiben, bis die Probe 8-1 / 2 (N / 2) ist. Für N4 zum Beispiel, wird jede Probe über Null halten den Durchschnitt unverändert. Ich glaube, eine Lösung für das implizieren würde, um einen Akkumulator der verlorenen LSBs halten. Aber ich habe es nicht weit genug, um Code bereit, und Im nicht sicher, es würde nicht schaden, die IIR Macht in einigen anderen Fällen der Serie (zum Beispiel, ob 7,9,7,9 würde durchschnittlich 8 dann). Olin, Ihre zweistufige Kaskade würde auch eine Erklärung brauchen. Halten Sie zwei durchschnittliche Werte mit dem Ergebnis der ersten in die zweite in jeder Iteration eingezogen halten. Was ist der Vorteil dieser Moving Averages - Einfache und Exponential Moving Averages - Einfache und Exponential Einführung Die gleitenden Mittelwerte glatt die Preisdaten zu einem Trend folgend Indikator zu bilden. Sie prognostizieren nicht die Kursrichtung, sondern definieren die aktuelle Richtung mit einer Verzögerung. Moving Averages Lag, weil sie auf vergangenen Preisen basieren. Trotz dieser Verzögerung, gleitende Durchschnitte helfen, glatte Preis-Aktion und Filter aus dem Lärm. Sie bilden auch die Bausteine ​​für viele andere technische Indikatoren und Overlays, wie Bollinger Bands. MACD und dem McClellan-Oszillator. Die beiden beliebtesten Arten von gleitenden Durchschnitten sind die Simple Moving Average (SMA) und die Exponential Moving Average (EMA). Diese Bewegungsdurchschnitte können verwendet werden, um die Richtung des Trends zu identifizieren oder potentielle Unterstützungs - und Widerstandswerte zu definieren. Here039s ein Diagramm mit einem SMA und einem EMA auf ihm: Einfache gleitende durchschnittliche Berechnung Ein einfacher gleitender Durchschnitt wird gebildet, indem man den durchschnittlichen Preis eines Wertpapiers über einer bestimmten Anzahl von Perioden berechnet. Die meisten gleitenden Mittelwerte basieren auf den Schlusskursen. Ein 5-tägiger einfacher gleitender Durchschnitt ist die fünftägige Summe der Schlusskurse geteilt durch fünf. Wie der Name schon sagt, ist ein gleitender Durchschnitt ein Durchschnitt, der sich bewegt. Alte Daten werden gelöscht, wenn neue Daten verfügbar sind. Dies bewirkt, dass sich der Durchschnitt entlang der Zeitskala bewegt. Unten ist ein Beispiel für einen 5-tägigen gleitenden Durchschnitt, der sich über drei Tage entwickelt. Der erste Tag des gleitenden Durchschnitts deckt nur die letzten fünf Tage ab. Der zweite Tag des gleitenden Mittelwerts fällt den ersten Datenpunkt (11) und fügt den neuen Datenpunkt (16) hinzu. Der dritte Tag des gleitenden Durchschnitts setzt sich fort, indem der erste Datenpunkt (12) abfällt und der neue Datenpunkt (17) addiert wird. Im obigen Beispiel steigen die Preise allmählich von 11 auf 17 über insgesamt sieben Tage. Beachten Sie, dass der gleitende Durchschnitt auch von 13 auf 15 über einen dreitägigen Berechnungszeitraum steigt. Beachten Sie auch, dass jeder gleitende Durchschnittswert knapp unter dem letzten Kurs liegt. Zum Beispiel ist der gleitende Durchschnitt für Tag eins gleich 13 und der letzte Preis ist 15. Preise der vorherigen vier Tage waren niedriger und dies führt dazu, dass der gleitende Durchschnitt zu verzögern. Exponentielle gleitende Durchschnittsberechnung Exponentielle gleitende Mittelwerte reduzieren die Verzögerung, indem mehr Gewicht auf die jüngsten Preise angewendet wird. Die Gewichtung des jüngsten Preises hängt von der Anzahl der Perioden im gleitenden Durchschnitt ab. Es gibt drei Schritte, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Berechnen Sie zunächst den einfachen gleitenden Durchschnitt. Ein exponentieller gleitender Durchschnitt (EMA) muss irgendwo anfangen, so dass ein einfacher gleitender Durchschnitt als die vorherige Periode039s EMA in der ersten Berechnung verwendet wird. Zweitens, berechnen Sie die Gewichtung Multiplikator. Drittens berechnen Sie den exponentiellen gleitenden Durchschnitt. Die folgende Formel ist für eine 10-tägige EMA. Ein 10-Perioden-exponentieller gleitender Durchschnitt wendet eine 18,18 Gewichtung auf den jüngsten Preis an. Eine 10-Perioden-EMA kann auch als 18.18 EMA bezeichnet werden. Ein 20-Perioden-EMA wendet einen 9,52 - Wiegen auf den jüngsten Preis an (2 / (201) .0952). Beachten Sie, dass die Gewichtung für den kürzeren Zeitraum mehr ist als die Gewichtung für den längeren Zeitraum. In der Tat, die Gewichtung sinkt um die Hälfte jedes Mal, wenn die gleitende durchschnittliche Periode verdoppelt. Wenn Sie uns einen bestimmten Prozentsatz für eine EMA zuweisen möchten, können Sie diese Formel verwenden, um sie in Zeiträume zu konvertieren, und geben Sie dann diesen Wert als den EMA039s-Parameter ein: Nachstehend ist ein Kalkulationstabellenbeispiel für einen 10-tägigen einfachen gleitenden Durchschnitt und ein 10- Tag exponentiellen gleitenden Durchschnitt für Intel. Einfache gleitende Durchschnitte sind geradlinig und erfordern wenig Erklärung. Der 10-Tage-Durchschnitt bewegt sich einfach, sobald neue Preise verfügbar sind und alte Preise fallen. Der exponentielle gleitende Durchschnitt beginnt mit dem einfachen gleitenden Mittelwert (22.22) bei der ersten Berechnung. Nach der ersten Berechnung übernimmt die Normalformel. Da eine EMA mit einem einfachen gleitenden Durchschnitt beginnt, wird ihr wahrer Wert erst nach 20 oder späteren Perioden realisiert. Mit anderen Worten, der Wert auf der Excel-Tabelle kann sich aufgrund des kurzen Rückblicks von dem Diagrammwert unterscheiden. Diese Kalkulationstabelle geht nur zurück 30 Perioden, was bedeutet, dass der Einfluss der einfachen gleitenden Durchschnitt hatte 20 Perioden zu zerstreuen. StockCharts geht mindestens 250 Perioden (typischerweise viel weiter) für seine Berechnungen zurück, so dass die Effekte des einfachen gleitenden Durchschnitts in der ersten Berechnung vollständig abgebaut sind. Der Lagfaktor Je länger der gleitende Durchschnitt ist, desto stärker ist die Verzögerung. Ein 10-Tage-exponentieller gleitender Durchschnitt wird die Preise sehr eng umringen und sich kurz nach dem Kursumschlag wenden. Kurze gleitende Durchschnitte sind wie Schnellboote - flink und schnell zu ändern. Im Gegensatz dazu enthält ein 100-Tage gleitender Durchschnitt viele vergangene Daten, die ihn verlangsamen. Längere gleitende Durchschnitte sind wie Ozeantanker - lethargisch und langsam zu ändern. Es dauert eine größere und längere Kursbewegung für einen 100-Tage gleitenden Durchschnitt, um Kurs zu ändern. Die Grafik oben zeigt die SampP 500 ETF mit einer 10-tägigen EMA eng ansprechender Preise und einem 100-tägigen SMA-Schleifen höher. Selbst mit dem Januar-Februar-Rückgang hielt die 100-tägige SMA den Kurs und kehrte nicht zurück. Die 50-Tage-SMA passt irgendwo zwischen den 10 und 100 Tage gleitenden Durchschnitten, wenn es um den Verzögerungsfaktor kommt. Simple vs Exponential Moving Averages Obwohl es klare Unterschiede zwischen einfachen gleitenden Durchschnitten und exponentiellen gleitenden Durchschnitten, ist eine nicht unbedingt besser als die anderen. Exponentielle gleitende Mittelwerte haben weniger Verzögerungen und sind daher empfindlicher gegenüber den jüngsten Preisen - und den jüngsten Preisveränderungen. Exponentielle gleitende Mittelwerte drehen sich vor einfachen gleitenden Durchschnitten. Einfache gleitende Durchschnitte stellen dagegen einen wahren Durchschnittspreis für den gesamten Zeitraum dar. Als solches können einfache gleitende Mittel besser geeignet sein, um Unterstützungs - oder Widerstandsniveaus zu identifizieren. Die gleitende Durchschnittspräferenz hängt von den Zielen, dem analytischen Stil und dem Zeithorizont ab. Chartisten sollten mit beiden Arten von gleitenden Durchschnitten sowie verschiedene Zeitrahmen zu experimentieren, um die beste Passform zu finden. Die nachstehende Grafik zeigt IBM mit der 50-Tage-SMA in Rot und der 50-Tage-EMA in Grün. Beide gipfelten Ende Januar, aber der Rückgang in der EMA war schärfer als der Rückgang der SMA. Die EMA erschien Mitte Februar, aber die SMA setzte weiter unten bis Ende März. Beachten Sie, dass die SMA über einen Monat nach der EMA. Längen und Zeitrahmen Die Länge des gleitenden Mittelwerts hängt von den analytischen Zielen ab. Kurze gleitende Durchschnitte (5-20 Perioden) eignen sich am besten für kurzfristige Trends und den Handel. Chartisten, die sich für mittelfristige Trends interessieren, würden sich für längere bewegte Durchschnitte entscheiden, die 20-60 Perioden verlängern könnten. Langfristige Anleger bevorzugen gleitende Durchschnitte mit 100 oder mehr Perioden. Einige gleitende durchschnittliche Längen sind beliebter als andere. Die 200-Tage gleitenden Durchschnitt ist vielleicht die beliebteste. Wegen ihrer Länge ist dies eindeutig ein langfristiger gleitender Durchschnitt. Als nächstes ist der 50-Tage gleitende Durchschnitt für den mittelfristigen Trend ziemlich populär. Viele Chartisten nutzen die 50-Tage-und 200-Tage gleitende Durchschnitte zusammen. Kurzfristig war ein 10 Tage gleitender Durchschnitt in der Vergangenheit ziemlich populär, weil er leicht zu berechnen war. Man hat einfach die Zahlen addiert und den Dezimalpunkt verschoben. Trendidentifikation Die gleichen Signale können mit einfachen oder exponentiellen gleitenden Mittelwerten erzeugt werden. Wie oben erwähnt, hängt die Präferenz von jedem Individuum ab. Die folgenden Beispiele werden sowohl einfache als auch exponentielle gleitende Mittelwerte verwenden. Der Begriff gleitender Durchschnitt gilt für einfache und exponentielle gleitende Mittelwerte. Die Richtung des gleitenden Durchschnitts vermittelt wichtige Informationen über die Preise. Ein steigender Durchschnitt zeigt, dass die Preise im Allgemeinen steigen. Ein sinkender Durchschnittswert zeigt an, dass die Preise im Durchschnitt sinken. Ein steigender langfristiger gleitender Durchschnitt spiegelt einen langfristigen Aufwärtstrend wider. Ein sinkender langfristiger gleitender Durchschnitt spiegelt einen langfristigen Abwärtstrend wider. Das Diagramm oben zeigt 3M (MMM) mit einem 150-Tage-exponentiellen gleitenden Durchschnitt. Dieses Beispiel zeigt, wie gut bewegte Durchschnitte arbeiten, wenn der Trend stark ist. Die 150-Tage-EMA sank im November 2007 und wieder im Januar 2008. Beachten Sie, dass es einen Rückgang von 15 nahm, um die Richtung dieses gleitenden Durchschnitts umzukehren. Diese nachlaufenden Indikatoren identifizieren Trendumkehrungen, wie sie auftreten (am besten) oder nach deren Eintritt (im schlimmsten Fall). MMM setzte unten in März 2009 und dann stieg 40-50. Beachten Sie, dass die 150-Tage-EMA nicht auftauchte, bis nach diesem Anstieg. Sobald es aber tat, setzte MMM die folgenden 12 Monate höher fort. Moving-Durchschnitte arbeiten brillant in starken Trends. Doppelte Frequenzweichen Zwei gleitende Mittelwerte können zusammen verwendet werden, um Frequenzweiche zu erzeugen. In der technischen Analyse der Finanzmärkte. John Murphy nennt dies die doppelte Crossover-Methode. Doppelte Crossover beinhalten einen relativ kurzen gleitenden Durchschnitt und einen relativ langen gleitenden Durchschnitt. Wie bei allen gleitenden Durchschnitten definiert die allgemeine Länge des gleitenden Durchschnitts den Zeitrahmen für das System. Ein System, das eine 5-Tage-EMA und eine 35-Tage-EMA verwendet, wäre kurzfristig. Ein System, das eine 50-tägige SMA - und 200-Tage-SMA verwendet, wäre mittelfristig, vielleicht sogar langfristig. Eine bullische Überkreuzung tritt auf, wenn der kürzere gleitende Durchschnitt über dem längeren gleitenden Durchschnitt kreuzt. Dies wird auch als goldenes Kreuz bezeichnet. Eine bärische Überkreuzung tritt ein, wenn der kürzere gleitende Durchschnitt unter dem längeren gleitenden Durchschnitt liegt. Dies wird als ein totes Kreuz bekannt. Gleitende Mittelübergänge erzeugen relativ späte Signale. Schließlich setzt das System zwei hintere Indikatoren ein. Je länger die gleitenden Durchschnittsperioden, desto größer die Verzögerung in den Signalen. Diese Signale funktionieren gut, wenn eine gute Tendenz gilt. Allerdings wird ein gleitender Durchschnitt Crossover-System produzieren viele whipsaws in Abwesenheit einer starken Tendenz. Es gibt auch eine Dreifach-Crossover-Methode, die drei gleitende Durchschnitte beinhaltet. Wieder wird ein Signal erzeugt, wenn der kürzeste gleitende Durchschnitt die beiden längeren Mittelwerte durchläuft. Ein einfaches Triple-Crossover-System könnte 5-Tage-, 10-Tage - und 20-Tage-Bewegungsdurchschnitte beinhalten. Das Diagramm oben zeigt Home Depot (HD) mit einer 10-tägigen EMA (grüne gepunktete Linie) und 50-Tage-EMA (rote Linie). Die schwarze Linie ist die tägliche Schließung. Mit einem gleitenden Durchschnitt Crossover hätte dazu geführt, dass drei Peitschen vor dem Fang eines guten Handels. Die 10-tägige EMA brach unterhalb der 50-Tage-EMA Ende Oktober (1), aber dies dauerte nicht lange, wie die 10-Tage zog zurück oben Mitte November (2). Dieses Kreuz dauerte länger, aber die nächste bärige Crossover im Januar (3) ereignete sich gegen Ende November Preisniveaus, was zu einer weiteren Peitsche führte. Dieses bärische Kreuz dauerte nicht lange, als die 10-Tage-EMA über die 50-Tage ein paar Tage später zurückging (4). Nach drei schlechten Signalen, schien das vierte Signal eine starke Bewegung als die Aktie vorrückte über 20. Es gibt zwei Takeaways hier. Erstens, Crossovers sind anfällig für whipsaw. Ein Preis oder Zeitfilter kann angewendet werden, um zu helfen, whipsaws zu verhindern. Händler könnten verlangen, dass die Crossover 3 Tage dauern, bevor sie handeln oder verlangen, dass die 10-Tage-EMA zu bewegen, über / unterhalb der 50-Tage-EMA um einen bestimmten Betrag vor handeln. Zweitens kann MACD verwendet werden, um diese Frequenzweichen zu identifizieren und zu quantifizieren. MACD (10,50,1) zeigt eine Linie, die die Differenz zwischen den beiden exponentiellen gleitenden Mittelwerten darstellt. MACD wird positiv während eines goldenen Kreuzes und negativ während eines toten Kreuzes. Der Prozentsatz-Oszillator (PPO) kann auf die gleiche Weise verwendet werden, um Prozentunterschiede anzuzeigen. Beachten Sie, dass MACD und das PPO auf exponentiellen gleitenden Durchschnitten basieren und nicht mit einfachen gleitenden Durchschnitten zusammenpassen. Diese Grafik zeigt Oracle (ORCL) mit dem 50-Tage EMA, 200-Tage EMA und MACD (50.200,1). Es gab vier gleitende durchschnittliche Kreuzungen über einen Zeitraum von 2 1/2 Jahren. Die ersten drei führten zu Peitschen oder schlechten Trades. Ein anhaltender Trend begann mit der vierten Crossover als ORCL bis Mitte der 20er Jahre. Erneut bewegen sich die durchschnittlichen Crossover-Effekte groß, wenn der Trend stark ist, erzeugen aber Verluste in Abwesenheit eines Trends. Preis-Crossover Moving-Durchschnitte können auch verwendet werden, um Signale mit einfachen Preis-Crossover zu generieren. Ein bullisches Signal wird erzeugt, wenn die Preise über dem gleitenden Durchschnitt liegen. Ein bäres Signal wird erzeugt, wenn die Preise unter dem gleitenden Durchschnitt liegen. Preis-Crossover können kombiniert werden, um innerhalb der größeren Trend Handel. Der längere gleitende Durchschnitt setzt den Ton für den größeren Trend und der kürzere gleitende Durchschnitt wird verwendet, um die Signale zu erzeugen. Man würde bullish Preiskreuze nur dann suchen, wenn die Preise schon über dem längeren gleitenden Durchschnitt liegen. Dies würde den Handel im Einklang mit dem größeren Trend. Wenn zum Beispiel der Kurs über dem gleitenden 200-Tage-Durchschnitt liegt, würden sich die Chartisten nur auf Signale konzentrieren, wenn der Kurs über dem 50-Tage-Gleitender Durchschnitt liegt. Offensichtlich würde ein Schritt unterhalb der 50-Tage gleitenden Durchschnitt ein solches Signal vorausgehen, aber solche bearish Kreuze würden ignoriert, weil der größere Trend ist. Ein bearish Kreuz würde einfach vorschlagen, ein Pullback in einem größeren Aufwärtstrend. Ein Cross-Back über dem 50-Tage-Gleitender Durchschnitt würde einen Preisanstieg und eine Fortsetzung des größeren Aufwärtstrends signalisieren. Die nächste Tabelle zeigt Emerson Electric (EMR) mit dem 50-Tage EMA und 200-Tage EMA. Die Aktie bewegte sich über und hielt über dem 200-Tage gleitenden Durchschnitt im August. Es gab Dips unterhalb der 50-Tage-EMA Anfang November und wieder Anfang Februar. Die Preise schnell zurück über die 50-Tage-EMA zu bullish Signale (grüne Pfeile) in Harmonie mit dem größeren Aufwärtstrend. Im Indikatorfenster wird MACD (1,50,1) angezeigt, um Preiskreuze über oder unter dem 50-Tage-EMA zu bestätigen. Die 1-tägige EMA entspricht dem Schlusskurs. MACD (1,50,1) ist positiv, wenn das Schließen oberhalb der 50-Tage-EMA und negativ ist, wenn das Schließen unterhalb der 50-Tage-EMA liegt. Unterstützung und Widerstand Der Gleitende Durchschnitt kann auch als Unterstützung in einem Aufwärtstrend und Widerstand in einem Abwärtstrend dienen. Ein kurzfristiger Aufwärtstrend könnte Unterstützung nahe dem 20-tägigen einfachen gleitenden Durchschnitt finden, der auch in Bollinger-Bändern verwendet wird. Ein langfristiger Aufwärtstrend könnte Unterstützung nahe dem 200-tägigen einfachen gleitenden Durchschnitt finden, der der populärste langfristige bewegliche Durchschnitt ist. Wenn Tatsache, die 200-Tage gleitenden Durchschnitt bieten kann Unterstützung oder Widerstand, nur weil es so weit verbreitet ist. Es ist fast wie eine sich selbst erfüllende Prophezeiung. Die Grafik oben zeigt die NY Composite mit dem 200-Tage einfachen gleitenden Durchschnitt von Mitte 2004 bis Ende 2008. Die 200-Tage-Support zur Verfügung gestellt, mehrmals während des Vorhabens. Sobald der Trend mit einem Doppel-Top-Support-Pause umgekehrt, der 200-Tage gleitenden Durchschnitt als Widerstand um 9500 gehandelt. Erwarten Sie nicht genaue Unterstützung und Widerstand Ebenen von gleitenden Durchschnitten, vor allem längeren gleitenden Durchschnitten. Märkte werden durch Emotionen gefahren, wodurch sie anfällig für Überschreitungen sind. Statt genauer Ebenen können gleitende Mittelwerte verwendet werden, um Unterstützungs - oder Widerstandszonen zu identifizieren. Schlussfolgerungen Die Vorteile der Verwendung von bewegten Durchschnitten müssen gegen die Nachteile gewogen werden. Moving-Durchschnitte sind Trend nach, oder nacheilende, Indikatoren, die immer einen Schritt hinter sich. Dies ist nicht unbedingt eine schlechte Sache. Immerhin ist der Trend ist dein Freund und es ist am besten, in die Richtung des Trends Handel. Die gleitenden Durchschnitte gewährleisten, dass ein Händler dem aktuellen Trend entspricht. Auch wenn der Trend ist dein Freund, verbringen die Wertpapiere viel Zeit in Handelsspannen, die gleitende Durchschnitte ineffektiv machen. Einmal in einem Trend, bewegte Durchschnitte halten Sie in, sondern geben auch späte Signale. Don039t erwarten, an der Spitze zu verkaufen und kaufen Sie am unteren Rand mit gleitenden Durchschnitten. Wie bei den meisten technischen Analysetools sollten die gleitenden Mittelwerte nicht allein verwendet werden, sondern in Verbindung mit anderen komplementären Tools. Chartisten können gleitende Durchschnitte verwenden, um den Gesamttrend zu definieren und dann RSI zu verwenden, um überkaufte oder überverkaufte Niveaus zu definieren. Hinzufügen von Bewegungsdurchschnitten zu StockCharts Diagrammen Gleitende Durchschnitte sind als Preisüberlagerungsfunktion auf der SharpCharts-Workbench verfügbar. Mit dem Dropdown-Menü Overlays können Benutzer entweder einen einfachen gleitenden Durchschnitt oder einen exponentiellen gleitenden Durchschnitt auswählen. Der erste Parameter wird verwendet, um die Anzahl der Zeitperioden einzustellen. Ein optionaler Parameter kann hinzugefügt werden, um festzulegen, welches Preisfeld in den Berechnungen verwendet werden soll - O für die Open, H für High, L für Low und C für Close. Ein Komma wird verwendet, um Parameter zu trennen. Ein weiterer optionaler Parameter kann hinzugefügt werden, um die gleitenden Mittelwerte nach links (vorbei) oder nach rechts (zukünftig) zu verschieben. Eine negative Zahl (-10) würde den gleitenden Durchschnitt auf die linken 10 Perioden verschieben. Eine positive Zahl (10) würde den gleitenden Durchschnitt auf die rechten 10 Perioden verschieben. Mehrere gleitende Durchschnitte können dem Preisplot überlagert werden, indem einfach eine weitere Überlagerungslinie zur Werkbank hinzugefügt wird. StockCharts-Mitglieder können die Farben und den Stil ändern, um zwischen mehreren gleitenden Durchschnitten zu unterscheiden. Nachdem Sie eine Anzeige ausgewählt haben, öffnen Sie die erweiterten Optionen, indem Sie auf das kleine grüne Dreieck klicken. Erweiterte Optionen können auch verwendet werden, um eine gleitende mittlere Überlagerung zu anderen technischen Indikatoren wie RSI, CCI und Volumen hinzuzufügen. Klicken Sie hier für ein Live-Diagramm mit mehreren verschiedenen gleitenden Durchschnitten. Verwenden von Moving Averages mit StockCharts-Scans Hier finden Sie einige Beispielscans, die die StockCharts-Mitglieder verwenden können, um verschiedene gleitende durchschnittliche Situationen zu scannen: Bullish Moving Average Cross: Diese Scans suchen nach Aktien mit einem steigenden 150-Tage-Durchschnitt und einem bullish Kreuz der 5 Tag EMA und 35-Tage EMA. Der 150-Tage gleitende Durchschnitt steigt, solange er über seinem Niveau vor fünf Tagen handelt. Ein bullish Kreuz tritt auf, wenn die 5-Tage-EMA bewegt sich über dem 35-Tage-EMA auf überdurchschnittlichen Volumen. Bearish Moving Average Cross: Diese Scans sucht nach Aktien mit einem fallenden 150-Tage einfachen gleitenden Durchschnitt und einem bärischen Kreuz der 5-Tage EMA und 35-Tage EMA. Der 150-Tage gleitende Durchschnitt fällt, solange er unter seinem Niveau vor fünf Tagen handelt. Ein bäriges Kreuz tritt auf, wenn die 5-Tage-EMA unterhalb der 35-Tage-EMA auf überdurchschnittlichem Volumen bewegt. Weitere Studie John Murphy039s Buch hat ein Kapitel gewidmet gleitende Durchschnitte und ihre verschiedenen Verwendungen. Murphy deckt die Vor-und Nachteile der gleitenden Durchschnitte. Darüber hinaus zeigt Murphy, wie bewegte Durchschnitte mit Bollinger Bands und kanalbasierten Handelssystemen funktionieren. Technische Analyse der Finanzmärkte John MurphyAgent / Einfacher gleitender Durchschnitt Durchschnittswerte / Einfacher gleitender Durchschnitt Sie werden aufgefordert, diese Aufgabe entsprechend der Aufgabenbeschreibung zu lösen, indem Sie eine beliebige Sprache verwenden, die Sie kennen. Berechnen der einfachen gleitenden Durchschnitt einer Reihe von Zahlen. Erstellen Sie eine Stateful-Funktion / Klasse / Instanz, die einen Punkt dauert und gibt eine Routine zurück, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zurückgibt. Ein einfacher gleitender Durchschnitt ist ein Verfahren zum Berechnen eines Durchschnitts eines Stroms von Zahlen durch nur Mittelung der letzten 160 P 160-Nummern aus dem Strom 160, wobei 160 P 160 als Periode bekannt ist. Sie kann implementiert werden, indem eine Initialisierungsroutine mit 160 P 160 als Argument 160 I (P) 160 aufgerufen wird, die dann eine Routine zurückgeben sollte, die, wenn sie mit einzelnen aufeinanderfolgenden Elementen eines Stroms von Zahlen aufgerufen wird, den Mittelwert von (up To), die letzten 160 P 160 von ihnen, rufen Sie diese 160 SMA (). Das Wort 160 stateful 160 in der Aufgabenbeschreibung bezieht sich auf die Notwendigkeit für 160 SMA () 160, sich an bestimmte Informationen zwischen Anrufen zu erinnern: 160 Der Zeitraum 160 P 160 Ein geordneter Container von mindestens den letzten 160 P 160 Nummern von jedem von Seine individuellen Anrufe. Stateful 160 bedeutet auch, dass sukzessive Aufrufe von 160 I (), 160 der Initialisierer, 160 separate Routinen zurückgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhängigen Datenströmen verwendet werden können. Pseudocode für eine Implementierung von 160 SMA 160 ist: Diese Version verwendet eine persistente Warteschlange, um die letzten p Werte zu halten. Jede vom init-moving-average zurückgegebene Funktion hat ihren Zustand in einem Atom, das einen Queue-Wert enthält. Diese Implementierung verwendet eine zirkuläre Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert hält, der sich gerade aus dem Fenster bewegt und durch den gerade addierten Wert ersetzt wird. Verwenden eines Closure-Edit derzeit Diese sma kann nicht nogc, weil es eine Schließung auf dem Heap zugeordnet. Einige Escape-Analyse konnte die Heap-Zuweisung entfernen. Verwenden einer Strukturbearbeitung Diese Version vermeidet die Heapzuweisung des Verschlusses, der die Daten im Stapelrahmen der Hauptfunktion hält. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Näherungen aufeinandertreiben und wachsen, kann der Code eine periodische Summe auf dem gesamten kreisförmigen Warteschlangen-Array ausführen. Diese Implementierung erzeugt zwei (Funktions-) Objekte, die den Zustand teilen. Es ist idiomatisch in E, die Eingabe von der Ausgabe (Lesen von Schreiben) zu trennen, anstatt sie zu einem Objekt zu kombinieren. Die Struktur ist die gleiche wie die Implementierung von Standard DeviationE. Das Elixierprogramm unten erzeugt eine anonyme Funktion mit einer eingebetteten Periode p, die als Periode des einfachen gleitenden Durchschnitts verwendet wird. Die run-Funktion liest die numerische Eingabe und übergibt sie an die neu erstellte anonyme Funktion und prüft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage für jeden gleitenden Durchschnitt bildet. Erlang hat Verschlüsse, aber unveränderliche Variablen. Eine Lösung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte für eine gegebene Reihenfolge von Elementen zu berechnen. Es ist weniger effizient Schleife wie in den folgenden Befehlen. Fordert kontinuierlich einen Eingang I auf. Die dem Ende einer Liste L1 hinzugefügt wird. L1 kann durch Drücken von 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS gefunden werden. Drücken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zurückgibt Programm, das bei jedem Aufruf einen einfachen Wert zurückgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zurück: Beispiel 2: Verwenden des Programms movinav2 (i , 5) - Initialisieren der gleitenden Durchschnittsberechnung und Definieren des Zeitraums von 5 movinav2 (3, x): x - neue Daten in der Liste (Wert 3), und das Ergebnis wird auf der Variablen x gespeichert und movinav2 (4, : X - neue Daten (Wert 4), und das neue Ergebnis wird auf Variable x gespeichert und angezeigt (43) / 2. Beschreibung der Funktion movinavg: Variable r - ist das Ergebnis (die gemittelte Liste), die zurückgegeben wird Variable i - ist die Index-Variable, und es zeigt auf das Ende der Unterliste die Liste gemittelt wird. Variable z - eine Helpervariable Die Funktion nutzt die Variable i, um zu bestimmen, welche Werte der Liste bei der nächsten Durchschnittsberechnung berücksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also müssen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise müssen p Elemente berücksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewöhnlich negativ sein, so daß die folgende Gleichung negative Indexe vermeiden wird: max (i-p1,1) oder die Anordnung der Gleichung max (i-p, 0) 1. Die Anzahl der Elemente auf den ersten Iterationen ist ebenfalls kleiner, der korrekte Wert (Endindex - Anfangsindex 1) oder die Anordnung der Gleichung (i - (max (ip, 0) 1) 1) , (I-max (ip, 0)). Die Variable z enthält den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) .) Wird summe sie sum (.) / (Iz) ri wird sie durchschnittlich und speichern Sie das Ergebnis an der entsprechenden Stelle in der Ergebnisliste Verwenden Sie eine Schließung und die Schaffung einer Funktion Ich weiß, dies ist erreichbar mit Boost wie: Aber ich möchte wirklich Um Boost zu vermeiden. Ich habe gegoogelt und keine geeigneten oder lesbaren Beispiele gefunden. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahlstroms mit den letzten 1000 Zahlen als Datenprobe verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array meine Bedürfnisse am besten geeignet. Wenn Ihre Bedürfnisse sind einfach, können Sie nur versuchen, mit einem exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie eine Akkumulator-Variable, und wie Ihr Code sieht auf jede Probe, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer gegebenen Probe nur für etwa 1000 Proben dauert. Hmm, Im nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass Ive es hier. Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Im nicht sicher, gibt es ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung. Aber, wenn Sie einen kleineren Durchschnitt wünschen, wie 30 Zahlen oder so, dieses ist eine sehr einfache und schnelle Weise, es zu tun. Beantwortet Jun 12 12 at 4:44 1 auf Ihrem Beitrag. Der exponentielle gleitende Durchschnitt kann zulassen, dass das Alpha variabel ist. Somit kann dies dazu verwendet werden, Zeitbasisdurchschnitte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde beträgt, lassen Sie Alpha 1.0 sein. Andernfalls können Sie Alpha zulassen (usecs seit letztem Update / 1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahls mit den neuesten 1000 Zahlen als Datenbeispiel zu verfolgen. Beachten Sie, dass im Folgenden die Summe als Elemente ergänzt / ersetzt wird, wodurch kostspielige O (N) - Transversionen vermieden werden, um die Summe zu berechnen, die für den durchschnittlichen Bedarf benötigt wird. Insgesamt wird ein anderer Parameter von T gebildet, um z. B. Mit einer langen langen, wenn insgesamt 1000 lange s, eine int für char s, oder eine doppelte bis total float s. Dies ist ein wenig fehlerhaft, dass Nennsignale an INTMAX vorbeiziehen könnten - wenn Sie darauf achten, dass Sie ein langes langes nicht signiertes verwenden konnten. Oder verwenden Sie ein zusätzliches Bool-Datenelement, um aufzuzeichnen, wenn der Container zuerst gefüllt wird, während numsamples rund um das Array (am besten dann umbenannt etwas harmlos wie pos). Man nehme an, daß der quadratische Operator (T-Abtastwert) tatsächlich quadratischer Operator (T-Abtastwert) ist. Ndash oPless Jun 8 14 um 11:52 Uhr oPless ahhh. Gut beobachtet. Eigentlich meinte ich, dass es sich um void operator () (T sample) handelt, aber natürlich könntet ihr auch irgendeine Notation verwenden, die ihr mochtet. Wird beheben, danke. Ndash Tony D Jun 14 14 am 14:27


No comments:

Post a Comment