Fast Sliding SMA algorithm
- Bibliotheken
- Andrei Khloptsau
- Version: 1.0
- Aktivierungen: 20
Ein einfacher gleitender Durchschnitt (SMA) ist ein statistischer Indikator, der in der Zeitreihenanalyse verwendet wird. Dieser Indikator stellt das arithmetische Mittel einer Folge von Werten über einen bestimmten Zeitraum dar. Der SMA wird verwendet, um kurzfristige Schwankungen in Daten zu glätten und den Gesamttrend oder die Richtung von Veränderungen hervorzuheben. Dies hilft Analysten und Händlern, die allgemeine Dynamik der Zeitreihe besser zu verstehen und potenzielle Trends oder Richtungsänderungen zu erkennen. Weitere Informationen finden Sie im Wiki https://en.wikipedia.org/wiki/Moving_average.
Vereinfacht ausgedrückt, ist der SMA der Durchschnittswert einer Datenreihe über einen bestimmten Zeitraum. Dieser Zeitraum kann in Tagen, Wochen, Stunden usw. angegeben werden, je nach Kontext und Analysezielen.
Für die grundlegende Berechnung des einfachen gleitenden Durchschnitts (SMA) mit einer festen Fenstergröße n beträgt die asymptotische Standardzeitkomplexität O(n). Das bedeutet, dass die Ausführungszeit des Algorithmus linear proportional zur Größe des Fensters oder der Anzahl der Datenpunkte ist.
Die verbesserte Version des Algorithmus verwendet jedoch eine Warteschlange und hat eine Ausführungsasymptote von O(1) für jedes neue Element, was den Algorithmus im Vergleich zur linearen Asymptote von O(n) effizient macht.
Die verbesserte Version des Algorithmus des gleitenden Durchschnitts, die eine Warteschlange verwendet, bietet mehrere Vorteile gegenüber der Basisimplementierung:
-
Konstante Zeit für jedes neue Element: Der Algorithmus gewährleistet konstante Zeit (O(1)) für das Hinzufügen neuer Elemente und das Entfernen alter Elemente aus der Warteschlange, wodurch er unabhängig von der Fenstergröße effizient ist.
-
Effiziente Aktualisierungsvorgänge: Die Nutzung einer Warteschlange ermöglicht das effiziente Hinzufügen neuer Elemente am Ende und das Entfernen alter Elemente am Anfang, wodurch die Anzahl der für die Aktualisierung des Durchschnitts erforderlichen Operationen reduziert wird.
-
Optimierte Fensterverwaltung: Die Warteschlange dient als effektive Datenstruktur für das Fenstermanagement im gleitenden Durchschnitt, so dass beim Hinzufügen eines neuen Elements nicht mehr der gesamte Durchschnitt neu berechnet werden muss.
-
Erhöhte Effizienz bei großen Datensätzen: Die konstante Zeit für jedes neue Element gewährleistet, dass der Algorithmus auch bei der Verarbeitung großer Datenmengen effizient bleibt.
-
Einfache Implementierung und Wartung: Durch die Verwendung einer Warteschlange wird der Code verständlicher und leichter zu pflegen, da die Notwendigkeit einer Iteration durch das gesamte Fenster zur Aktualisierung des Durchschnitts vermieden wird.
Zusammenfassend lässt sich sagen, dass der verbesserte Algorithmus eine effizientere Datenverarbeitung ermöglicht und gleichzeitig ein festes Fenster für den gleitenden Durchschnitt beibehält.
Abschnitt Importieren:
#import "FastSlidingSMA.ex5" bool InitNewInstance(string key, const long windowSize); // Initialisieren einer neuen Instanz von FastMovingSMA bool PushValue(string key, const double &value); // Einen einzelnen Wert in die FastMovingSMA-Instanz einfügen bool PushArray(string key, double &values[]); // Ein Array von Werten in die FastMovingSMA-Instanz einfügen bool PushVector(string key, vector &values); // Einen Vektor von Werten in die FastMovingSMA-Instanz einfügen bool GetSMA(string key, double &sma); // Abrufen des Werts des gleitenden Durchschnitts aus der Instanz FastMovingSMA bool ClearInstance(string key); // Löschen der FastMovingSMA-Instanz bool GetTopValue(string key, double &topValue); // Abrufen des oberen Wertes aus der FastMovingSMA-Instanz bool GetPoppedValue(string key, double &poppedValue); // Abrufen des gepoppten Wertes aus der FastMovingSMA-Instanz #import
Beispiel für die Verwendung des Codes:
#property copyright "Copyright 2023, Andrei Khloptsau Ltd." #property link "https://www.mql5.com" #property version "1.00" #import "FastSlidingSMA.ex5" bool InitNewInstance(string key, const long windowSize); bool PushValue(string key, const double &value); bool PushArray(string key, double &values[]); bool PushVector(string key, vector &values); bool GetSMA(string key, double &sma); bool ClearInstance(string key); bool GetTopValue(string key, double &topValue); bool GetPoppedValue(string key, double &poppedValue); #import const string INSTANCE_KEY = "MyInstance"; input int NumberOfBars = 5; int OnInit() { if (!InitNewInstance(INSTANCE_KEY, NumberOfBars)) return INIT_FAILED; double closePrices[]; ArraySetAsSeries(closePrices, true); if (CopyClose(_Symbol, _Period, 0, NumberOfBars, closePrices) > 0) PushArray(INSTANCE_KEY, closePrices); else return INIT_FAILED; return INIT_SUCCEEDED; } void OnDeinit(const int reason) { ClearInstance(INSTANCE_KEY); } void OnTick() { double currentPrice = iClose(_Symbol, _Period, 0); PushValue(INSTANCE_KEY, currentPrice); double sma; if (GetSMA(INSTANCE_KEY, sma)) { Print("Current value SMA: ", sma); } }
