Curso de Programación. 12.3. Parabolic como stop de pérdidas (II).

En el último artículo dedicado al estudio del parabólico, comentábamos que uno de los usos más extendidos a la hora de trabajar con dicho indicador era como nivel de referencia para el cálculo del stop de protección.

Referente a ésto, debemos entender que a la hora de activar los stops, se asigna como precio de salida el valor actual del parabólico, de manera que actúe sobre la barra siguiente: Es decir, el stop se ejecutará si durante la formación de la barra siguiente se alcanza el precio actual del parabólico.

No obstante, existe un problema: En lo que se refiere a la teoría del indicador, el giro sucede cuando el precio cruza el valor del parabólico calculado para la misma barra, el cual no tiene por qué necesariamente coincidir con el valor calculado en la barra anterior.

Veamos un ejemplo que ilustre el problema. En la siguiente imagen, observamos un movimiento bajista acompañado de un parabólico también bajista y un negocio a corto iniciado algunas barras antes. El negocio va colocando el stop de pérdidas al precio dado por el parabólico. En la barra A el stop de pérdida se sitúa en el punto marcado por la flecha, sin embargo, observamos que en la barra B éste precio no es alcanzado mientras que el parabólico sí que realiza el giro. Esto es debido a que el indicador calcula el valor correspondiente a dicha barra (el valor marcado dentro del círculo) y al observar que éste valor ha sido superado por el precio, ejecuta el giro. Como el negocio usó como valor de referencia el valor del parabólico en la barra anterior, la operación permanece abierta, lo que difiere de lo que hace el indicador.




¿Existe un modo de evitar ésta desorganización? En el siguiente punto vamos a proponer un método para solucionar esto: Calcular el posible candidato a siguiente valor del parabólico.

Cálculo del valor siguiente
Realizar el cálculo del posible siguiente valor del parabólico es posible, ya que a través de la fórmula del mismo podemos adelantarnos a dicho resultado. La fórmula en cuestión que usaríamos sería la siguiente:



De donde:
1) Parab sería el valor del parabólico en la barra actual.
2) UlTope sería el último máximo calculado dentro de la tendencia alcista, o bien el último mínimo calculado dentro de la tendencia bajista.
3) UlCoef sería el valor actual del coeficiente de aceleración, sabiendo que debemos cumplir la siguiente regla: Iniciamos éste valor con el parámetro llamado AccStart. A partir de ahí, aumentamos su valor según el parámetro AccInc. Por último, UlCoef nunca puede superar el valor máximo, definido por el parámetro AccMax. De modo que si lo supera lo sustituimos por éste.

Sabiendo la fórmula para calcular el valor siguiente. El proceso a seguir sería el siguiente:

Caso proceso del parabólico alcista.
1) Si es la barra de giro de bajista a alcista, se inicializan las variables UlCoef = AccStart y UlTope = Maximo de la barra.
2) Si no es una barra de giro, se comprueba si el Máximo es mayor que UlTope. De ser así, se actualiza y se incrementa el valor de UlCoef.
3) Hecho esto, se aplica la fórmula.
4) Por último, debe cumplirse una regla asociada al parabólico: El valor obtenido no puede ser mayor que el mínimo de las dos últimas barras. Si ocurre esto, se iguala a dicho mínimo.

Caso proceso del parabólico bajista.
1) Si es la barra de giro de alcista a bajista, se inicializan las variables UlCoef = AccStart y UlTope = Mínimo de la barra.
2) Si no es una barra de giro, se comprueba si el Mínimo es menor que UlTope. De ser así, se actualiza y se incrementa el valor de UlCoef.
3) Hecho esto, se aplica la fórmula.
4) Por último, debe cumplirse una regla asociada al parabólico: El valor obtenido no puede ser menor que el máximo de las dos últimas barras. Si ocurre esto, se iguala a dicho máximo.

Una vez explicados los pasos a seguir para calcular el siguiente valor del parabólico, veamos como aplicarlo a una estrategia automática.

Estrategia MACD con Stop Parabólico (II).
Esta estrategia es exactamente igual a la vista en el punto 12.2. Dicho sistema 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.

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

