Curso de Programación. 12.2. El Parabolic como stop de pérdidas.

La semana pasada adelantábamos que el Parabólico como método de stop dinámico era uno de los usos más generalizados a la hora de aplicar ésta herramienta en las estrategias de inversión.

Esta semana analizaremos este método, explicando los puntos a favor y en contra de su aplicación, los aspectos técnicos que hay que considerar y por último viendo un ejemplo donde se hace uso de dicho tipo de stop dinámico.

El Parabólico como Stop de Pérdidas

La justificación del uso del parabólico como método de salida se fundamenta en las propiedades teóricas de éste indicador.

Según dicha teoría, la ruptura del parabólico permite anticipar una inversión de la tendencia, por lo que si colocásemos un stop de protección al nivel que marca el indicador, nos evitaremos pérdidas innecesarias, ya que no tendríamos que esperar a que los precios confirmaran el cambio de dirección a un precio probablemente más alejado de la posición de entrada.

Por tanto, el punto a favor de éste método será una supuesta disminución de las pérdidas ante un cambio de dirección. Mientras que en contra de ésta idea tendremos el hecho de que al no esperar a la confirmación dada por los precios, aumentaremos el margen de error a causa de cierres precipitados.

En cuanto a las comparación frente al Trailing Stop tradicional, encontramos que éste nuevo tipo de stop dinámico se adapta mejor a la evolución del precio, ya que su movimiento es mucho más suavizado que el generado por un trailing clásico.

El punto en contra que presenta surge especialmente en las fases laterales, debido a que durante dichas fases el parabólico puede no estar situado a favor de la posición abierta (salvo que las propias entradas vengan definidas en función del indicador).

Otro problema que presenta puede surgir en los momentos de cruce según como se comporte el precio. En la siguiente imagen podemos ver un ejemplo de este tipo de situaciones:




Ante estos casos, el inversor puede optar o bien por deshacer posición a mercado cuando detecte la señal de cambio (como medida de seguridad en caso de que no haya saltado el stop) o bien algo más complejo, que consistiría en calcular el valor teórico del parabólico para la siguiente barra y enviar el stop a dicho precio.

Este dato no nos lo facilita la propia herramienta, por lo que deberíamos de obtenerlo con nuestros propios medios.

Debido a su complejidad, dedicaremos el artículo de la semana que viene especialmente a esto.

Control Tipo de Orden Según Posición
En el anterior ejemplo, además de lo comentado, podemos ver cómo, llegado a un punto, el indicador puede estar marcando un precio no válido como referencia de un posible stop de pérdidas.

Si no tuviéramos en cuenta estos casos, caeríamos en el error de enviar órdenes stop a precios superados, generando el posible rechazo de la orden o bien la ejecución inmediata de la misma al precio de mercado, tal y como vemos en la siguiente imagen:



Cuando suceda esto, vamos a proponer dos posibles soluciones:
1) Si el valor no es válido, usar un stop de pérdidas fijo en lugar del parabólico.
2) Si el valor no es válido, enviar orden de salida por objetivo en lugar de una orden de pérdidas.

En el sistema de ejemplo que les proponemos, optamos por la segunda de las dos opciones. Veamos a continuación dicho sistema.

Estrategia MACD con Stop Parabólico.
Esta estrategia sigue las siguientes condiciones:

1) Cuando el MACD esté por encima de su Media, enviaremos orden stop a Largo al precio máximo de cada barra.
2) Cuando el MACD esté por debajo de su Media, enviaremos orden stop a Corto al precio mínimo de cada barra.

Es decir, que no vamos a entrar a mercado, sino que vamos a esperar a que el precio confirme la tendencia. Además, prácticamente siempre vamos a estar dentro de mercado.

Añadiremos un intervalo horario de operativa y además usaremos el Parabolic como stop de pérdidas dinámico.

El diseño del sistema quedaría de la siguiente forma:

Código PDV


(NOTA: Recuerden que el código aquí expuesto sólo incluye los métodos OnCalculateBar() yOnInitCalculate(). Tengan esto en cuenta a la hora de copiar el sistema).

Código VBA


'¡¡ Parameters
Dim Contratos As Long '1
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim Periodo1 As Integer '12
Dim Periodo2 As Integer '26
Dim PeriodoC As Integer '9
Dim AccStart As Double '0.02
Dim AccInc As Double '0.04
Dim AccMax As Double '0.2
'Parameters !!
Dim macddata As DataIdentifier
Dim parabdata As DataIdentifier
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
    macddata = .GetIndicatorIdentifier(MACD, Data, Periodo1, Periodo2, PeriodoC, Price.PriceClose, 0)
    parabdata = .GetIndicatorIdentifier(PARABOLICU, Data, AccStart, AccInc, AccMax)
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
    If (.Time >= HoraIni And .Time < HoraFin) Then
        Dim macdact As Double
        Dim medsigact As Double
        Dim parabact As Double
        Dim lanzarorden As Integer
    
        parabact = .GetIndicatorValue(parabdata)
        macdact = .GetIndicatorValue(macddata)
        medsigact = .GetIndicatorValue(macddata, 0, 2)
    
        'entradas
        If (.GetMarketPosition <> 1 And macdact > medsigact) Then
            .Buy AtStop, Contratos, .High()
        ElseIf (.GetMarketPosition <> -1 And macdact < medsigact) Then
            .Sell AtStop, Contratos, .Low()
        End If
        'salidas
        If (.GetMarketPosition = 1) Then
            'salida largos
            If (.Close() > parabact) Then
                .ExitLong AtStop, Contratos, parabact
            Else
                .ExitLong AtLimit, Contratos, parabact
            End If
        ElseIf (.GetMarketPosition = -1) Then
            'salida cortos
            If (.Close() < parabact) Then
                .ExitShort AtStop, Contratos, parabact
            Else
                .ExitShort AtLimit, Contratos, parabact
            End If
        End If
    Else
        If (.GetMarketPosition = 1) Then
            .ExitLong AtClose, Contratos
        ElseIf (.GetMarketPosition = -1) Then
            .ExitShort AtClose, Contratos
        End If
    End If
End With
End Sub

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