Gleitender Mittelfilter Pic




Gleitender Mittelfilter PicWie andere schon erwahnt haben, sollten Sie einen IIR (Endlosimpulsantwort) - Filter anstelle des FIR (Finite Impulse Response) Filter, den Sie jetzt verwenden. Es gibt mehr dazu, aber auf den ersten Blick werden FIR-Filter als explizite Windungen und IIR-Filter mit Gleichungen implementiert. Das besondere IIR-Filter, das ich viel in Mikrocontrollern verwende, ist ein einpoliges Tiefpa?filter. Dies ist das digitale Aquivalent eines einfachen R-C-Analogfilters. Fur die meisten Anwendungen haben diese bessere Eigenschaften als der Kastenfilter, 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 dampfen, 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 Stuck persistenten Zustand. Dies ist die einzige persistente Variable, die Sie benotigen, 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 fur FF 0 der Filter unendlich schwer ist, da sich der Ausgang nie andert. Fur FF 1 ist das eigentlich gar kein Filter, da der Ausgang nur dem Eingang folgt. Nutzliche Werte sind dazwischen. Bei kleinen Systemen wahlen 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 benotigt dieses Filter nur eine Subtraktion und eine Addition, obwohl die Zahlen in der Regel gro?er als der Eingangswert sein mussen (mehr uber die numerische Genauigkeit in einem separaten Abschnitt weiter unten). Ich normalerweise nehmen A / D-Messwerte deutlich schneller als sie benotigt werden und wenden Sie zwei dieser Filter kaskadiert. Dies ist das digitale Aquivalent von zwei R-C-Filtern in Serie und dampft um 12 dB / Oktave uber der Rolloff-Frequenz. Fur A / D-Messungen ist es jedoch gewohnlich relevanter, den Filter im Zeitbereich zu betrachten, indem er seine Sprungantwort betrachtet. Dies zeigt Ihnen, wie schnell Ihr System eine Anderung sehen wird, wenn die Sache, die Sie messen, andert. 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 fur jede FF in der kaskadierten Filterreihe fest und berechnen die Schrittantwort und andere Werte. Eigentlich habe ich in der Regel laufen diese uber mein Wrapper-Skript PLOTFILT. Dies fuhrt 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 niederschlagt, falls sich der Eingang sofort andert. Wenn Sie ca. 95 Einschwingzeit kummern, dann mussen Sie etwa 73 Iterationen warten, und fur 50 Einschwingzeit nur 26 Iterationen. Die grune Kurve zeigt Ihnen den Ausgang einer einzelnen Amplitude. Dies gibt Ihnen eine Vorstellung von der zufalligen Rauschunterdruckung. Es sieht aus wie keine einzelne Probe wird mehr als eine 2,5 Anderung in der Ausgabe verursachen. Die blaue Spur soll ein subjektives Gefuhl 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 fur diesen Durchlauf von PLOTFILT ausgewahlt wurden. Seine nur, um Ihnen ein grobes Gefuhl, wie viel es gequetscht werden und wie glatt es ist. PLOTFILT, vielleicht FILTBITS, und viele andere nutzliche Dinge, vor allem fur PIC-Firmware-Entwicklung ist verfugbar in der PIC Development Tools-Software-Release auf meiner Software-Downloads-Seite. Hinzugefugt uber numerische Genauigkeit Ich sehe aus den Kommentaren und nun eine neue Antwort, dass es Interesse an der Diskussion der Anzahl der Bits benotigt, um diesen Filter zu implementieren. Beachten Sie, dass das Multiplizieren mit FF Log 2 (FF) neue Bits unterhalb des Binarpunkts erzeugt. Bei kleinen Systemen wird FF gewohnlich mit 1/2 N gewahlt, so da? diese Multiplikation tatsachlich durch eine Rechtsverschiebung von N Bits realisiert wird. FILT ist daher meist eine feste Ganzzahl. Beachten Sie, dass dies andert keine der Mathematik aus der Prozessoren Sicht. Wenn Sie beispielsweise 10-Bit-A / D-Messwerte und N 4 (FF 1/16) filtern, benotigen 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 konnen 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 Durchfuhren 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 mussen Sie jedem Filterpole N Bits hinzufugen, wenn Sie aufgrund der numerischen Darstellung kein Rauschen hinzufugen mochten. Im obigen Beispiel musste 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 wurde den gro?eren Wert benotigen, aber fur Firmware Einfachheit ich in der Regel die gleiche Darstellung, und damit der gleiche Code, fur alle Pole eines Filters. Normalerweise schreibe ich eine Unterroutine oder Makro, um eine Filterpol-Operation durchzufuhren, dann gelten, dass fur jeden Pol. Ob eine Unterroutine oder ein Makro davon abhangt, 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 ladt, 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 nachsten. 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 benotigen Sie nicht einen Zeiger, da Sie in der Adresse passieren, um auf jeder Iteration zu arbeiten. Code-Beispiele Hier ein Beispiel fur ein Makro wie oben fur eine PIC 18 beschrieben: Und hier ist ein ahnliches Makro fur eine PIC 24 oder dsPIC 30 oder 33: Beide Beispiele werden als Makros unter Verwendung meines PIC-Assembler-Praprozessors implementiert. Die mehr fahig ist als eine der eingebauten Makroanlagen. Clabacchio: Ein weiteres Thema, das ich erwahnen sollte, ist die Firmware-Implementierung. Sie konnen eine einpolige Tiefpassfilter-Subroutine einmal schreiben und dann mehrmals anwenden. Tatsachlich schreibe ich normalerweise solch ein Unterprogramm, um einen Zeiger im Gedachtnis 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 fur 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 Zahlerwerte berechnen und sie vergleichen muss, um Anderungen in einem bestimmten Bereich zu erkennen. Da diese Werte von sehr unterschiedlichen Dimensionen abhangig von Hardware Ich wollte einen Durchschnitt nehmen, um in der Lage sein, auf diese Hardware spezifischen Anderungen automatisch reagieren. Wenn Sie mit der Beschrankung einer Macht von zwei Anzahl von Elementen zu durchschnittlich leben konnen (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 durchgefuhrt 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 fur seinen Ringpuffer. Diese Antwort zeigt, dass die Teilung nicht schwierig ist. Zwar adressiert es nicht das Gedachtnisproblem, aber das SE-System erlaubt Teilantworten, und Benutzer konnen etwas von jeder Antwort fur selbst nehmen oder sogar redigieren und kombinieren andere39s Antworten. Da einige der anderen Antworten eine Divisionsoperation erfordern, sind sie ahnlich unvollstandig, 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 fur 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 uber einen Zeitraum, und die wichtigsten Speicher-sparende Gerat ist, dass durch Downsampling, mussen Sie nicht jeden Wert des Integrators zu speichern. Es kann mit dem folgenden Pseudocode implementiert werden: Ihre effektive gleitende durchschnittliche Lange ist decimationFactorstatesize, aber Sie mussen nur um Stateize Proben zu halten. Offensichtlich konnen 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 erwagen, einfache IIR-Filter vor einem gleitenden durchschnittlichen Filter. Wenn Sie die Frequenz-Nullen eines Boxcar-Filters nicht benotigen, wird ein 1-poliger oder 2-poliger Tiefpassfilter wahrscheinlich gut funktionieren. Auf der anderen Seite, wenn Sie fur die Zwecke der Dezimierung filtern (mit einer hohen Sample-Rate-Eingang und Mittelung es fur 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 (Enthalt viele schone Bilder.) Die Gleichung fur diese IIR-Filter ist: Dies kann mit nur Ganzzahlen und keine Division mit dem folgenden Code implementiert werden (moglicherweise benotigen 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. Fuhren Sie dies im vorherigen Code durch die Definition von BITS auf LOG2 (K), dh fur K 16 gesetzt BITS auf 4, fur K 4 gesetzt BITS auf 2, etc. (Ill Uberprufung der Code hier aufgelistet, sobald ich eine Anderung und Bearbeiten Sie diese Antwort, wenn notig.) 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 uber die Filterfunktion hinaus, mit Ausnahme des ubergebenen newInput Hinweis: Dies ist ein einstufiger Filter. Mehrere Stufen konnen zusammen kaskadiert werden, um die Scharfe des Filters zu erhohen. Wenn Sie mehr als eine Stufe verwenden, mussen Sie DecayFactor anpassen (was die Cutoff-Frequenz betrifft), um sie zu kompensieren. Und naturlich alles, was Sie brauchen, ist die beiden Zeilen uberall 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 mussen, konnen 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 Nahe von 1. Single-precision Schwimmer sind gut genug fur die meisten Dinge, ich bevorzuge nur Doppel. Wenn Sie mit ganzen Zahlen bleiben mussen, konnen Sie DecayFactor und Amplitude Factor in Fractional Integers umwandeln, in denen der Zahler als Integer gespeichert wird und der Nenner eine Ganzzahl von 2 ist (so konnen Sie Bit-Shift nach rechts als die Nenner, anstatt sich wahrend der Filterschleife teilen zu mussen). Zum Beispiel, wenn DecayFactor 0.99, und Sie Ganzzahlen verwenden mochten, konnen Sie DecayFactor 0.99 65536 64881. Und dann immer wenn Sie multiplizieren mit DecayFactor in Ihrer Filterschleife, nur verschieben Sie das Ergebnis 16. Fur weitere Informationen uber dieses, ein ausgezeichnetes Buch thats Online, Kapitel 19 auf rekursive Filter: www. dspguide / ch19.htm PS Fur das Moving Average-Paradigma, einen anderen Ansatz fur die Einstellung DecayFactor und AmplitudeFactor, die moglicherweise mehr relevant fur Ihre Bedurfnisse, konnen Sie sagen, Sie wollen die vorherigen, etwa 6 Artikeln gemittelt, diskret tun es, fugen Sie 6 Elemente und teilen durch 6, so Konnen Sie den AmplitudeFactor auf 1/6 und DecayFactor auf (1.0 - AmplitudeFactor) einstellen. Antwortete May 14 12 at 22:55 Jeder andere hat kommentiert grundlich uber 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 altesten Wert im Puffer von SUM, ersetzen Sie ihn durch das neue Sample, fugen 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, fugen 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 alteste Wert, der herausfallt, sondern ist stattdessen der Durchschnitt der vorherigen Werte. Erstklassige IIR-Filter konnen sicherlich nutzlich sein, aber I39m nicht sicher, was du meinst, wenn Sie vorschlagen, dass der Ausgang ist der gleiche fur alle periodischen Signale. Bei einer Abtastrate von 10 kHz liefert das Einspeisen einer 100 Hz-Rechteckwelle in ein 20-stufiges Kastenfilter ein Signal, das fur 20 Abtastungen gleichma?ig ansteigt, fur 30 sitzt, fur 20 Abtastungen gleichma?ig sinkt und fur 30 sitzt. Ein erster Ordnung IIR-Filter. Ndash Supercat Aug 28 13 bei 15:31 wird eine Welle, die scharf anfangt zu steigen und allmahlich Niveaus in der Nahe (aber nicht auf) das Eingabe-Maximum, dann scharf beginnt zu fallen und schrittweise Niveaus in der Nahe (aber nicht auf) der Eingabe Minimum. Sehr unterschiedliches Verhalten. Ndash Supercat Ein Problem ist, dass ein einfacher gleitender Durchschnitt kann oder auch nicht nutzlich sein. Mit einem IIR-Filter konnen Sie einen schonen Filter mit relativ wenigen Calcs erhalten. Die FIR Sie beschreiben kann Ihnen nur ein Rechteck in der Zeit - ein sinc in freq - und Sie konnen nicht die Seitenkeulen zu verwalten. Es kann lohnt sich, in ein paar ganzzahlige Multiplikatoren zu werfen, um es eine schone symmetrische abstimmbare FIR, wenn Sie die Zeitschaltuhren ersparen konnen. Ndash ScottSeidman: Keine Notwendigkeit fur 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 konnte die Summe anstatt den Durchschnitt verwenden). Ob das besser ist als ein Box-Filter, hangt von der Anwendung ab (die Sprungantwort eines Boxfilters mit einer Gesamtverzogerung von 1ms wird zum Beispiel eine bose d2 / dt-Spitze aufweisen, wenn der Eingang geandert wird, und wieder 1ms spater, wird aber haben Die minimal mogliche d / dt fur einen Filter mit einer Gesamtverzogerung 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), wurde ich fur 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 fur das. Nur Multiplikationen. Wenn Sie Zugriff auf Gleitpunktarithmetik haben, verwenden Sie Flie?komma-Multiplikationen. Andernfalls konnen ganzzahlige Multiplikationen und Verschiebungen nach rechts erfolgen. Allerdings sind wir im Jahr 2012, und ich wurde Ihnen empfehlen, Compiler (und MCUs), mit denen Sie mit Gleitkommazahlen arbeiten konnen. Abgesehen davon, dass mehr Speicher effizienter und schneller (Sie dont haben, um Elemente in jedem kreisformigen Puffer zu aktualisieren), wurde ich sagen, es ist auch naturlich. Weil eine exponentielle Impulsantwort besser auf die Art und Weise reagiert, wie sich die Natur verhalt, in den meisten Fallen. Ein Problem mit dem IIR-Filter fast beruhrt von Olin und Supercat, aber anscheinend von anderen ignoriert ist, dass die Rundung nach unten fuhrt einige Ungenauigkeiten (und moglicherweise 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 konnte, wird der Durchschnitt nie berucksichtigen. 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 tatsachlich 8 ist. Die Faust 7 Probe bringt den Durchschnitt auf 7, unabhangig von der Filterstarke. Nur fur eine Probe. Gleiche Geschichte fur 6, usw. Jetzt denke an das Gegenteil. Die serie geht auf. Der Durchschnitt bleibt auf 7 fur immer, bis die Probe gro? genug ist, um es zu andern. Naturlich konnen Sie fur die Bias korrigieren, indem Sie 1 / 2N / 2, aber das nicht wirklich losen, die Prazision Problem. In diesem Fall wird die abnehmende Reihe fur immer bei 8 bleiben, bis die Probe 8-1 / 2 (N / 2) ist. Fur N4 zum Beispiel, wird jede Probe uber Null halten den Durchschnitt unverandert. Ich glaube, eine Losung fur das implizieren wurde, um einen Akkumulator der verlorenen LSBs halten. Aber ich habe es nicht weit genug, um Code bereit, und Im nicht sicher, es wurde nicht schaden, die IIR Macht in einigen anderen Fallen der Serie (zum Beispiel, ob 7,9,7,9 wurde durchschnittlich 8 dann). Olin, Ihre zweistufige Kaskade wurde auch eine Erklarung brauchen. Halten Sie zwei durchschnittliche Werte mit dem Ergebnis der ersten in die zweite in jeder Iteration eingezogen halten. Was ist der Vorteil dieser Mittelwerte / Einfacher gleitender Durchschnitt Durchschnittswerte / Einfacher gleitender Durchschnitt Sie werden angeregt, diese Aufgabe entsprechend der Aufgabenbeschreibung zu losen, wobei jede beliebige Sprache 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 zuruck, die eine Zahl als Argument annimmt und einen einfachen gleitenden Durchschnitt ihrer Argumente zuruckgibt. 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 zuruckgeben 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 fur 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 zuruckgeben sollten, die 160 nicht den gespeicherten Zustand teilen, so dass sie auf zwei unabhangigen Datenstromen verwendet werden konnen. Pseudocode fur 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 zuruckgegebene Funktion hat ihren Zustand in einem Atom, das einen Queue-Wert enthalt. Diese Implementierung verwendet eine zirkulare Liste, um die Zahlen in dem Fenster am Anfang jedes Iterationszeigers zu speichern, bezieht sich auf die Listenzelle, die den Wert halt, 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 halt. Gleiche Ausgabe: Um zu vermeiden, dass die Gleitkomma-Naherungen aufeinandertreiben und wachsen, kann der Code eine periodische Summe auf dem gesamten kreisformigen Warteschlangen-Array ausfuhren. 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 ubergibt sie an die neu erstellte anonyme Funktion und pruft dann das Ergebnis auf STDOUT. Die Ausgabe ist unten gezeigt, mit dem Durchschnitt, gefolgt von der gruppierten Eingabe, die die Grundlage fur jeden gleitenden Durchschnitt bildet. Erlang hat Verschlusse, aber unveranderliche Variablen. Eine Losung besteht dann darin, Prozesse und eine einfache Message passing based API zu verwenden. Matrixsprachen haben Routinen, um die Gleitabschnitte fur 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 hinzugefugt wird. L1 kann durch Drucken von 2ND / 1 gefunden werden, und Mittelwert kann in Liste / OPS gefunden werden. Drucken Sie ON, um das Programm zu beenden. Funktion, die eine Liste mit den gemittelten Daten des bereitgestellten Arguments zuruckgibt Programm, das bei jedem Aufruf einen einfachen Wert zuruckgibt: list ist die gemittelte Liste: p ist die Periode: 5 gibt die gemittelte Liste zuruck: 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 zuruckgegeben 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 nachsten Durchschnittsberechnung berucksichtigt werden. Bei jeder Iteration zeigt die Variable i auf den letzten Wert in der Liste, der in der Durchschnittsberechnung verwendet wird. Also mussen wir nur herausfinden, welcher der erste Wert in der Liste sein wird. Normalerweise mussen p Elemente berucksichtigt werden, also wird das erste Element dasjenige sein, das durch (i-p1) indexiert wird. Jedoch wird bei den ersten Iterationen die Berechnung gewohnlich 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 enthalt den gemeinsamen Wert (max (ip), 0), so dass der Anfangsindex (z1) ist und die Anzahl der Elemente (iz) mid (Liste, z1, iz) .) Wird addieren Summe (.) / (Iz) ri wird sie durchschnittlich und speichern das Ergebnis an der entsprechenden Stelle in der Ergebnisliste Verwenden eines Schlie?ens und Erstellen einer FunktionDie Wissenschaftler und Ingenieure Leitfaden fur digitale Signalverarbeitung Von Steven W. Smith, Ph. D. Kapitel 28: Digitale Signalprozessoren Digitale Signalprozessoren dienen zur schnellen Durchfuhrung von FIR-Filtern und ahnlichen Techniken. Um die Hardware zu verstehen. Mussen wir zuerst die Algorithmen verstehen. In diesem Abschnitt werden wir eine detaillierte Liste der Schritte fur die Umsetzung eines FIR-Filter. Im nachsten Abschnitt werden wir sehen, wie DSPs entworfen sind, um diese Schritte so effizient wie moglich durchzufuhren. Um zu starten, mussen wir zwischen der Offline-Verarbeitung und der Echtzeit-Verarbeitung unterscheiden. Bei der Offline-Verarbeitung befindet sich das gesamte Eingangssignal gleichzeitig im Computer. Zum Beispiel konnte ein Geophysiker ein Seismometer verwenden, um die Erdbewegung wahrend eines Erdbebens aufzuzeichnen. Nachdem das Schutteln beendet ist, konnen die Informationen in einen Computer gelesen und in irgendeiner Weise analysiert werden. Ein weiteres Beispiel fur die Offline-Verarbeitung ist die medizinische Bildgebung, wie Computertomographie und MRT. Der Datensatz wird erfasst, wahrend sich der Patient innerhalb der Maschine befindet, aber die Bildrekonstruktion kann bis zu einem spateren Zeitpunkt verzogert werden. Wesentlich ist, dass alle Informationen gleichzeitig dem Verarbeitungsprogramm zur Verfugung stehen. Dies ist haufig in der wissenschaftlichen Forschung und Technik, aber nicht in Konsumgutern. Off-line-Verarbeitung ist das Reich der personlichen Computer und mainframes. Bei der Echtzeitverarbeitung wird das Ausgangssignal zu dem Zeitpunkt erzeugt, zu dem das Eingangssignal akquiriert wird. Dies wird zum Beispiel in der Telefonkommunikation, Horgeraten und Radar benotigt. Diese Anwendungen mussen die Informationen sofort verfugbar, obwohl es um einen kurzen Betrag verzogert werden kann. Beispielsweise kann eine Verzogerung von 10 Millisekunden in einem Telefonanruf nicht vom Lautsprecher oder Horer erkannt werden. Ebenso macht es keinen Unterschied, ob ein Radarsignal um wenige Sekunden verzogert wird, bevor es dem Bediener angezeigt wird. Real-time-Anwendungen Eingabe einer Stichprobe, fuhren Sie den Algorithmus, und geben Sie eine Probe, over-and-over. Alternativ konnen sie eine Gruppe von Abtastwerten eingeben, den Algorithmus ausfuhren und eine Gruppe von Abtastwerten ausgeben. Dies ist die Welt der digitalen Signalprozessoren. Nun blicken wir auf Abb. 28-2 und stellen Sie sich vor, dass dies ein FIR-Filter ist, der in Echtzeit implementiert wird. Um das Ausgangssample zu berechnen, mussen wir Zugriff auf eine bestimmte Anzahl der letzten Samples vom Eingang haben. Angenommen, wir verwenden in diesem Filter acht Koeffizienten, eine 0. A 1. Hellip ein 7. Das hei?t, wir mussen den Wert der acht letzten Samples aus dem Eingangssignal x n, x n -1, hellip x n -7 kennen. Diese acht Samples mussen im Speicher abgelegt und kontinuierlich aktualisiert werden, wenn neue Samples gewonnen werden. Was ist der beste Weg, um diese gespeicherten Proben zu verwalten Die Antwort ist kreisformige Pufferung. Fig. 28-3 zeigt einen kreisformigen Puffer mit acht Proben. Wir haben diesen Kreispuffer in acht aufeinanderfolgenden Speicherplatzen, 20041 bis 20048, platziert. Abbildung (a) zeigt, wie die acht Samples aus dem Eingang zu einem bestimmten Zeitpunkt gespeichert werden konnen, wahrend (b) die Anderungen nach dem nachsten Sample angezeigt werden erworben. Die Idee der Zirkularpufferung besteht darin, dass das Ende dieses linearen Arrays mit seinem Anfangsspeicherort 20041 verbunden ist, wird als neben 20048 betrachtet, ebenso wie 20044 neben 20045. Sie behalten das Array mit einem Zeiger (eine Variable, deren Wert ist eine Adresse), die angibt, wo sich die letzte Probe befindet. Zum Beispiel enthalt der Zeiger in (a) die Adresse 20044, wahrend er in (b) 20045 enthalt. Wenn ein neuer Sample erfasst wird, ersetzt er den altesten Sample im Array und der Zeiger wird um eine Adresse weiter geschoben. Kreispuffer sind effizient, da nur ein Wert geandert werden muss, wenn ein neues Sample erfasst wird. Es werden vier Parameter benotigt, um einen kreisformigen Puffer zu verwalten. Zunachst muss es einen Zeiger geben, der den Anfang des Zirkularpuffers im Speicher angibt (in diesem Beispiel 20041). Zweitens muss ein Zeiger sein, der das Ende des Arrays angibt (z. B. 20048) oder eine Variable, die seine Lange (z. B. 8) halt. Drittens muss die Schrittgro?e der Speicheradressierung angegeben werden. In Fig. 28-3 ist die Schrittgro?e eins. Zum Beispiel: Adresse 20043 enthalt ein Beispiel, Adresse 20044 enthalt das nachste Beispiel, und so weiter. Dies ist oft nicht der Fall. Beispielsweise kann sich die Adressierung auf Bytes beziehen, und jeder Abtastwert kann zwei oder vier Bytes benotigen, um seinen Wert zu halten. In diesen Fallen musste die Schrittweite zwei oder vier betragen. Diese drei Werte definieren die Gro?e und die Konfiguration des kreisformigen Puffers und werden sich wahrend des Programmbetriebs nicht andern. Der vierte Wert, der Zeiger auf das aktuellste Sample, muss beim Erfassen jedes neuen Samples modifiziert werden. Mit anderen Worten muss es eine Programmlogik geben, die steuert, wie dieser vierte Wert basierend auf dem Wert der ersten drei Werte aktualisiert wird. Wahrend diese Logik ganz einfach ist, muss sie sehr schnell sein. Dies ist der ganze Punkt dieser Diskussion DSPs sollten bei der Verwaltung von kreisformigen Puffern optimiert werden, um die hochstmogliche Ausfuhrungsgeschwindigkeit zu erzielen. Nebenbei ist die kreisformige Pufferung auch fur die Offline-Verarbeitung von Nutzen. Betrachten wir ein Programm, bei dem sowohl das Eingangssignal als auch das Ausgangssignal vollstandig im Speicher enthalten sind. Zirkularpufferung wird nicht fur eine Faltungsberechnung benotigt, da auf jede Probe sofort zugegriffen werden kann. Viele Algorithmen werden jedoch stufenweise implementiert. Wobei zwischen jeder Stufe ein Zwischensignal erzeugt wird. Zum Beispiel arbeitet ein rekursiver Filter, der als eine Reihe von Biquaden ausgefuhrt wird, auf diese Weise. Das Brute-Force-Verfahren ist es, die gesamte Lange jedes Zwischensignals im Speicher zu speichern. Zirkularpufferung bietet eine weitere Option: Nur die Zwischenproben, die fur die Berechnung benotigt werden, speichern. Dies verringert die erforderliche Menge an Speicher, auf Kosten eines komplizierteren Algorithmus. Die wichtige Idee ist, dass kreisformige Puffer fur die Offline-Verarbeitung nutzlich sind, aber fur Echtzeitanwendungen kritisch sind. Nun konnen wir die Schritte betrachten, die erforderlich sind, um ein FIR-Filter unter Verwendung von kreisformigen Puffern sowohl fur das Eingangssignal als auch fur die Koeffizienten zu implementieren. Diese Liste mag trivial und uberexamiert sein. Die effiziente Handhabung dieser einzelnen Aufgaben ist es, was einen DSP von einem herkommlichen Mikroprozessor trennt. Fur jedes neue Sample mussen alle folgenden Schritte durchgefuhrt werden: Das Ziel ist, diese Schritte schnell auszufuhren. Da die Schritte 6-12 viele Male wiederholt werden (einmal fur jeden Koeffizienten im Filter), mussen diese Operationen besonders beachtet werden. Traditionelle Mikroprozessoren mussen in der Regel diese 14 Schritte seriell (eine nach der anderen), wahrend DSPs sind entworfen, um sie parallel durchzufuhren. In einigen Fallen konnen alle Operationen innerhalb der Schleife (Schritte 6-12) in einem einzigen Taktzyklus abgeschlossen werden. Schauen Sie sich die interne Architektur an, die diese gro?artige Leistung ermoglicht. FIR Filter-Grundlagen 1.1 Was sind FIR-Filterquot-FIR-Filter sind einer von zwei Primartypen von digitalen Filtern, die in Anwendungen der digitalen Signalverarbeitung (DSP) verwendet werden, wobei der andere Typ IIR ist. 1.2 Was bedeutet "FIRquot" bedeutet "FIRquot" bedeutet "FInite Impulse Responsequot". Wenn Sie einen Impuls, das hei?t, ein einziges quadratisches Beispiel, gefolgt von vielen quot0quot Proben, setzen, werden Nullen herauskommen, nachdem das quot1quot Beispiel seinen Weg durch die Verzogerungslinie des Filters gemacht hat. 1.3 Warum ist die Impulsantwort quotfinitequot Im allgemeinen Fall ist die Impulsantwort endlich, da es keine Ruckmeldung in der FIR gibt. Ein Mangel an Feedback garantiert, dass die Impulsantwort endlich ist. Daher ist der Begriff "endliche Impulsantwort" annahernd gleichbedeutend mit einer Quotno-Ruckmeldung. Wenn jedoch die Ruckkopplung verwendet wird, ist die Impulsantwort endlich, der Filter ist jedoch immer noch ein FIR. Ein Beispiel ist das gleitende Mittelfilter, bei dem jedes Mal, wenn eine neue Probe eintritt, subtrahiert (ruckgekoppelt) wird. Dieser Filter hat eine endliche Impulsantwort, obwohl er Ruckkopplung verwendet: nach N Abtastungen eines Impulses die Ausgabe Wird immer Null sein. 1.4 Wie kann ich etwas aussprechen? Einige Leute sagen, die Buchstaben F-I-R andere Leute auszusprechen, als ware es eine Art von Baum. Wir bevorzugen den Baum. (Der Unterschied besteht darin, ob man von einem F-I-R-Filter oder einem FIR-Filter spricht.) 1.5 Was ist die Alternative zu FIR-Filtern DSP-Filter konnen auch "Infinite Impulse Responsequot (IIR)" sein. (Siehe dspGurus IIR FAQ.) IIR-Filter verwenden Feedback, so dass bei der Eingabe eines Impulses die Ausgabe theoretisch unendlich klingelt. 1.6 Wie FIR-Filter mit IIR-Filtern vergleichen Jedes hat Vor - und Nachteile. Insgesamt aber uberwiegen die Vorteile von FIR-Filtern die Nachteile, so dass sie viel mehr als IIRs verwendet werden. 1.6.1 Was sind die Vorteile von FIR-Filtern (im Vergleich zu IIR-Filtern) Im Vergleich zu den IIR-Filtern bieten FIR-Filter folgende Vorteile: Sie lassen sich leicht als quasi-lineare Phasequot (und in der Regel) realisieren. Einfach ausgedruckt, verzogern lineare Phasenfilter das Eingangssignal, aber donrsquot verzerrt seine Phase. Sie sind einfach zu implementieren. Bei den meisten DSP-Mikroprozessoren kann die FIR-Berechnung durch Schleifen einer einzigen Anweisung durchgefuhrt werden. Sie eignen sich fur Mehrpreisanwendungen. Mit Multi-Rate bedeuten wir entweder einen Dekrementquot (Reduzierung der Abtastrate), eine Interpolation (Erhohung der Abtastrate) oder beides. Ob Dezimierung oder Interpolation, die Verwendung von FIR-Filtern erlaubt es, einige der Berechnungen wegzulassen, wodurch eine wichtige Recheneffizienz geschaffen wird. Im Gegensatz dazu, wenn IIR-Filter verwendet werden, muss jeder Ausgang individuell berechnet werden, auch wenn dieser Ausgang verworfen wird (so dass die Ruckkopplung wird in den Filter integriert werden). Sie haben gewunschte numerische Eigenschaften. In der Praxis mussen alle DSP-Filter mit Hilfe einer Finite-Precision-Arithmetik, dh einer begrenzten Anzahl von Bits, implementiert werden. Die Verwendung von Finite-Precision-Arithmetik in IIR-Filtern kann aufgrund des Feedbacks erhebliche Probleme verursachen, aber FIR-Filter ohne Ruckkopplung konnen gewohnlich mit weniger Bits implementiert werden, und der Konstrukteur hat weniger praktische Probleme, die mit der nicht idealen Arithmetik zusammenhangen. Sie konnen mit Hilfe von fractional arithmetic implementiert werden. Im Gegensatz zu IIR-Filtern ist es immer moglich, ein FIR-Filter unter Verwendung von Koeffizienten mit einer Gr?e von weniger als 1,0 einzusetzen. (Die Gesamtverstarkung des FIR-Filters kann bei Bedarf an seinem Ausgang eingestellt werden.) Dies ist ein wichtiger Aspekt bei der Verwendung von Festpunkt-DSPs, da sie die Implementierung viel einfacher macht. 1.6.2 Was sind die Nachteile von FIR-Filtern (im Vergleich zu IIR-Filtern) Im Vergleich zu IIR-Filtern haben FIR-Filter manchmal den Nachteil, dass sie mehr Speicher und / oder Berechnung benotigen, um eine gegebene Filtercharakteristik zu erreichen. Auch sind bestimmte Reaktionen mit FIR-Filtern nicht praktikabel. 1.7 Welche Begriffe werden bei der Beschreibung von FIR-Filtern verwendet? Impulsantwort - Der Impulsantwortfaktor eines FIR-Filters ist eigentlich nur der Satz von FIR-Koeffizienten. (Wenn Sie ein quotimplusequot in einen FIR-Filter setzen, der aus einem quotierten Quot-Sample besteht, gefolgt von vielen quot0quot-Samples, ist das Ausgangssignal des Filters die Menge der Koeffizienten, wenn sich die 1 Sample nacheinander um jeden Koeffizienten bewegt, um die Ausgabe zu bilden. Tippen - Ein FIR quottapquot ist einfach ein Koeffizient / Verzogerungspaar. Die Anzahl der FIR-Anzapfungen (oft als "Anfasser" bezeichnet) ist ein Hinweis auf 1) die zur Implementierung des Filters erforderliche Speicherkapazitat, 2) die Anzahl der erforderlichen Berechnungen und 3) die Menge des Filterfilters, Multiply-Accumulate (MAC) - In einem FIR-Kontext ist ein MACquot der Vorgang des Multiplizierens eines Koeffizienten mit dem entsprechenden verzogerten Datenabtastwert und dem Akkumulieren des Ergebnisses. FIRs erfordern normalerweise einen MAC pro Hahn. Die meisten DSP-Mikroprozessoren implementieren die MAC-Operation in einem einzigen Befehlszyklus. Transition Band - Das Frequenzband zwischen Passband - und Stopband-Kanten. Je schmaler das Ubergangsband ist, desto mehr Taps werden benotigt, um den Filter zu implementieren. (Ein quotsmallquot-Ubergangsband fuhrt zu einem quotsharpquot-Filter.) Delay Line - Der Satz von Speicherelementen, die die quotZ-1quot-Verzogerungselemente der FIR-Berechnung implementieren. Zirkularer Puffer - Ein spezieller Puffer, der zirkular ist, weil eine Inkrementierung am Ende dazu fuhrt, dass er an den Anfang wickelt, oder weil das Dekrementieren von Anfang an bewirkt, dass es bis zum Ende umwickelt. Zirkulare Puffer werden oft von DSP-Mikroprozessoren bereitgestellt, um den Quotientenquot der Proben durch die FIR-Verzogerungsleitung zu implementieren, ohne die Daten im Speicher wortlich bewegen zu mussen. Wenn ein neues Sample zum Puffer hinzugefugt wird, ersetzt es automatisch das alteste. Guppy Moving Average. CodersGuru, diesen Thread fand ich bei ForexFactory, Guppy Moving Average eine au?erst wunderbare Aufgabe, Trends zu identifizieren. Zitat von diesem Forum Google Daryl Guppy. Nur einer der besten Handler aus Australien, die jemals ging die Erde Es gibt ein ausgezeichnetes Buch von Daryl Guppy Trend Trading, die seinen Ansatz gut erklart. Es kann festgestellt werden, ich bin nicht sehr gut versiert im Forex, so dass ich wunsche, wenn Sie konnten lesen Sie mehr uber dieses System und versuchen es zu verstehen, so dass alle von uns hier davon profitieren kann ich personlich das Gefuhl, dass die Guppy MA ist au?erst nutzlich Moreso fur einen MA Guru wie Sie. Ich hoffe wirklich, dass Sie uns auf dieser MA mehr erleuchten konnen. Im sorry wieder, wenn ich gegen Regeln versto?en, indem ich diesen Thread In den pic ist ein combinatiton von 2 Indikatoren 2) xpMA von CodersGuru In der pic posted. U sehen, dass xpMA fur die aktuelle Marktsituation ROT (Aufwartstrend) oder BLAU (Abwartstrend) zeigt. ABER. Manchmal kann der Markt auch reichen und oder abgehackt sein. Das ist, wo ich im Bild kreiste. So kommt GUPPY MMA zur Rettung. Nur offnen, wenn ALLE 7 Linien (grun und gelb) auf beiden Seiten einander kreuzen UND wenn xpMA zeigt, dass der Trend in die richtige Richtung als GUPPY MMA geht. Ich hoffe, dass ich geholfen habe. PS. Und um den Marktzustand weiter zu filtern, nutze ich auch den Nittanys Trending oder Ranging ToR Indicator, um die aktuelle Marktsituation, entweder Ranging oder Trending, weiter zu bestatigen. Mit dieser Methode habe ich die Trendbewegungen erfolgreich isoliert. Ich hoffe auch, dass einige altere Mitglieder mein System weiter verbessern konnen yusof786: Ich bin die Indikatoren anhangen, so dass andere auch davon profitieren konnen. 1) Guppy MMA (Cyrox) - Schablonenformat 2) xpMA durch Coders Guru OK, wie man diese Indikatorkombinationen benutzt, um ein trade. Place ein Handel nur zu setzen, wenn alle 3 Anzeigen zustimmen. 1. Wenn Guppy MMAs 7 gelbe und grune Linien kreuzen einander und sieht aus wie ein Mundoffnung ist. 2. Wenn XpMA Trend zeigt die gleiche wie Guppy MMAs Trend 3. Wenn Nittanys ToR zeigt, dass alle Zeitrahmen Trending sind (All Blue Arrow oder All Red Arrow zeigt sich oder seitwarts) Plz versuchen, diese Trading-Stil von mir. Ich hoffe, es kommt nutzlich, every1 drau?en. DANK FUR IHRE HARTE ARBEITEN KONNEN SIE MICH DIE EINSTELLUNGEN AUF DEM xpMA von CODER GURU ERKLAREN, WEIL ICH IHRE SCHABLONE ICH EROFFNET, DASS SIE DANKE IM VORAUS VERLETZT