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 vergleichen die Leistung gegen eine deque oder Liste aber. (Die Antwort kann davon abhängen, was Sie für jede Kerze speichern - nur eine einzelne floatdoubleint oder eine komplexere Struktur) Ich weiß, dies ist mit boost wie pro erreichbar: Aber ich möchte wirklich vermeiden, mit Boost. Ich habe gegoogelt und keine geeigneten oder lesbaren Beispiele gefunden. Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahlstroms mit den letzten 1000 Zahlen als Datenprobe verfolgen. Was ist der einfachste Weg, um dies zu erreichen, experimentierte ich mit einem kreisförmigen Array, exponentiellen gleitenden Durchschnitt und einem einfacheren gleitenden Durchschnitt und festgestellt, dass die Ergebnisse aus dem kreisförmigen Array meine Bedürfnisse am besten geeignet. Wenn Ihre Bedürfnisse sind einfach, können Sie nur versuchen, mit einem exponentiellen gleitenden Durchschnitt. Setzen Sie einfach, Sie eine Akkumulator-Variable, und wie Ihr Code sieht auf jede Probe, aktualisiert der Code den Akkumulator mit dem neuen Wert. Sie wählen eine konstante Alpha, die zwischen 0 und 1 ist, und berechnen Sie: Sie müssen nur einen Wert von Alpha zu finden, wo die Wirkung einer gegebenen Probe nur für etwa 1000 Proben dauert. Hmm, Im nicht wirklich sicher, dass dies für Sie geeignet ist, jetzt, dass Ive es hier. Das Problem ist, dass 1000 ist ein ziemlich langes Fenster für einen exponentiellen gleitenden Durchschnitt Im nicht sicher, gibt es ein Alpha, die den Durchschnitt über die letzten 1000 Zahlen, ohne Unterlauf in der Gleitkomma Berechnung. Aber, wenn Sie einen kleineren Durchschnitt wünschen, wie 30 Zahlen oder so, dieses ist eine sehr einfache und schnelle Weise, es zu tun. Beantwortet Jun 12 12 at 4:44 1 auf Ihrem Beitrag. Der exponentielle gleitende Durchschnitt kann zulassen, dass das Alpha variabel ist. Somit kann dies dazu verwendet werden, Zeitbasisdurchschnitte (z. B. Bytes pro Sekunde) zu berechnen. Wenn die Zeit seit dem letzten Akkumulator-Update mehr als 1 Sekunde beträgt, lassen Sie Alpha 1.0 sein. Andernfalls können Sie Alpha zulassen (usecs seit letztem update1000000). Ndash jxh Grundsätzlich möchte ich den gleitenden Durchschnitt eines laufenden Stroms eines Gleitkommazahls mit den neuesten 1000 Zahlen als Datenbeispiel zu verfolgen. Beachten Sie, dass im Folgenden die Summe als Elemente als addiert ergänzt wird, wobei kostspielige O (N) - Transversionen vermieden werden, um die Summe zu berechnen, die für den durchschnittlichen Bedarf benötigt wird. Insgesamt wird ein anderer Parameter von T gebildet, um z. B. Mit einer langen langen, wenn insgesamt 1000 lange s, eine int für char s, oder eine doppelte bis total float s. Dies ist ein wenig fehlerhaft, dass Nennsignale an INTMAX vorbeiziehen könnten - wenn Sie darauf achten, dass Sie ein langes langes nicht signiertes verwenden konnten. Oder verwenden Sie ein zusätzliches Bool-Datenelement, um aufzuzeichnen, wenn der Container zuerst gefüllt wird, während numsamples rund um das Array (am besten dann umbenannt etwas harmlos wie pos). Man nehme an, daß der quadratische Operator (T-Abtastwert) tatsächlich quadratischer Operator (T-Abtastwert) ist. Ndash oPless Jun 8 14 um 11:52 Uhr oPless ahhh. Gut beobachtet. Eigentlich meinte ich, dass es sich um void operator () (T sample) handelt, aber natürlich könntet ihr auch irgendeine Notation verwenden, die ihr mochtet. Wird beheben, danke. Ndash Tony D Jun 14 14 um 14: 27A Simple Moving Average ist ein Durchschnitt der Daten berechnet über einen Zeitraum von Zeit. Der gleitende Durchschnitt ist der populärste Preisindikator, der in technischen Analysen verwendet wird. Dieser Durchschnitt kann mit jedem Preis einschließlich der Hi, Low, Open oder Close verwendet werden, und kann auch auf andere Indikatoren angewendet werden. Ein gleitender Durchschnitt glättet eine Datenreihe, die in einem volatilen Markt sehr wichtig ist, da sie hilft, wichtige Trends zu identifizieren. Dundas Diagramm für ASP hat vier Arten bewegliche Durchschnitte einschließlich einfach, exponentiell. Dreieckig. Und Gewichtet. Der wichtigste Unterschied zwischen den obigen gleitenden Durchschnitten ist, wie sie ihre Datenpunkte gewichten. Wir empfehlen Ihnen, mit den Finanzformeln zu lesen, bevor Sie fortfahren. Mithilfe von Finanzformeln erhalten Sie eine ausführliche Erläuterung, wie Sie Formeln verwenden können, und erläutert auch die verschiedenen Optionen, die Ihnen beim Anwenden einer Formel zur Verfügung stehen. Ein Liniendiagramm ist eine gute Wahl, wenn ein einfacher gleitender Durchschnitt angezeigt wird. Finanzinterpretation: Der "Moving Average" wird verwendet, um die Sicherheitspreise mit dem gleitenden Durchschnitt zu vergleichen. Das wichtigste Element, das bei der Berechnung des gleitenden Durchschnitts verwendet wird, ist ein Zeitraum, der dem beobachteten Marktzyklus entsprechen sollte. Der gleitende Durchschnitt ist ein nachlaufender Indikator und wird immer hinter dem Preis sein. Wenn der Preis folgt einem Trend der gleitende Durchschnitt ist sehr nah an den Wertpapieren Preis. Wenn ein Preis steigt, wird der gleitende Durchschnitt wahrscheinlich aufgrund des Einflusses der historischen Daten bleiben. Berechnung: Der gleitende Mittelwert wird nach folgender Formel berechnet: In der vorhergehenden Formel stellt der n-Wert eine Zeitperiode dar. Die häufigsten Zeiträume sind: 10 Tage, 50 Tage und 200 Tage. Ein gleitender Durchschnitt bewegt sich, da bei jedem neuen Datenpunkt der älteste Datenpunkt gelöscht wird. Ein einfacher gleitender Durchschnitt gibt jedem Datenpunktpreis gleiches Gewicht. In diesem Beispiel wird veranschaulicht, wie ein 20-Tage-Durchschnitt mit der Formelmethode berechnet wird.
Comments
Post a Comment