Saturday 18 November 2017

Java Exponential Moving Average Algorithm


Ich habe im Wesentlichen ein Array von Werten wie folgt: Das obige Array ist oversimplified, Im sammeln 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus, den ich schrieb, um die nächste Peak vor einem Zeitpunkt zu finden verarbeiten. Meine Logik schlägt fehl, weil in meinem Beispiel oben 0.36 die wahre Spitze ist, aber mein Algorithmus würde rückwärts schauen und sehen die sehr letzte Zahl 0.25 als die Spitze, als theres eine Abnahme zu 0.24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus auf sie, die glätten sie ein wenig, so dass ich mehr lineare Werte. (Dh: Id wie meine Ergebnisse curvy, nicht jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich dies tun Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, gehe ich viel besser mit Code. Wie verarbeite ich Werte in meinem Array, die Anwendung einer exponentiellen gleitenden Durchschnittsberechnung, um sie herauszufordern, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Müssen Sie einige Zustand zu halten und Sie benötigen einen Tuning-Parameter. Dies erfordert eine kleine Klasse (vorausgesetzt, Sie verwenden Java 5 oder höher): Instantiate mit dem Decay-Parameter, die Sie wollen (kann Abstimmung sollte zwischen 0 und 1) und dann mit Average () zu filtern. Beim Lesen einer Seite auf einige mathematische Rekursion, alles, was Sie wirklich wissen müssen, wenn Sie es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Theyve einige andere Anmerkungen außerdem, die nicht helfen.) Jedoch ist die EMA ziemlich einfach, da Sie nur an einen alten Wert erinnern müssen, der keine komplizierten Zustandarrays erfordert. Beantwortet Feb 8 12 at 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn die Dinge einfach sein können (Wenn Sie mit einer neuen Sequenz beginnen, erhalten Sie einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der durchschnittlichen Sequenz wird ein bisschen durch Randeffekte springen, aber Sie erhalten die mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass Sie die gleitende durchschnittliche Logik in die Mittelung einwickeln und experimentieren können, ohne den Rest des Programms zu viel zu stören. Ndash Donal Fellows Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu beantworten. 1) Wenn Ihr Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch. Es ist falsch, weil es eine monotone Zunahme oder Abnahme (das ist immer nach oben oder immer nach unten). Wenn Sie ALLE Ihre Daten nicht klassifizieren, sind Ihre Datenpunkte - wie Sie sie darstellen - nichtlinear. Wenn Sie wirklich den maximalen Wert zwischen zwei Zeitpunkten finden wollen, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie das Maximum dieses Unterarrays. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: vorstellen, dass ich die folgende Liste haben: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glätten, indem ich den Durchschnitt von zwei Zahlen: 1.45, 1.45, 1.45, 1.5. Beachten Sie, dass die erste Zahl ist der Durchschnitt von 1,5 und 1,4 (zweite und erste Zahlen) die zweite (neue Liste) ist der Durchschnitt von 1,4 und 1,5 (dritte und zweite alte Liste) die dritte (neue Liste) der Durchschnitt von 1,5 und 1,4 (Vierte und dritte), und so weiter. Ich könnte es Zeitraum drei oder vier gemacht haben, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um zu sehen, gleitende Durchschnitte bei der Arbeit ist, gehen Sie zu Google Finance, wählen Sie eine Aktie (versuchen Tesla Motors ziemlich volatil (TSLA)) und klicken Sie auf Technische Daten am unteren Rand des Diagramms. Wählen Sie Moving Average mit einer bestimmten Periode und Exponential gleitenden Durchschnitt, um ihre Differenzen zu vergleichen. Exponentielle gleitende Durchschnitt ist nur eine weitere Ausarbeitung dieser, aber Gewichte die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten auszugleichen. Bitte lesen Sie den Wikipedia-Eintrag. Also, dies ist eher ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu klein. Viel Glück. Wenn Sie Probleme mit der Mathematik haben, könnten Sie mit einem einfachen gleitenden Durchschnitt statt exponentiell gehen. Also die Ausgabe erhalten Sie die letzten x-Terme durch x geteilt werden. Ungetestetes Pseudocode: Beachten Sie, dass Sie die Anfangs - und Endteile der Daten behandeln müssen, da deutlich, dass Sie die letzten 5 Ausdrücke nicht durchschnittlich sind, wenn Sie auf Ihrem 2. Datenpunkt sind. Außerdem gibt es effizientere Methoden, diesen gleitenden Durchschnitt (sum sum - älteste neueste) zu berechnen, aber dies ist, um das Konzept von dem, was passiert, zu bekommen. Beantwortet Feb 8 12 at 20:41 Deine Antwort 2016 Stack Exchange, IncExponential Moving Average - EMA Laden des Spielers. BREAKING DOWN Exponential Moving Average - EMA Die 12- und 26-Tage-EMAs sind die beliebtesten Kurzzeitmittelwerte und werden verwendet, um Indikatoren wie die gleitende durchschnittliche Konvergenzdivergenz (MACD) und den prozentualen Preisoszillator (PPO) zu erzeugen. Im Allgemeinen werden die 50- und 200-Tage-EMAs als Signale von langfristigen Trends verwendet. Trader, die technische Analyse verwenden finden fließende Mittelwerte sehr nützlich und aufschlussreich, wenn sie richtig angewendet werden, aber Chaos verursachen, wenn sie falsch verwendet werden oder falsch interpretiert werden. Alle gleitenden Mittelwerte, die gewöhnlich in der technischen Analyse verwendet werden, sind von Natur aus nacheilende Indikatoren. Folglich sollten die Schlussfolgerungen aus der Anwendung eines gleitenden Durchschnitts auf ein bestimmtes Marktdiagramm eine Marktbewegung bestätigen oder ihre Stärke belegen. Sehr oft, bis eine gleitende durchschnittliche Indikatorlinie eine Änderung vorgenommen hat, um eine bedeutende Bewegung auf dem Markt zu reflektieren, ist der optimale Punkt des Markteintritts bereits vergangen. Eine EMA dient dazu, dieses Dilemma zu einem gewissen Grad zu lindern. Da die EMA-Berechnung mehr Gewicht auf die neuesten Daten setzt, umgibt sie die Preisaktion etwas fester und reagiert damit schneller. Dies ist wünschenswert, wenn ein EMA verwendet wird, um ein Handelseintragungssignal abzuleiten. Interpretation der EMA Wie alle gleitenden Durchschnittsindikatoren sind sie für Trendmärkte viel besser geeignet. Wenn der Markt in einem starken und anhaltenden Aufwärtstrend ist. Zeigt die EMA-Indikatorlinie auch einen Aufwärtstrend und umgekehrt einen Abwärtstrend. Ein wachsamer Händler achtet nicht nur auf die Richtung der EMA-Linie, sondern auch auf das Verhältnis der Änderungsgeschwindigkeit von einem Balken zum nächsten. Wenn zum Beispiel die Preisaktion eines starken Aufwärtstrends beginnt, sich zu verflachen und umzukehren, wird die EMA-Rate der Änderung von einem Balken zum nächsten abnehmen, bis zu dem Zeitpunkt, zu dem die Indikatorlinie flacht und die Änderungsrate null ist. Wegen der nacheilenden Wirkung, von diesem Punkt, oder sogar ein paar Takte zuvor, sollte die Preisaktion bereits umgekehrt haben. Daraus folgt, dass die Beobachtung eines konsequenten Abschwächens der Veränderungsrate der EMA selbst als Indikator genutzt werden könnte, der das Dilemma, das durch den nacheilenden Effekt von gleitenden Durchschnittswerten verursacht wird, weiter beheben könnte. Gemeinsame Verwendung der EMA-EMAs werden häufig in Verbindung mit anderen Indikatoren verwendet, um signifikante Marktbewegungen zu bestätigen und deren Gültigkeit zu messen. Für Händler, die intraday und schnelllebigen Märkten handeln, ist die EMA mehr anwendbar. Häufig benutzen Händler EMAs, um eine Handel Bias zu bestimmen. Zum Beispiel, wenn eine EMA auf einer Tages-Chart zeigt einen starken Aufwärtstrend, eine Intraday-Trader-Strategie kann nur von der langen Seite auf einem Intraday-Diagramm handeln. C-Algorithmus für null-Latenz exponentiellen gleitenden Durchschnitt Letzte Änderung: 2012-08- 13 Ich habe versucht, eine Niederfrequenz-Cutoff in c, die im Wesentlichen nimmt einen Strom von Zahlen und glättet den Ausgang (Ausfilterung Hochfrequenz-Bewegung / Jitter), aber es ist wichtig, dass die vorderen gewichteten Zahlen werden sofort als die Daten ist die Zeit Kritisch (es ist, eine Bewegungssimulationsbasis unter Verwendung der Ausgabe von einer Spitze der Spielsoftware zu steuern). Ive bekam einen funktionierenden gewichteten gleitenden Durchschnitt Algoithm, konnte aber mit etwas ein wenig mehr reagieren an der Vorderseite zu tun, und ich fand dies: - Der Pseudo-Code gibt es wie folgt: Eingaben: Preis (NumericSeries), Period (NumericSimple) Variablen: Faktor 2 / (Periode1) Verzögerung (Periode-1) / 2 Ende sonst beginnen ZLEMA-Faktor (2Price-Pricelag) (1-Faktor) ZLEMA1 Ende Ive übersetzt Es in C und mein Code ist wie folgt: Allerdings scheint es nicht so zu verhalten, wie Id erwarten. Es scheint fast da, aber manchmal bekomme ich einen etwas niedrigeren Wert als alle Elemente in der Warteschlange (wenn sie alle höher sind). Meine Warteschlange und die Anzahl der Elemente in ihr als Parameter übergeben werden, mit der jüngsten an der Front zu allen Zeiten, auch ich passieren einen inkrementierenden Zähler beginnend bei 0, wie von der Funktion erforderlich. Ich bin nicht sicher, Ive interpretiert die Bedeutung von ZLEMA1 korrekt als seine nicht klar, in seinem Pseudocode, so dass Ive davon ausgegangen, dass die letzten Anrufe zlema und auch Im Annahme Preis tatsächlich bedeutet Price0. Vielleicht Ive erhielt dieses falsch Ich soll die wirklichen zlema berechneten Werte zurück zu meiner ursprünglichen Warteschlange vor dem folgenden Anruf kopieren Ich ändere nicht die ursprüngliche Warteschlange an allen anderen als nur, alle Werte eins bis zum Ende zu verschieben und das späteste am Anfang einzusetzen . Der Code, den ich verwenden, um dies zu tun ist: Wäre äußerst dankbar, wenn jemand mit einem besseren Verständnis der Mathematik könnte bitte Verstand überprüfen dies für mich zu sehen, ob Ive etwas etwas falsch Vielen Dank im Voraus, wenn Sie helfen können Erstens Dank allen für Ihre Eingabe, sehr geschätzt Das macht Sinn, denke ich, so nehme ich an, dann das Beste, das ich hoffen kann, ist einfach ein exponentieller gleitender Durchschnitt, akzeptiert wird es ein wenig Verzögerung, aber dies wird durch die schwerere Front Gewichtung als in typisch gewichtet gegeben minimiert werden Ich habe auch diesen Algorithmus, aber ein ähnliches Problem, dass die Werte nicht ganz richtig erscheinen (es sei denn, dies ist die Art der Formel). Zum Beispiel, sagen, mein Array enthält 16 Werte, alle 0.4775 - die Ausgabe ist 0.4983, aber Id erwarten, dass es 0.4775 Dies schaut nach rechts zu Ihnen. / Exponentieller gleitender Durchschnitt. / Float ema (float vals, int numVals, int currentSample) statischer Schwimmerfaktor 0 statischer float lastema 0 float ema if (currentSample lt 1) ema vals0 Faktor 2.0 / ((float) numVals) 1.0) sonst ema (Faktor vals0) (1.0 - Faktor) lastema) lastema ema return ema Umgekehrt ist manchmal die Ausgabe niedriger als jeder einzelne Eingang, auch wenn alle höher sind. Es wird auf die gleiche Weise wie zlema (.) Oben mit einem inkrementierenden Zähler aufgerufen. Die Formel und Pseudocode für diese sind hier: - autotradingstrategy. wordpress / 2009/11/30 / expo nential-mo ving-avera ge / Danke nochmals, Entschuldigung für mein Missverständnis einiger Grundlagen: (Viele Grüße, Chris J As Für den Code, den ich gepostet, youre Recht über die Array-Größe Situation. Das sollte leicht behoben werden. Is für Ihre Fragen: 1) Die Filter-Konstante stellt eine Frequenz cutoff. Ich habe eine digitale Signalverarbeitung (DSP) für diese Technik. De. wikipedia. org/wi ki / Low-pas sfilter ist eine einfache Erklärung. Sie möchten die Discrete-Time-Realisierung. In meinem Fall ist die A die RC-Konstante, über die sie sprechen. Die Frequenz, die sie ausschaltet, liegt also über 1 / (2piA). Wenn Sie nicht über ein Verständnis von Frequency-Domain Theorie haben, kann dies kompliziert. In Ihrem Fall, Je höher Sie A, desto niedriger die Frequenz, die dieser Filter zulassen wird, bedeutet, dass es die Kurve aus mehr und mehr glätten wird. Je niedriger Sie es machen, desto mehr Rauschen ist im System erlaubt. Denken Sie daran, dass ein Muss größer oder gleich 1 wirksam sein muss. Ich habe die XLS wieder befestigt, diesmal ohne die wechselnden rand () Zahlen. Passen Sie die A-Konstante an und beobachten Sie, wie es quotsmoothsquot (oder filtert) die hochfrequenten Variationen. 2) Der letzte Punkt des Eingabefeldes hat den letzten Wert. 3) Gleiches gilt für das Ausgabe-Array. Der letzte ist der jüngste Wert. 5) Die NUMVALS ist beliebig. Sie können kontinuierlich auf die Eingabe-und Ausgabe-Array so oft wie youd wie hinzufügen und es würde nicht den Filter. Insbesondere verwendete ich 49 Punkte. Aber ich kann leicht löschen Sie die letzten 20 und die ersten 29 Ausgänge bleiben die gleichen. Die Funktion basiert nicht darauf, wie viele Punkte verwendet werden. Ich möchte erwähnen, dass ich diese Funktion für eine einmalige Konvertierung entwickelt habe. Wenn Sie eine Umwandlung für den nächsten Wert on the fly tun wollten, konnten Sie etwas einfacheres versuchen (wie angebracht). Wieder Im rostig auf c. Ich hoffe, das ist richtig. Das einzige, was Sie benötigen, um zu liefern ist die Eingangs - und Filterkonstante. Lassen Sie mich wissen, wenn dies hilft.

No comments:

Post a Comment