Existen dos características nuevas entre ésta versión y la versión del punto 12.2. Serían las siguientes:

1) El valor que usaremos como stop de pérdidas será el valor siguiente del parabólico, el cual calcularemos.

2) Además, vamos a incluir un control para que el sistema coloque el stop de pérdidas desde la primera barra. Esto sólo podrá hacerse cuando el valor calculado para el parabólico pueda cumplir como stop de pérdidas, cuestión que comprobaremos.

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

Código PDV

A fin de agilizar el diseño del sistema en PDV, el proceso que vamos a seguir va a ser el siguiente:

1. Primero, vamos a crear un indicador que genere el valor del SigParabolic. El código de dicho indicador sería el siguiente:


2. Segundo, procedemos a desarrollar el sistema de modo que ahora el indicador de referencia pasará a ser éste nuevo indicador al que hemos llamado PARABSIG:


Código VBA

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

'¡¡ 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
Dim Gananancia As Double '12
Dim StopIni As Double '30
'Parameters !!
Dim macddata As DataIdentifier
Dim parabdata As DataIdentifier
Dim ulcoef As Double
Dim ultope As Double
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)
    ulcoef = 0
    ultope = 0
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 parabant As Double
        Dim sigparab As Double
        Dim lanzarorden As Integer
        Dim dosmin As Double
        Dim dosmax As Double
  
        'calculo del siguiente valor del parabólico
        parabact = .GetIndicatorValue(parabdata)
        parabant = .GetIndicatorValue(parabdata, 1)
        If (parabact < .Low()) Then
            'alcista
            If (parabant = NullValue Or parabant > .High(1)) Then 'cambio
                'inicializar
                ulcoef = AccStart
                ultope = .High()
            Else
                'actualizar
                If (.High() > ultope) Then 

                     ultope = .High()
                     ulcoef = ulcoef + AccInc
                     If (ulcoef > AccMax) Then ulcoef = AccMax

                End If
             End If
            dosmin = .GetLowest(Data, PriceLow, 2)
            'siguiente parabolico
            sigparab = parabact + ((ultope - parabact) * ulcoef)
            If (sigparab > dosmin) Then sigparab = dosmin
        Else
            'bajista
            If (parabant = NullValue Or parabant < .Low(1)) Then 'cambio
                'inicializar
                ulcoef = AccStart
                ultope = .Low()
            Else
                'actualizar
                If (.Low() < ultope) Then 

                     ultope = .Low()
                     ulcoef = ulcoef + AccInc

                     If (ulcoef > AccMax) Then ulcoef = AccMax
                End If
            End If
            dosmax = .GetHighest(Data, PriceHigh, 2)
            'siguiente parabolico
            sigparab = parabact + ((ultope - parabact) * ulcoef)
            If (sigparab < dosmax) Then sigparab = dosmax
        End If
        macdact = .GetIndicatorValue(macddata)
        medsigact = .GetIndicatorValue(macddata, 0, 2)
        'entradas
        If (.GetMarketPosition <> 1 And macdact > medsigact) Then
            .Buy AtStop, Contratos, .High()
            'control 1ª barra
            If (.Close() > sigparab) Then
                .ExitLong AtStop, Contratos, sigparab
            End If
        ElseIf (.GetMarketPosition <> -1 And macdact < medsigact) Then
            .Sell AtStop, Contratos, .Low()
            'control 1ª barra
            If (.Close() < sigparab) Then
                .ExitShort AtStop, Contratos, sigparab
            End If
        End If
        'salidas
        If (.GetMarketPosition = 1) Then
            'salida largos
            If (.Close() > sigparab) Then
                .ExitLong AtStop, Contratos, sigparab
            Else
                .ExitLong AtLimit, Contratos, sigparab
            End If
        ElseIf (.GetMarketPosition = -1) Then
            'salida cortos
            If (.Close() < sigparab) Then
                .ExitShort AtStop, Contratos, sigparab
            Else
                .ExitShort AtLimit, Contratos, sigparab
            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

El indicador Relative Strength Mansfield with Index

Trading Tools: Descarga de históricos para Visual Chart 6

KDJ - Indicador Stochastic %J