Sunday 29 January 2017

N Tage Exponentiell Gleitender Durchschnitt

8.2 Exponential Moving Average Ein N-Tag exponentieller gleitender Durchschnitt (EMA) ist ein gewichteter Durchschnitt von todayrsquos close und der vorhergehende EMA-Wert. Das Gewicht für todayrsquos close ist ein Glättungsfaktor alpha, wobei alpha2 (N1). Die Formel kann auch folgendermaßen geschrieben werden, wobei gezeigt wird, wie sich der Durchschnitt in Richtung todayrsquos in der Nähe eines Alpha-Bruchteils der Entfernung von der alten EMA zum neuen Schließen bewegt. Ausbauen gibt eine Potenzreihe mit sukzessiv abnehmender Gewichtung für jeden dayrsquos Preis. Schreiben f1-alpha und mit p1 todayrsquos Schlusskurs, p2 yesterdayrsquos, etc, dann Dies ist eine unendliche Summe, aber f ist kleiner als 1 so dass jedes sukzessive Gewicht fk kleiner und kleiner wird, bald vernachlässigbar. Die letzten N Tage machen etwa 86,5 der insgesamt. Die folgende Grafik zeigt, wie die Gewichte für N10 abnehmen. Da die jüngsten Preise eine höhere Gewichtung der vergangenen Preise haben, reagiert die EMA schneller und verfolgt die jüngsten Preise stärker als ein einfacher gleitender Durchschnitt (siehe Simple Moving Average). 8.2.1 J. Welles Wilder Bei der Arbeit mit N-Tagesperioden ist zu beachten, dass J. Welles Wilder eine abweichende Berechnung des Abnahmefaktors für EMAs verwendet. Zum Beispiel für eine 14-Tage EMA schreibt er Dies ist die gleiche wie die Formel oben, nur ein anderes f-Faktor. Wenn Wilder ldquoWrdquo Tage gibt, ist das Äquivalent ldquoNrdquo oben 2W-1. So dass 14 zu 27 wird. Dies wird auch manchmal ein ldquododifiziertes bewegtes averagerdquo genannt. In den von Wilder entworfenen Indikatoren verwendet Chart seine Berechnung, so dass z. B. bei 14 ein 14-Tage-RSI eingegeben wird. Dies gilt für ATR, DMI (und ADX) und RSI (siehe Average True Range Directional Movement Index und Relative Festigkeitsindex). Kevin Ryde Chart ist freie Software, die Sie es verteilen und unter den Bedingungen der GNU General Public License veröffentlichen können, wie sie von der Free Software Foundation veröffentlicht wird. Version 3, Oder (nach Ihrer Wahl) jede spätere version. In meinem Trading-Anwendung habe ich Live-Ticks der Aktienkurse. Ich muss SMA pflegen. Angenommen, ich möchte SMA von 20 Kerzen, wobei die Dauer jeder Kerze 10 Sekunden beträgt. Dies bedeutet, dass alle 10 Sekunden habe ich Checkpoint, wo: Ich schließe aktuelle Kerze und speichern durchschnittlichen Preis für die letzten 10 Sekunden. Durchschnitt ist (max - min) 2 Ich beginne eine neue Kerze und speichere den letzten Preis. Ich clean-up veraltete Kerze. Ich aktualisieren letzten Preis der aktuellen bildenden Kerze und rekalieren SMA. So auf jedem möglichem Tick muss ich SMA neu berechnen. In den meisten Fällen wird nur der Preis der letzten Kerze geändert (weil wir den letzten Preis verwenden). Einmal pro 10 Sekunden brauche ich ein bisschen mehr Extraarbeit - ich muss den Durchschnitt der veralteten Kerze vergessen und den Durchschnitt der eben geschaffenen Kerze speichern. Können Sie vorschlagen, wie zu implementieren, diese mit niedrigster Latenz Niedrige Latenz ist primäre Anforderung. Ich bin nicht sicher, ob dies ist der Ansatz, den Sie suchen, aber hier ist der Pseudocode für sehr schnelle SMAs. Simple Moving Average: Ich nehme an, dass Ihre Daten in Form eines Streams kommen und in einem kontinuierlichen Speicherplatz gespeichert werden (zumindest bei kontinuierlich abbindbaren Adressen). Mit zwei Additionen und einer Multiplikation (mit 1 2000) können Sie nachfolgende gleitende Mittelwerte generieren Für die neuen Zecken. Exponentieller gleitender Durchschnitt: Das ist eine anständige Alternative, wie oben erwähnt: Hier ist es nicht wirklich ein N-Tag gleitenden Durchschnitt. Sein gerade ein gewichteter gleitender Durchschnitt mit 87 Gewichtung zu den letzten N-Tagen, also sind fast N-Tage mehr wie es. Hinweis zu Compiler-Optimierungen: Beachten Sie, dass die Aktivierung von SSE - oder AVX-Optionen, sofern verfügbar, eine massive Beschleunigung dieser Algorithmen ermöglicht, da mehrere Berechnungen in einem einzigen CPU-Zyklus ausgewertet werden können. Es ist unwahrscheinlich, daß der Algorithmus einen Fehler erzeugt, es sei denn, daß die verwendeten Speicherbereiche ebenfalls durch einen anderen Thread geändert werden. Hinsichtlich der Vollrekalkulation. Ein Weg, um Ihren Code zu beschleunigen, ist, diesen Prozess zu einem alternativen Thread zu übertragen, damit es doesn39t Block Durchsetzung Ihrer Haupt-MA Berechnung. Da es sich um eine unabhängige Operation handelt, wäre es sehr einfach, diesen Code zu parallelisieren. Ndash hnk Sie brauchen eine Warteschlange von ziemlich viel fester Größe, wo Sie effizient neue Elemente hinzufügen und das älteste Element entfernen können ( Um es von Ihrer laufenden Gesamtmenge zu entfernen). Warum nicht std :: queue Dies kann auf der Oberseite der verschiedenen Container sitzen, aber wenn Sie wirklich nur 20 Elemente Ich vermute, ein Vektor würde gut funktionieren. (Das Entfernen eines Elements erfordert das Verschieben aller anderen Elemente nach unten - aber das Bewegen zusammenhängender Speicherblöcke ist schnell.) Vielleicht möchten Sie vergleichen die Leistung gegen eine deque oder Liste aber. (Die Antwort kann davon abhängen, was Sie für jede Kerze speichern - nur ein einziger float double int oder eine komplexere Struktur)


No comments:

Post a Comment