Fast Sliding SMA algorithm
- Bibliotecas
- Versión: 1.0
- Activaciones: 20
Una media móvil simple (SMA) es un indicador estadístico utilizado en el análisis de series temporales. Este indicador representa la media aritmética de una secuencia de valores a lo largo de un periodo de tiempo determinado. La SMA se utiliza para suavizar las fluctuaciones a corto plazo de los datos, ayudando a resaltar la tendencia general o la dirección de los cambios. Esto ayuda a los analistas y operadores a comprender mejor la dinámica general de las series temporales y a identificar posibles tendencias o cambios de dirección. Encontrará más información en la Wiki https://en.wikipedia.org/wiki/Moving_average.
En términos sencillos, el SMA es el valor medio de una secuencia de datos a lo largo de un periodo de tiempo determinado. Este periodo puede ser de días, semanas, horas, etc., dependiendo del contexto y de los objetivos del análisis.
Para el cálculo básico de la media móvil simple (SMA) con un tamaño de ventana fijo n, la complejidad temporal asintótica estándar es O(n). Esto significa que el tiempo de ejecución del algoritmo es linealmente proporcional al tamaño de la ventana o al número de puntos de datos.
Sin embargo, la versión mejorada del algoritmo utiliza una cola y tiene una asintótica de ejecución de O(1) para cada nuevo elemento, lo que hace que el algoritmo sea eficiente en comparación con la asintótica lineal de O(n).
La versión mejorada del algoritmo de media móvil que utiliza una cola ofrece varias ventajas sobre la implementación básica:
-
Tiempo constante para cada elemento nuevo: El algoritmo garantiza un tiempo constante (O(1)) para añadir nuevos elementos y eliminar elementos antiguos de la cola, lo que lo hace eficiente independientemente del tamaño de la ventana.
-
Operaciones de actualización eficaces: Aprovechar una cola permite añadir nuevos elementos al final y eliminar los antiguos desde el principio de forma eficiente, reduciendo el número de operaciones necesarias para actualizar la media.
-
Gestión optimizada de ventanas: La cola sirve como una estructura de datos eficaz para la gestión de ventanas en la media móvil, eliminando la necesidad de recalcular toda la media al añadir un nuevo elemento.
-
Mayor eficacia con grandes conjuntos de datos: El tiempo constante para cada nuevo elemento garantiza que el algoritmo siga siendo eficiente incluso al procesar grandes volúmenes de datos.
-
Fácil implementación y mantenimiento: El uso de una cola hace que el código sea más comprensible y fácil de mantener, evitando la necesidad de iterar a través de toda la ventana para actualizar la media.
En resumen, el algoritmo mejorado proporciona un procesamiento de datos más eficiente a la vez que mantiene una ventana fija para la media móvil.
Sección de importación:
#import "FastSlidingSMA.ex5" bool InitNewInstance(string key, const long windowSize); // Inicializar una nueva instancia de FastMovingSMA bool PushValue(string key, const double &value); // Introduce un único valor en la instancia FastMovingSMA bool PushArray(string key, double &values[]); // Introduce un array de valores en la instancia FastMovingSMA bool PushVector(string key, vector &values); // Introduce un vector de valores en la instancia FastMovingSMA bool GetSMA(string key, double &sma); // Obtener el valor de la media móvil de la instancia FastMovingSMA bool ClearInstance(string key); // Borrar la instancia FastMovingSMA bool GetTopValue(string key, double &topValue); // Obtener el valor superior de la instancia FastMovingSMA bool GetPoppedValue(string key, double &poppedValue); // Obtener el valor saliente de la instancia FastMovingSMA #import
Cómo utilizar el código de ejemplo:
#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); } }
