Curso de Programación 13.2. El Canal de Keltner (2).

Esta semana finalizamos el estudio del indicador Canal de Keltner analizando las señales de tipo sobrecompra y sobreventa asociadas a ésta herramienta.

Uso del canal como señal de agotamiento.
Si partimos de la premisa de que la superación del canal por parte de los precios implica el agotamiento de la tendencia dominante, podemos considerar los siguientes supuestos:

1) Si el precio del subyacente queda por encima del canal, entonces estamos ante un fin de impulso alcista.
2) Si el precio del subyacente queda por debajo del canal, entonces estamos ante un fin de impulso bajista.

La explicación a estas definiciones se fundamenta en que los valores que quedan fuera del canal de precios esperados suponen una fuerte desviación respecto a lo sucedido durante el periodo previo. No obstante, la aparición de esta situación solamente implica movimientos excepcionales en el precio, pero no necesariamente un comportamiento determinado posterior al evento. Asumir esta señal como señal de fin de tendencia y posible inicio de tendencia contraria es una de las posibles estrategias a seguir, si bien puede considerarse como más agresiva, puesto que la incertidumbre acerca de un cambio de tendencia es alta, ya que no hay aún indicios que confirmen la señal de cambio.

Reglas de entrada
Una vez hemos tomado la decisión de usar el canal como señal de agotamiento, la estrategia a seguir viene a ser igual a la de todos los indicadores que usan esta metodología: Estando el subyacente en las zonas de agotamiento, cuando el precio retroceda al interior del canal, operaríamos a favor del movimiento de retroceso.

Tal y como hemos comentado, el riesgo a posibles entradas fallidas es mayor con éste método que utilizando una estrategia de ruptura de canal (vista en el anterior artículo de estrategias). De modo que aplicaremos un filtro de entrada como medida de seguridad que nos permita evitar en mayor medida los errores de fin de tendencia previa:

1) Precio de entrada a largos = Banda Inferior del Canal + %FiltroEntrada.
2) Precio de entrada a cortos = Banda Superior del Canal - %FiltroEntrada.

En la siguiente imagen, podemos ver cómo este método evita una entrada a largo en pleno proceso de caída de precios:




Reglas de salida
Puesto que estamos suponiendo que la salida de los precios fuera del canal implicaría el final del impulso previo, debemos usar esta información también para las reglas de salida. Así, si se realiza un nuevo negocio y el movimiento es favorable, el objetivo de dicha operación se situará en el extremo opuesto del canal de Keltner:

1) Entrada a Largo = Objetivo alcanzar la banda superior.
2) Entrada a Corto = Objetivo alcanzar la banda inferior.

Comparación con las Bandas de Bollinger
Como ya comentamos en el anterior artículo, el estudio de éste indicador es muy similar al que pueda hacerse relativo a las Bandas de Bollinger. Inicialmente, no podemos determinar cual de los dos tipos de canales de precios ofrece mejores garantías, puesto que es una información que puede depender de muchos factores (el tipo de producto a utilizar, la compresión temporal, los parámetros aplicados, etc...), creemos interesante diseñar una estrategia que siga las mismas pautas pero aplicada al indicador de Bollinger.

La opción que vamos a plantear va a consistir en integrar las Bandas de Bollinger al sistema a diseñar, de modo que podamos elegir entre éste o el canal de Keltner, y así comparar resultados que nos digan con qué herramienta se obtienen mayores garantías de éxito.

Estrategia SobreCompra/SobreVenta
Para el diseño de ésta estrategia, nos vamos a basar en todas las reglas planteadas anteriormente.

Además, incluiremos los siguientes elementos:

1) Un control de pérdidas para evitar perder más de un determinado porcentaje.
2) Un intervalo horario para operar solamente entre las franjas horarias especificadas.
3) Un parámetro al que llamaremos UsarBollinger. Si este parámetro vale cero, quiere decir que descartamos usar Bollinger y que por tanto el sistema se basará en las señales del canal de Keltner. Si vale uno, entonces activa el Bollinger y lo usa como referencia.

El código del sistema quedaría así:

Código PDV



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 EMA_Period As Integer '20
Dim ATR_Period As Integer '10
Dim Constant As Double '2
Dim PctEntrada As Double '0.02
Dim PctPerdida As Double '0.2
Dim UsarBollinger As Integer '0
'Parameters !!
Dim channeldata As DataIdentifier
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
    If (UsarBollinger = 0) Then
        channeldata = .GII(KELTNER02, Data, EMA_Period, ATR_Period, Constant)
    Else
        channeldata = .GII(BollingerBands, Data, EMA_Period, Constant, PriceClose, AvgExponential)
    End If
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
    If (.Time >= HoraIni And .Time < HoraFin) Then
        Dim bandasup As Double
        Dim bandainf As Double
     
        If (UsarBollinger = 0) Then
            bandainf = .GetIndicatorValue(channeldata, 0, 1)
            bandasup = .GetIndicatorValue(channeldata, 0, 3)
        Else
            bandasup = .GetIndicatorValue(channeldata, 0, 2)
            bandainf = .GetIndicatorValue(channeldata, 0, 3)
        End If
     
        Dim pcomprar As Double
        Dim pvender As Double
     
        'entradas
        If (.GetMarketPosition <> 1 And .Close() < bandainf) Then
            pcomprar = bandainf * (1 + PctEntrada / 100)
            .Buy AtStop, Contratos, pcomprar
            'stop primera barra
            .ExitLong AtStop, Contratos, pcomprar * (1 - PctPerdida / 100)
        End If
        If (.GetMarketPosition <> -1 And .Close() > bandasup) Then
            pvender = bandasup * (1 - PctEntrada / 100)
            .Sell AtStop, Contratos, pvender
            .ExitShort AtStop, Contratos, pvender * (1 + PctPerdida / 100)
        End If
        'salidas
        If (.GetMarketPosition = 1) Then
            'salida largos
            If (PctPerdida <> 0) Then
                .ExitLong AtStop, Contratos, .GetEntryPrice() * (1 - PctPerdida / 100)
            End If
            .ExitLong AtLimit, Contratos, bandasup
        ElseIf (.GetMarketPosition = -1) Then
            'salida cortos
            If (PctPerdida <> 0) Then
                .ExitShort AtStop, Contratos, .GetEntryPrice() * (1 + PctPerdida / 100)
            End If
            .ExitShort AtLimit, Contratos, bandainf
        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

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

Bollinger Volatility Oscillator N