Einfache Gleitende Durchschnittliche Implementierung


In meiner Trading-Anwendung habe ich live Zecken 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 veränderbaren Adressen). Mit zwei Additionen und einer Multiplikation (mit 12000) können Sie nachfolgende gleitende Mittelwerte generieren 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 die Performance mit einem Deque oder einer Liste vergleichen. (Die Antwort kann davon abhängen, was Sie für jede Kerze speichern - nur eine einzelne floatdoubleint oder eine komplexere Struktur) Ist es möglich, einen gleitenden Durchschnitt in C ohne die Notwendigkeit für ein Fenster von Proben Ive gefunden, dass ich ein bisschen optimieren kann implementieren , Indem Sie eine Fenstergröße, die eine Macht von zwei, um Bit-Verschiebung statt zu teilen, aber nicht benötigen einen Puffer wäre schön. Gibt es eine Möglichkeit, ein neues gleitendes Durchschnittsergebnis nur als Funktion des alten Ergebnisses und des neuen Beispiels auszudrücken, definieren Sie einen beispielhaften gleitenden Durchschnitt in einem Fenster von 4 Proben: Add new sample e: Ein gleitender Durchschnitt kann rekursiv implementiert werden , Aber für eine exakte Berechnung des gleitenden Durchschnitts müssen Sie sich an die älteste Eingangsabfrage in der Summe (dh die in Ihrem Beispiel) erinnern. Für einen N-gleitenden Durchschnitt berechnen Sie: wobei yn das Ausgangssignal und xn das Eingangssignal ist. Gl. (1) können rekursiv geschrieben werden, also müssen Sie sich stets an die Stichprobe xn-N erinnern, um (2) zu berechnen. Wie von Conrad Turner angemerkt, können Sie stattdessen ein (unendlich langes) exponentielles Fenster verwenden, mit dem Sie die Ausgabe nur aus dem vergangenen Ausgang und dem aktuellen Eingang berechnen können. Dies ist jedoch kein normaler (ungewichteter) gleitender Durchschnitt, sondern ein exponentieller Wert Gewogenen gleitenden Durchschnitt, wo die Proben in der Vergangenheit ein geringeres Gewicht erhalten, aber (zumindest in der Theorie) man nie etwas vergessen (die Gewichte nur kleiner und kleiner für Proben weit in der Vergangenheit). Ich habe einen gleitenden Durchschnitt ohne einzelnen Element-Speicher für ein GPS-Tracking-Programm, das ich geschrieben habe. Ich beginne mit 1 Probe und dividiere durch 1, um die aktuelle Durchschn. Ich füge dann anothe Probe und dividiere durch 2 zu den aktuellen Durchschn. Das geht so lange weiter, bis ich auf die Länge des Durchschnitts komme. Jedes Mal danach, füge ich in der neuen Probe, erhalten Sie den Durchschnitt und entfernen Sie diesen Durchschnitt aus der Gesamtmenge. Ich bin kein Mathematiker, aber das schien ein guter Weg, es zu tun. Ich dachte, es würde den Magen eines echten Mathematik-Kerl, aber es stellt sich heraus, es ist eine der akzeptierten Möglichkeiten, es zu tun. Und es funktioniert gut. Denken Sie daran, dass je höher Ihre Länge, desto langsamer folgt es, was Sie folgen möchten. Das kann nicht die meiste Zeit, aber wenn folgende Satelliten, wenn Sie langsam sind, könnte die Spur weit von der tatsächlichen Position und es wird schlecht aussehen. Sie könnten eine Lücke zwischen dem Sat und den nachfolgenden Punkten haben. Ich wählte eine Länge von 15 aktualisiert 6 mal pro Minute, um eine ausreichende Glättung und nicht zu weit von der tatsächlichen Sat-Position mit den geglätteten Spur Punkte erhalten. Antwort # 2 am: November 16, 2010, um 23:03 Uhr Initialisierung insgesamt 0, count0 (jedes Mal, wenn ein neuer Wert dann ein Eingang (scanf), ein add totalnewValue, ein Inkrement (count), ein dividieren Durchschnitt (totalcount) Dies wäre ein gleitender Durchschnitt über Alle Eingänge Um den Durchschnitt über nur die letzten 4 Eingänge zu berechnen, benötigen Sie 4 Inputvariablen, vielleicht kopieren Sie jeden Eingang zu einem älteren inputvariable und berechnen dann den neuen gleitenden Durchschnitt als Summe der 4 Inputvariablen, geteilt durch 4 (Rechtsverschiebung 2 wäre Gut, wenn alle Eingänge waren positiv, um die durchschnittliche Berechnung beantwortet werden 3. Februar um 4:06 Das wird tatsächlich berechnen den Gesamtdurchschnitt und nicht den gleitenden Durchschnitt. Wenn Zähler größer wird der Einfluss eines neuen Eingangsprobe wird verschwindend kleiner ndash Hilmar Feb 3 15 um 13:53 Ihre Antwort 2017 Stack Exchange, IncSimple Verschieben Durchschnitt - SMA BREAKING DOWN Einfache Moving Average - SMA Ein einfacher gleitender Durchschnitt ist anpassbar, dass es für eine andere Anzahl von Zeitperioden berechnet werden kann, einfach durch Hinzufügen der Schlusskurs Der Sicherheit für eine Reihe von Zeitperioden und dann dividiert diese Summe durch die Anzahl der Zeiträume, die den durchschnittlichen Preis der Sicherheit über den Zeitraum gibt. Ein einfacher gleitender Durchschnitt glättet die Volatilität und macht es einfacher, die Preisentwicklung eines Wertpapiers zu sehen. Wenn der einfache gleitende Durchschnitt nach oben zeigt, bedeutet dies, dass der Sicherheitspreis steigt. Wenn es nach unten zeigt, bedeutet dies, dass der Sicherheitspreis sinkt. Je länger der Zeitrahmen für den gleitenden Durchschnitt, desto glatter der einfache gleitende Durchschnitt. Ein kürzerer bewegter Durchschnitt ist volatiler, aber sein Messwert ist näher an den Quelldaten. Analytische Bedeutung Die gleitenden Durchschnitte sind ein wichtiges analytisches Instrument, um aktuelle Preisentwicklungen und das Potenzial für eine Veränderung eines etablierten Trends zu identifizieren. Die einfachste Form der Verwendung eines einfachen gleitenden Durchschnitt in der Analyse ist es, schnell zu identifizieren, ob eine Sicherheit in einem Aufwärtstrend oder Abwärtstrend ist. Ein weiteres populäres, wenn auch etwas komplexeres analytisches Werkzeug, besteht darin, ein Paar einfacher gleitender Durchschnitte mit jeweils unterschiedlichen Zeitrahmen zu vergleichen. Liegt ein kürzerer einfacher gleitender Durchschnitt über einem längerfristigen Durchschnitt, wird ein Aufwärtstrend erwartet. Auf der anderen Seite signalisiert ein langfristiger Durchschnitt über einem kürzerfristigen Durchschnitt eine Abwärtsbewegung im Trend. Beliebte Trading-Muster Zwei beliebte Trading-Muster, die einfache gleitende Durchschnitte verwenden, schließen das Todeskreuz und ein goldenes Kreuz ein. Ein Todeskreuz tritt auf, wenn die 50-tägige einfache gleitende Durchschnitt unter dem 200-Tage gleitenden Durchschnitt kreuzt. Dies wird als bärisch signalisiert, dass weitere Verluste auf Lager sind. Das goldene Kreuz tritt auf, wenn ein kurzfristiger gleitender Durchschnitt über einen langfristigen gleitenden Durchschnitt bricht. Verstärkt durch hohe Handelsvolumina, kann dies signalisieren, weitere Gewinne sind im Laden.

Comments

Popular Posts