Monday 20 November 2017

Exponential Moving Average Code In Java


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. Antwort # 2 am: Mai 23, 2010, 07:10:25 pm »Ihre Methode 2016 Stack Exchange, IncJava Gleitender Durchschnitt Methode Wenn Sie für eine EMA, die für Streaming-Daten optimiert ist, aus einer Datei oder Quoting-Service, die folgende Beispielklasse wird Ihnen gut, wie zu suchen Gegen die Verwendung von Brute-Force-Berechnungen. Dieser Ansatz ist besonders nützlich, wenn Sie Daten in Echtzeit verarbeiten. EMAs, ein Sonderfall gewichteter gleitender Durchschnitte, haben den Vorteil, dass die relative Gewichtung für jede aufeinanderfolgende Periode um einen konstanten Faktor f 2 / (N1) abnimmt, wobei N die Anzahl der Perioden ist, über die die EMA angewendet werden soll. Die folgende Beispielklasse implementiert diesen iterativen Charakter von EMA und minimiert die Berechnungserfordernisse gegenüber Brute-Eman-1-f Eman-1 Die folgende Beispielklasse implementiert den aktuellen EMA (dh für den aktuellen Zeitraum) unter Verwendung der folgenden iterativen Formel: Kraft-Methoden oder Nachbearbeitungsverfahren. Privates int numPeriods 0 privates int totalPeriods 0 privates double runningEMA 0.0 privates doppeltes Faktor 0.0 public EMA (int numPeriods) this. numPeriods numPeriods Faktor 2.0 / (numPeriods 1.0) / Reset Berechnungen zu generieren EMA für den angegebenen Zeitraum. / Public void reset (int numPeriods) / Gibt EMA für den Zeitraum zurück, der während des Konstruktors definiert wird. Wenn verarbeitete Perioden kleiner als der EMA-Bereich sind, wird Null zurückgegeben. / Public double berechnen (doppelter Preis) runningEMA factorprice (1-Faktor) runningEMA if (totalPeriods lt numPeriods) Von wo aus Sie die Preisdaten ausgeben und was Sie mit den EMA-Ergebnissen tun, liegt bei Ihnen. Wenn Sie beispielsweise die Preisdaten in einem Array haben und eine EMA in ein anderes Array berechnen möchten, funktioniert das folgende Snippet: doppelte Preise. (50) // 50 Periode EMA für (int idx0 iltprices. length idx) emaidx ema (pricesidx) Viel Glück und beste Wünsche für Ihr Projekt. Exponential Moving Average (EMA) Die klassische EMA-Formel ist: Im Gegensatz zu Simple Moving Average. Wo das Gewicht aller vorherigen Balken gleich ist, macht der Exponential Moving Average die letzte Balke wichtiger. Das Gewicht jedes älteren Stabes verringert das exponentiell. Unten ist ein Gewichtsdiagramm für N 10 (1 ist der aktuelle Preis, 2 der vorherige und so weiter): Die Gewichtsformel ist, wo i eine Distanz zum letzten Balken ist. 0 bedeutet die letzte, 1 die vorherige Leiste und so weiter. First Value Die Formel bezieht sich auf den vorherigen Wert und es gibt keine Standardvereinbarung, was der erste (älteste) Wert ist. Unterschiedliche Implementierung von EMA verwendet: Der erste Preis (MT4, Marketscope) oder Der Einfache Moving Average der ersten N Preise (Stockcharts). An Stelle von einfachem gleitendem Mittelwert Der exponentielle gleitende Durchschnitt kann genau als einfacher gleitender Durchschnitt verwendet werden. Insbesondere in der Situation, in der die Inertheit von Simple Moving Average nicht ignoriert werden kann. Vergleichen Sie EMA (10) und MVA (10), die zu denselben Preisen angewendet werden: Einschränkungen Der Exponential Moving Average basiert auf allen vorherigen Werten, so dass das Indikatorergebnis für einen bestimmten Balken davon abhängt, wie viel historische Daten berücksichtigt werden. In dem Fall, in dem mehr historische Daten geladen werden, kann sich der Wert des Indikators von dem zuvor berechneten Wert unterscheiden. Indikatoren Dieser Artikel in anderen Sprachen

No comments:

Post a Comment