Wednesday, 25 October 2017

Java Exponentiell Gleitender Durchschnitt Algorithmus


Ich habe im Wesentlichen eine Reihe von Werten wie folgt: Das obige Array ist vereinfacht, Im sammeln 1 Wert pro Millisekunde in meinem realen Code und ich muss die Ausgabe auf einem Algorithmus verarbeiten, den ich schrieb, um den nächstgelegenen Peak vor einem Zeitpunkt zu finden. Meine Logik scheitert, weil in meinem Beispiel oben, 0.36 ist die reale Spitze, aber mein Algorithmus würde nach hinten schauen und sehen die letzte Zahl 0,25 als die Spitze, als theres eine Abnahme auf 0,24 vor ihm. Das Ziel ist, diese Werte zu nehmen und einen Algorithmus an sie anzuwenden, der sie ein bisschen glättet, so dass ich mehr lineare Werte habe. (Dh: Id wie meine Ergebnisse zu curvy, nicht Jaggedy) Ive wurde gesagt, um einen exponentiellen gleitenden durchschnittlichen Filter auf meine Werte anzuwenden. Wie kann ich das tun? Es ist wirklich schwer für mich, mathematische Gleichungen zu lesen, ich mache viel besser mit Code. Wie verarbeite ich Werte in meinem Array, indem du eine exponentielle gleitende durchschnittliche Berechnung anwende, um sie herauszufordern, um den 8. Februar 12 um 20:27 zu bitten, um einen exponentiellen gleitenden Durchschnitt zu berechnen. Du musst einen Zustand halten und du brauchst einen Tuning-Parameter. Dies fordert eine kleine Klasse (vorausgesetzt, du bist mit Java 5 oder höher): Instantiieren Sie mit dem Zerfallsparameter, den Sie wollen (kann die Abstimmung zwischen 0 und 1) und dann mit durchschnittlichen () zu filtern. Beim Lesen einer Seite auf einige mathematische Wiederholung, alles, was Sie wirklich wissen müssen, wenn es in Code ist, dass Mathematiker gerne Indizes in Arrays und Sequenzen mit Indizes schreiben. (Sie haben auch ein paar andere Notationen, was nicht hilft.) Allerdings ist die EMA ziemlich einfach, da man sich nur an einen alten Wert erinnern muss, keine komplizierten Zustand Arrays erforderlich. Antwortete Feb 8 12 um 20:42 TKKocheran: Ziemlich viel. Isn39t es schön, wenn es einfach sein kann (wenn man mit einer neuen Sequenz beginnt, bekomme du einen neuen Mittelwert.) Beachten Sie, dass die ersten paar Begriffe in der gemittelten Sequenz ein bisschen wegen der Brenneffekte umgehen werden, aber man bekommt diese mit anderen gleitenden Durchschnitten auch. Allerdings ist ein guter Vorteil, dass man die gleitende durchschnittliche Logik in den Mittelalter einpacken und experimentieren kann, ohne den Rest deines Programms zu stark zu stören. Ndash Donal Fellows Feb 9 12 at 0:06 Ich habe eine harte Zeit, Ihre Fragen zu verstehen, aber ich werde versuchen, trotzdem zu antworten. 1) Wenn dein Algorithmus 0,25 statt 0,36 gefunden hat, dann ist es falsch Es ist falsch, weil es eine monotone Zunahme oder Abnahme annimmt (das geht immer nach oben oder immer nach unten). Es sei denn, du durchschnittst alle deine Daten, deine Datenpunkte - wie du sie präsentierst - sind nichtlinear. Wenn Sie wirklich wollen, um den maximalen Wert zwischen zwei Punkten in der Zeit zu finden, dann schneiden Sie Ihr Array von tmin zu tmax und finden Sie die max dieser Subarray. 2) Nun ist das Konzept der gleitenden Durchschnitte sehr einfach: Stellen Sie sich vor, dass ich die folgende Liste habe: 1.4, 1.5, 1.4, 1.5, 1.5. Ich kann es glatt machen, 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 hätte es mal drei oder vier machen können, oder n. Beachten Sie, wie die Daten viel glatter sind. Ein guter Weg, um gleitende Durchschnitte bei der Arbeit zu sehen, ist, zu Google Finance zu gehen, eine Aktie auszuwählen (Tesla Motors ziemlich flüchtig (TSLA) auszuprobieren) und klicken Sie auf die Technik am unteren Rand des Diagramms. Wählen Sie Moving Average mit einem bestimmten Zeitraum und Exponential gleitenden Durchschnitt, um ihre Unterschiede zu vergleichen. Exponentieller gleitender Durchschnitt ist nur eine weitere Ausarbeitung von diesem, aber gewichtet die älteren Daten weniger als die neuen Daten ist dies ein Weg, um die Glättung nach hinten voranzutreiben. Bitte lesen Sie den Wikipedia-Eintrag. Also, das ist mehr ein Kommentar als eine Antwort, aber die kleine Kommentar-Box war nur zu winzig. Viel Glück. Wenn du Schwierigkeiten mit der Mathematik hast, könntest du mit einem einfachen gleitenden Durchschnitt anstatt exponentiell gehen. Also die Ausgabe, die du bekommst, wäre die letzten x Begriffe geteilt durch x. Ungetesteter Pseudocode: Beachten Sie, dass Sie die Start - und Endteile der Daten behandeln müssen, da Sie deutlich die letzten 5 Begriffe haben, wenn Sie auf Ihrem 2. Datenpunkt sind. Auch gibt es effizientere Möglichkeiten, diesen gleitenden Durchschnitt zu berechnen (Summsumme - älteste neueste), aber das ist es, das Konzept zu bekommen, was passiert. Antwortete am 8. Februar 12 um 20: 41Exponential Moving Average - EMA BREAKING DOWN Exponential Moving Average - EMA Die 12- und 26-Tage-EMAs sind die beliebtesten Kurzzeitdurchschnitte und sie werden verwendet, um Indikatoren wie die gleitende durchschnittliche Konvergenzdivergenz zu schaffen ( MACD) und dem prozentualen Preisoszillator (PPO). Im Allgemeinen werden die 50- und 200-Tage-EMAs als Signale von Langzeittrends verwendet. Händler, die technische Analysen verwenden, finden bewegte Durchschnitte sehr nützlich und aufschlussreich, wenn sie richtig angewendet werden, aber schaffen Verwüstung, wenn sie unsachgemäß verwendet oder falsch interpretiert werden. Alle gleitenden Mittelwerte, die üblicherweise in der technischen Analyse verwendet werden, sind ihrer Natur nach hintere Indikatoren. Folglich sollten die Schlussfolgerungen, die aus der Anwendung eines gleitenden Durchschnitts auf eine bestimmte Marktkarte gezogen werden, darin bestehen, eine Marktbewegung zu bestätigen oder ihre Stärke anzugeben. Sehr oft, bis zu der Zeit, in der eine gleitende durchschnittliche Indikatorlinie eine Änderung vorgenommen hat, um einen bedeutenden Marktzugang zu reflektieren, ist der optimale Markteintritt bereits vergangen. Eine EMA dient dazu, dieses Dilemma zu einem gewissen Grad zu lindern. Weil die EMA-Berechnung mehr Gewicht auf die neuesten Daten setzt, umarmt sie die Preisaktion etwas fester und reagiert daher schneller. Dies ist wünschenswert, wenn eine EMA verwendet wird, um ein Handelseingangssignal abzuleiten. Interpretation der EMA Wie alle gleitenden durchschnittlichen Indikatoren sind sie für die Trends in den Märkten besser geeignet. Wenn der Markt in einem starken und anhaltenden Aufwärtstrend ist. Die EMA-Indikatorlinie zeigt auch einen Aufwärtstrend und umgekehrt für einen Down-Trend. Ein wachsamer Trader wird nicht nur auf die Richtung der EMA-Linie achten, sondern auch auf das Verhältnis der Änderungsrate von einem Bar zum nächsten. Zum Beispiel, da die Preiswirkung eines starken Aufwärtstrends beginnt zu glätten und umzukehren, beginnt die EMAs-Änderungsrate von einem Bar zum nächsten zu verkleinern, bis zu diesem Zeitpunkt die Indikatorlinie abflacht und die Änderungsrate Null ist. Wegen der nacheilenden Wirkung, bis zu diesem Punkt, oder sogar ein paar Takte vorher, sollte die Preisaktion bereits umgekehrt sein. Daraus folgt, dass die Beobachtung einer konsequenten Abnahme der Änderungsrate der EMA selbst als Indikator verwendet werden könnte, der dem Dilemma, das durch die nacheilende Wirkung der sich bewegenden Mittelwerte verursacht wurde, weiter entgegenwirken könnte. Gemeinsame Verwendungen der EMA EMAs werden häufig in Verbindung mit anderen Indikatoren verwendet, um signifikante Marktbewegungen zu bestätigen und ihre Gültigkeit zu beurteilen. Für Händler, die intraday und schnell bewegte Märkte handeln, ist die EMA mehr anwendbar. Häufig verwenden Händler EMAs, um eine Handelsvorspannung zu bestimmen. Zum Beispiel, wenn eine EMA auf einer Tageskarte einen starken Aufwärtstrend zeigt, kann eine Intraday-Trader-Strategie sein, nur von der langen Seite auf einem Intraday-Chart zu handeln. Ich muss die letzten 7 Tage Arbeitsstunden in einer Flat-Datei verfolgen Leseschleife Es wird verwendet, um die Ermüdbarkeit der Arbeit zu beheben. Im Moment habe ich etwas, das funktioniert, aber es scheint ziemlich ausführlich und ich bin nicht sicher, ob theres ein Muster, das mehr prägnant ist. Derzeit habe ich eine Java-Klasse mit einem statischen Array, um die letzten x Tage Daten zu halten, dann, wie ich durch die Datei lese, hacke ich das erste Element und verschiebe das andere 6 (für eine Woche rollende Summe) zurück um eins. Die Verarbeitung dieses statischen Arrays erfolgt in seiner eigenen Methode, dh. Meine Frage: Ist das eine vernünftige Design-Ansatz, oder gibt es etwas blendend offensichtlich und einfach, diese Aufgabe zu tun Danke Jungs fragten Aug 30 11 um 14:33 Danke alot Jungs: I39ve bekam die Nachricht: Verwenden Sie ein übergeordnetes Objekt und nutzen Sie die Relevante Methoden oder einen Kreispuffer. Tolle Antworten, alle von ihnen. Wenn du darüber nachdenkst, brauchst du immer Zugriff auf das gesamte Array, so dass du diesen ersten Eintrag loswerden kannst - was ich mir nicht ganz sicher war. Ich entschuldigte mich, dass ich nicht ein paar Liner verpasst hatte und war im Grunde genommen eine vernünftige, wenn nicht effiziente und knappe Spur. Das ist es, was ich an dieser Seite liebe: hochwertige, relevante Antworten von Leuten, die ihre Sht kennen. Ndash Pete855217 Aug 30 11 at 15:05 Warum initialisieren Sie runningTotal auf null Was ist sein Typ Wo es deklariert ist Es wäre gut, wenn man einige Code-Samples passt, die dem tatsächlichen Java-Code ähneln. Wenn du fortfährst, wäre meine Kritik die folgende: Deine Funktion ist zu viel. Eine Funktion oder Methode sollte zusammenhängend sein. Genauer gesagt, sollten sie nur eins und nur eins tun. Noch schlimmer, was passiert in deiner for-Schleife, wenn x 5 Du kopierst runningTotal6 in runningTotal5. Aber dann haben Sie zwei Kopien des gleichen Wertes an Position 5 und 6. In Ihrem Design, Ihre Funktion movesshuffles die Elemente in Ihrem Array berechnet die Gesamtausdruck Zeug auf Standard-Fehler gibt die Summe Es ist zu viel. Mein erster Vorschlag ist nicht, Sachen herum in der Array zu bewegen. Stattdessen implementiere ich einen kreisförmigen Puffer und verwende ihn statt des Arrays. Es wird Ihr Design zu vereinfachen. Mein zweiter Vorschlag ist, Dinge in Funktionen zusammenzufassen, die zusammenhängen: haben eine Datenstruktur (ein kreisförmiger Puffer), die es Ihnen erlaubt, es hinzuzufügen (und das fällt den ältesten Eintrag, wenn es seine Kapazität erreicht.) Haben die Datenstruktur implementieren Interator haben eine Funktion, die die Summe auf dem Iterator berechnet (Sie interessieren sich nicht, wenn Sie die Summe aus einem Array, einer Liste oder einem kreisförmigen Bufer berechnen.) Nennen Sie es nicht total. Nennen Sie es Summe, was ist das, was Sie rechnen. Das ist, was Id tun :) That39s super Info Luis, aber denken Sie daran, diese Funktion ist ein kleiner Teil der Funktionalität der Klasse, und es wäre übertrieben, um zu viel Code hinzufügen, um es perfekt zu machen. Sie sind technisch korrekt, und ich verstehe, dass mein Code 39 zu viel39 ist, aber zur gleichen Zeit manchmal ist es besser, auf der Seite des kleineren, klareren Codes zu irren, als für Perfektion zu gehen. Angesichts meiner Java-Fähigkeiten, sogar die Pseudocode Sie beschreiben Kompilieren würde ich blasen mein Budget auf diesem (), aber danke für die klare Beschreibung. Ndash Pete855217 Aug 31 11 at 2:23 Hmmm, es geht nicht um Perfektion, sondern um etablierte industrielle Praktiken, die wir für die letzten 3 Jahrzehnte kennen. Sauberer Code ist immer einer, der partitioniert ist. Wir haben jahrzehntelange Beweise dafür, dass dies der Weg ist, in den allgemeinen Fall zu gehen (in Bezug auf Kosteneffizienz, Defektreduktion, Verständnis usw.). Es sei denn, es ist wegwerfen Code für eine einmalige Art von Ding. Es ist niemals kostspielig, dies zu tun, wenn man auf diese Weise irgendeine Problemanalyse startet. Codierung 101, brechen das Problem und der Code folgt, weder Overkill noch schwierig) ndash luis. espinal Ihre Aufgabe ist zu einfach und die Vorwürfe, die Sie adoptiert haben, ist sicherlich gut für den Job. Allerdings, wenn Sie ein besseres Design verwenden möchten, müssen Sie loszuwerden, alle diese Nummer Bewegung Sie besser verwenden eine FIFO-Warteschlange und machen gute Nutzung von Push-und Pop-Methoden, die Art und Weise der Code nicht reflektieren jede Datenbewegung, nur die beiden logischen Aktionen Von neuen Daten und entfernen Sie Daten älter als 7 Tage. Antwortete Aug 30 11 um 14:49

No comments:

Post a Comment