Diseño de indicadores: Método para trazar una línea entre dos puntos

El presente artículo está enfocado especialmente a todos aquellos programadores que utilicen la plataforma Visual Basic para Visual Chart.

Como saben, a través de la programación con Visual Chart, no sólo podemos montar estrategias de trading, si no que además podemos crear nuestros propios indicadores o estudios.

Esta posibilidad permite una cantidad ilimitada de herramientas de análisis técnico, tantas como ideas existan en el mundo bursátil. Gracias a ello, podemos dibujar patrones de velas (mediante los estudios), definir funciones matemáticas, crear nuevos osciladores o trazar líneas sobre el gráfico.

Este último caso es muy interesante, sobre todo cuando deseamos dibujar sobre la gráfica líneas de tendencia o figuras chartistas. A continuación, veremos un sencillo método que nos servirá para dibujar líneas sobre el gráfico de forma sencilla y recurrente.

Trazando líneas en el gráfico
Supongamos que deseamos crear un indicador que pinte líneas horizontales en base a una serie de soportes y resistencias calculados de forma automática. El proceso sería muy sencillo:
1) Declaramos dos variables globales donde almacenamos los soportes y resistencias.
2) Definimos la regla a través de la cual debe aparecer un nuevo nivel.
3) Utilizamos la función SetIndicatorValue() para dibujar el valor guardado en dichas variables.



'¡¡ Parameters
'Parameters !!
Dim Sup As Double
Dim Res As Double
Option Explicit
Public APP As OscUserApp
Implements Indicator
Public Sub Indicator_OnInitCalculate()
With APP
    Sup = 0
    Res = 0
    .StartBar = 5
End With
End Sub
Public Sub Indicator_OnCalculateBar(ByVal Bar As Long)
With APP
    If (.Low(1) < .Low()) Then
        If (.GetLowestBar(Data, PriceLow, 5) = 1) Then
            If (.GetHighestBar(Data, PriceVolume, 5) = 1) Then
                Sup = .Low(1)
            End If
        End If
    End If
    If (.High(1) > .High()) Then
        If (.GetHighestBar(Data, PriceHigh, 5) = 1) Then
            If (.GetHighestBar(Data, PriceVolume, 5) = 1) Then
                Res = .High(1)
            End If
        End If
    End If
    .SetIndicatorValue Res, 1
    .SetIndicatorValue Sup, 2
End With
End Sub

Compilado el indicador y aplicado a un gráfico, el resultado sería el siguiente:


Lo que hemos hecho es pintar el valor de cada nivel en la barra correspondiente. A partir de ahí, Visual Chart une con líneas cada uno de esos puntos dando la sensación de línea continúa que vemos.

Ahora supongamos que nos interesa trazar las líneas de tendencia que unen cada par de soportes, ya que lo que queremos ver es el momento en el que el precio corta la directriz dibujada.

Aquí el proceso se complica puesto que no basta con guardar un valor y representarlo, sino que tendremos que calcular cada uno de los puntos por los que pasa la recta para poder dibujarlos. Veamos cómo.

Trazando una línea entre dos puntos
Tal y como hemos dicho, lo que buscamos es algo más complejo que lo hecho hasta ahora. No obstante, vamos a ver que en realidad basta con calcular la ecuación de la recta.

En geometría analítica, una línea recta puede ser expresada mediante una ecuación del tipo siguiente:

z = d * m + y.


Donde la variable d sería una variable en el plano cartesiano que define el desplazamiento desde el punto de inicio de la recta. La constante m sería la pendiente de la recta y es la que define la inclinación de la misma. Por último, la variable y sería la ordenada origen, es decir, el valor con el que se inicia la recta.

Si tenemos estos tres datos podemos calcular la variable z, que sería el valor de la recta en un momento determinado (en función del desplazamiento o variable d).

¿Cómo trasladar esto a un gráfico de precios?

Lo primero que tenemos que hacer es definir los dos puntos que deseamos unir mediante una recta a través de sus coordenadas.

Las coordenadas de un punto cualquiera se representan por (x,y).

La primera coordenada se mide sobre el eje de abscisas. El eje de abscisas en nuestro caso sería el Tiempo/Número de barra.

La segunda coordenada se mide sobre el eje de ordenadas. El eje de ordenadas en nuestro caso sería el Precio.

Por tanto, un punto P1 estará definido por un número de barra x1 y por un precio y1.

Otro punto P2 estará definido por otro número de barra x2 y por su precio y2.

