STMT: Conceptos básicos (1)

STMT ha evolucionado mucho desde su creación y algunas cosas han cambiado. En esta serie de posts vamos a profundizar en la estructura y funciones básicas de STMT.

Empezaremos con los datos pues son fundamentales en el desarrollo de cualquier estrategia.

Los datos vienen emparejados siempre a una fecha. Puede tratarse de un solo dato como en la media o de varios como en el indicador de Bollinger. A veces, con un solo valor disponemos de todos los datos necesarios, como es el caso de las bandas.

STMT optimiza los recursos de la máquina evitando datos redundantes. Veamos el soporte de datos que ofrece STMT.

Line

La clase Line es una línea de datos, pares “fecha, valor” ordenados por la fecha. Tiene un nombre asociado (el código) que veremos posteriormente algunos usos que pueden dársele.

Además incluye información sobre la compresión (5 minutos, 1 día…) de sus datos y como debe actualizarse: en tiempo real, barra a barra, nunca.

stmt1

Esta es una de las clases más complejas de STMT y sus funciones, que veremos más adelante, son muchas. Como adelanto:

  • Permite acceso por posición y por fecha.
  • Permite buscar la fecha más cercana, anterior o posterior, a una dada.
  • Incluye eventos para cuando cambian sus datos.
  • Permite ordenar sus valores con el criterio que se prefiera.
  • Funciones para estimar puntos de corte, valores máximos/mínimos, áreas, velocidades, aceleraciones, suma de valores, promedio, desviación típica, varianza, pendientes, etc.
  • Se puede extender con funciones propias del usuario.

Band

Una banda es un caso particular de línea donde el valor se mantiene constante. Se utiliza en muchos indicadores. STMT gestiona con una clase aparte este tipo de línea para optimizar la velocidad y el consumo de memoria.

Usar una línea para codificar un solo valor supondría una estructura tal que así:

stmt2En su lugar, STMT lo codifica así:

stmt3

Cualquier valor que se solicite, de la fecha que sea, devolverá el valor de la banda. No hay que buscar fechas ni valores pues siempre es el mismo.

Al tratarse de una línea, pueden utilizarse todas las funciones que tienen las líneas.

Lines

Esta clase es otro pilar fundamental de STMT. Lines es un conjunto de líneas y da soporte a los históricos e indicadores.

Existen indicadores con una sola línea, como la media y con más de una línea, como el Bollinger. Se podría utilizar un array de Line para trabajar con varias líneas pero es ineficiente pues para cada dato se tiene repetida la fecha.

Veamos la diferencia gráficamente:

stmt4

Como vemos en la imagen anterior, usando un array de Line la fecha se repite en todas las líneas. Con cada línea extra se desperdicia todo un array de fechas que ya se conoce por las otras líneas.

stmt5Así es como gestiona STMT un conjunto de líneas, con un solo array de fechas. Y si el indicador, que es un conjunto de líneas, tiene bandas la optimización es aún mayor:

stmt6

Lines tiene una propiedad, MainLine, que representa la línea principal. En el caso de Bollinger, la línea central es la principal. Cuando una operación se tiene que realizar sobre una sola línea y no se indica cual, se usa la principal.

El conjunto de líneas tiene un código de modo que puede dársele un nombre al conjunto de líneas (que serán un indicador, histórico…) y a cada una de sus líneas. Así, un histórico puede tener como código “010015FDAX” y sus líneas “Open, Close, Max…”.

Cuando se trabaja con un objeto Lines, se puede acceder a sus líneas por posición y por nombre:

Line line0 = myIndicator[0];
Line upperBand = myIndicator[“UpperBand”];

Al igual que la línea, el conjunto de líneas generan eventos cuando cambia su contenido. Al trabajar con varias líneas, interesa cuando todas ellas han cambiado en lugar de cuando cambia cada una de ellas. Cuando cambia una barra de un histórico, tiene sentido trabajar cuando se han actualizado todas sus líneas (apertura, cierre…).

Ejemplos de uso

Veamos algunos ejemplos de código que usa líneas y las posibilidades que tiene. Esto quedará más claro cuando avancemos, en otro post, con los indicadores e históricos.

Average es un indicador de media simple y Bollinger es el indicador de Bollinger con un periodo distinto al de la media. Este fragmento de código compara el valor de ambas medias y si es mayor que el tamaño de caja del histórico de Renko (las medias están separadas más de una caja) devuelve false.

    DateTime date = this.Historic.Dates[index];
    double avg = this.Average.MainLine[date];
    double bollinger = this.Bollinger.MainLine[date];
    if (Math.Abs(bollinger - avg) > this.RenkoHistoric.BoxSize)
    {
        return false;
    }

 

Este código son fragmentos sueltos de un método que detecta cuellos de botella en el indicador de Bollinger. Utiliza lógica difusa para determinar si se produce o no un cuello de botella. Se omite bastante código que no es relevante para los objetivos de esta entrada:

int startdayIndex = this.Historic.Dates.NearIndexOf(this.StartDate.Date, -1);
for (int i = index; i >= startdayIndex; i--)
{
    DateTime barDate = this.Historic.Dates[i];
    double height = this.Bollinger.UpperBand[barDate] - this.Bollinger.LowerBand[barDate];
    double min = this.Historic.Min[i];
    double max = this.Historic.Max[i];
    ...

En este caso, el código clasifica tendencias usando pivots y rectas de regresión:

Line middleLine = historic["Middle"];

// Pivot a izquierda relevante
DateTime startTrendDate = historic.Dates[startIndex];

// Desde el pivot montar una recta de regresión de X minutos hacia delante
double average, desv, maxUpperOffset, maxLowerOffset;
EcuationLine ecuation = middleLine.LinealRegression(
startIndex, endIndex, out average, out desv, out maxUpperOffset, out maxLowerOffset);

Iremos viendo más código de ejemplo y cada vez más completo pero sirvan estos ejemplos para ver el funcionamiento de las líneas.

Anuncios
Galería | Esta entrada fue publicada en STMT. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s