CRingBuffer
- Bibliotecas
- Christian Stern
- Versión: 1.0
- Activaciones: 10
CRingBuffer - Buffer anular numérico con motor estadístico ligero de alto rendimiento
CRingBuffer es una potente biblioteca MQL5 para el análisis numérico de ventanas móviles. Después de cada inserción proporciona inmediatamente
media, varianza, desviación estándar, percentiles, puntuaciones z, seguimiento min/max y valores normalizados - todo en O(1) a O(n log n).
Tabla de contenidos:
- Área de aplicación
- Dos modos de funcionamiento
- Estadística básica
- Estadística Welford (numéricamente estable, recomendada para grandes niveles de precios)
- Percentiles
- Análisis de puntuación Z (tres modos)
- Seguimiento mínimo/máximo (O(1))
- Normalización mín-máx
- Lógica de marcadores de posición
- Índice virtual
- Extensibilidad mediante herencia (6 ganchos de eventos)
- Instantánea de estadísticas mediante RBufStats (más de 30 métricas en un objeto)
- Ventajas
- Ejemplo
- Funciones estadísticas de un vistazo
- Actualizaciones y soporte
1. Área de aplicación:
CRingBuffer está diseñado para desarrolladores MQL5 que necesitan análisis estadístico rolling-window en indicadores, asesores expertos o librerías
.
Casos de uso típicos:
- Observación continua del mercado (valores de precio, spread, volumen, ATR)
- Normalización de señales a [0,1] para sistemas de puntuación
- Detección de valores atípicos basada en Z-score en tiempo real o en backtests
- Determinación de umbrales basada en percentiles (timeframe-robust)
- Construcción de capas de cálculo de indicadores personalizadas mediante herencia
- Componente en arquitecturas de clases multicapa
- Recopilación de datos en sistemas basados en eventos con longitud de historia variable
No es adecuado para:
- Análisis de carteras de pedidos en tiempo real con una frecuencia de ticks muy alta (sin procesamiento paralelo sin bloqueo)
- Almacenamiento de datos no numéricos
2. Dos modos de funcionamiento:
- Búfer estático: tamaño de ventana fijo, los valores más antiguos se sobrescriben automáticamente
. Ideal para ATR-14, RSI-14 o cualquier ventana móvil.
- Búfer dinámico: tamaño de ventana modificable en tiempo de ejecución. Se pueden eliminar valores individuales
. La capacidad aumenta o disminuye según sea necesario.
3. Estadísticas básicas (todas O(1) después de la inserción):
- Suma, suma de cuadrados
- Media aritmética
- Varianza y desviación estándar de la muestra corregidas por Bessel
4. Estadística de Welford (numéricamente estable). 4.Estadísticos de Welford (numéricamente estables, recomendados para niveles de precios elevados):
- Media de Welford, varianza de Welford, desviación típica de Welford
- Robustos frente a efectos de cancelación en series largas o a niveles de precios elevados
(por ejemplo, BTCUSD ~100.000 o el índice Nasdaq)
5.Percentiles: - getthe percentiles( obtenerlos percentiles) Percentiles:
- getPercentile() - percentil único con interpolación lineal (Hyndman & Fan, método 7)
- getPercentiles() - percentiles múltiples en una sola pasada ordenada
- Los marcadores de posición (EMPTY_VALUE, NaN, Inf) se filtran automáticamente
6. Análisis de puntuaciones Z (tres modos): - getPercentile() - percentiles múltiples en una sola pasada ordenada Análisis de puntuación Z (tres modos):
- getLastZScore() - z-score actual del valor más reciente
- getZScoreAt() - z-score libre de look-ahead para backtesting
- getZScores() - ventana expansible (look-ahead-free) o rolling para todos los valores del buffer a la vez
7.Seguimiento mínimo/máximo (O(1)):
- Ejecución del mínimo y el máximo de todos los valores válidos
- Posiciones virtuales del mínimo y el máximo recuperables como índices
- Rango (máximo - mínimo) disponible en cualquier momento
- Historial de rangos suavizado para el análisis de tendencias
8. Normalizaciónmínimo-máximo: Normalización mín-máx:
- getNormalizedValue() - normaliza cualquier valor a [0,1]
- getNormalizedValueAt() - normaliza el valor en un índice virtual
- getNormalizedValues() - exporta todos los valores del búfer en forma normalizada
- Fallback 0.5 para datos constantes (comportamiento definido, no un error)
9. Lógica de marcador deposición: - EMP EMP - lógica de marcadorde posiciónLógica de marcador de posición:
- EMPTY_VALUE, NaN e Inf se detectan automáticamente
- Ocupan un espacio pero no se tienen en cuenta en ninguna estadística
- Los búferes de indicadores MQL5 se rellenan inicialmente con EMPTY_VALUE - este filtrado
evita la distorsión estadística sin código adicional
10. Índicevirtual: - Uniform value() - exporta todos los valores de búfer de forma normalizada Índice virtual:
- Direccionamiento uniforme: índice 0 = más antiguo, índice n-1 = valor más reciente
- La mecánica interna del búfer de anillo es totalmente transparente para quien llama
11. Extensibilidad mediante herencia (MQL5)Extensibilidad mediante herencia (6 ganchos de eventos):
- OnAddValue() - después de cada inserción
- OnRemoveValue() - al eliminar o sobrescribir
- OnChangeValue() - después de replaceValue()
- OnChangeArray()- después de cada cambio estructural
- OnSetMaxTotal() - después de un cambio de capacidad
- OnShrink() - después de la reducción del buffer
- Todos los hooks se disparan después de que las estadísticas hayan sido completamente actualizadas
12. Instantánea de las estadísticas a través de RBuf()Instantánea de estadísticas mediante RBufStats (más de 30 métricas en un objeto):
- Grupo A: Estadísticas básicas (media, varianza, stddev, mín, máx, rango, suma,
total_count, valid_count, last_value, previous_value, oldest_value,
min_index, max_index, avg_range, avg_diff, fill_rate)
- Grupo B: Estadísticas Welford (welford_mean, welford_variance, welford_stddev)
- Grupo C: Percentiles (Q05, Q10, Q25, Mediana, Q75, Q90, Q95, IQR)
- Grupo D: Puntuación Z y normalización (zscore, zscore_prev, zscore_delta,
norm_last, norm_oldest)
- Método de validación Validate(), constructor de copia, operator=()
13. Ventajas:
- No requiere código personalizado de memoria cíclica: sustituye a varios cientos de líneas de implementación boilerplate recurrente
- Método Welford numéricamente estable disponible en paralelo a la fórmula de suma.
- Tres modos z-score incluyendo un modo look-ahead-free para evaluación de señales compatible con backtest
- Filtrado automático de marcadores de posición previene la distorsión estadística causada por la inicialización EMPTY_VALUE de los buffers de indicadores MQL5
- Actualización incremental O(1) de todas las estadísticas después de cada inserción - sin recálculo costoso durante las consultas
- Totalmente extensible a través de herencia y ganchos de eventos sin cambiar la clase base
- Índice virtual uniforme oculta la complejidad del buffer anular interno
- Documentación completa en inglés (referencia API, detalles de comportamiento, ejemplos de código, errores)
14. Ejemplo:
1. 1. Copiar CRingBuffer.ex5 al directorio del proyecto deseado
2. Incluirlo en el MQL5. 2. Incluirlo en el archivo MQL5:
#include "CRingBuffer_standalone.ex5"
3. Instanciar buffer:
CRingBuffer buf(20, false); // Búfer estático, capacidad 20 CRingBuffer dyn(20, true); // Búfer dinámico
4. Añadir valores y recuperar estadísticas:
buf.addValue(close[0]); double mean = buf.getMean(); double stddev = buf.getWelfordStdDev(); double zscore = buf.getLastZScore();
No hay más dependencias. La biblioteca es completamente autónoma.
15. Las funciones estadísticas de un vistazo
| Grupo | Métodos | Beneficio |
|---|---|---|
| Estadísticas básicas | getSum(), getSumSq(), getMean(), getVariance(), getStdDev() | Proporciona las métricas clásicas de media, dispersión y suma total de valores válidos. |
| Estadísticas Welford | getWelfordMediana(), getWelfordVarianza(), getWelfordDesviación estándar() | Ofrece alternativas numéricamente más estables para series largas, altos niveles de precios y pequeñas diferencias de valores. |
| Seguimiento mínimo/máximo | getMin(), getMax(), getMinIndex(), getMaxIndex(), getMinMaxRange() | Describe los valores extremos, sus posiciones y el rango actual del buffer para evaluaciones rápidas de estado. |
| Historial de rangos | getRangoPromedio(), getHistorialRango() | Muestra cómo evoluciona el rango a lo largo del tiempo y admite el análisis de volatilidad. |
| Cambio medio | getDiferenciaPromedio() | Mide el cambio medio absoluto entre valores válidos consecutivos y ayuda a evaluar la dinámica del mercado. |
16. Actualizaciones y soporte:
- Soporte exclusivamente a través del sistema de comunicación interno MQL5
- Los informes de error y las sugerencias de mejora se responden con prontitud.