Sabiendo esto, pasaríamos a definir la pendiente.

El cálculo de la pendiente (constante m) se obtiene de la siguiente ecuación:

m = (y2 - y1) / (x2 - x1).

Es decir, la diferencia entre precios y la diferencia en número de barras.

Si volvemos a la ecuación de la recta, podemos calcular la segunda coordenada para el punto P2 de la siguiente manera:

y2 = d * m + y1

Donde d = (x2- x1)

Esto mismo nos vale para cualquier otro punto de la recta. Supongamos que queremos calcular el valor de la recta en la barra siguiente al punto P1. El desplazamiento por tanto sería 1. De modo que:

y = 1* m + y1

El valor de la recta dos barras después del punto P1 sería:

y = 2 * m + y1

Y así constantemente.

Si volvemos a nuestro código, lo único que tendríamos que hacer, por tanto, es crear un bucle que se recorriera las barras desde el punto de inicio hasta el punto fin para calcular el valor correspondiente y seguidamente dibujar dicho valor usando SetIndicatorValue().

El código en VBA que habría que añadir tendría el aspecto siguiente:

Dim m As Double
Dim i As Long
Dim ValX As Double
Dim BarValX As Double
If (Barx1 - Barx2) <> 0 Then m = (x2 - x1) / (Barx1 - Barx2)
SetIndicatorValue x1, Linea, Barx1
For i = Barx1 - 1 To BarX Step -1
   ValX = m * (Barx1 - i) + x1
   .SetIndicatorValue ValX, Linea, i
Next i

Esto quiere decir que necesitamos guardar tanto los precios de los puntos que queremos unir como el número de barra donde se han dado.

El código VBA del ejemplo que hemos utilizado quedaría del siguiente modo:

'¡¡ Parameters
'Parameters !!
Dim nbSup As Long
Dim nbSupAnt As Long
Dim Sup As Double
Dim SupAnt As Double
Option Explicit
Public APP As OscUserApp
Implements Indicator
Public Sub Indicator_OnInitCalculate()
With APP
    nbSup = -1
    nbSupAnt = -1
    SupAnt = 0
    Sup = 0
    .StartBar = 5
End With
End Sub
Public Sub Indicator_OnCalculateBar(ByVal Bar As Long)
With APP
    If (.Low(1) < .Low()) Then
        If (.GetLowestBar(Data, PriceLow, 5) = 1) Then
            If (.GetHighestBar(Data, PriceVolume, 5) = 1) Then
                nbSupAnt = nbSup
                SupAnt = Sup
                nbSup = Bar - 1
                Sup = .Low(1)
                If (nbSupAnt <> -1) Then
                    Dim m As Double
                    Dim i As Long
                    Dim ValX As Double
                    Dim BarValX As Double
                    Dim BarX1 As Long
                    Dim BarX2 As Long
                    BarX2 = 1
                    BarX1 = Bar - nbSupAnt
                    If (BarX1 - BarX2) <> 0 Then m = (Sup - SupAnt) / (BarX1 - BarX2)
                    .SetIndicatorValue SupAnt, 3, BarX1
                    For i = BarX1 - 1 To 1 Step -1
                        ValX = m * (BarX1 - i) + SupAnt
                        .SetIndicatorValue ValX, 2, i
                    Next i
                End If
            End If
        End If
    End If
    .SetIndicatorValue Sup, 1
End With
End Sub

El resultado sobre un gráfico sería el siguiente:


En este ejemplo sólo dibujamos soportes y las líneas de tendencia que los unen. Destacar que las líneas de tendencia siempre se pintan hacia atrás, es decir, dibujamos sobre barras que ya forman parte del histórico.

Si en lugar de trazar una línea de tendencia histórica quisiéramos trazar la tendencia en barras posteriores a la aparición de los pivotes de referencia, lo único que tendríamos que hacer es usar la misma fórmula aplicándolo a la última barra:

If (nbSupAnt <> -1) Then
    BarX2 = Bar - nbSup
    BarX1 = Bar - nbSupAnt
    m = (Sup - SupAnt) / (BarX1 - BarX2)
    ValX = m * BarX1 + SupAnt
    .SetIndicatorValue ValX, 2
End If

Comentarios

Entradas populares de este blog

Como consultar el GAP % de un conjunto de valores

Bollinger Volatility Oscillator N

MANEJO DE PLANTILLAS. Eliminar plantilla de un gráfico activa