Curso de Programación. 9.2. Commodity Channel Index. Stop Dinámico.

La semana pasada hemos visto cómo utilizar el indicador Commodity Channel Index (CCI) como método de entrada en un sistema partiendo de las diferentes técnicas de estudio aplicadas a éste indicador.

En el presente artículo vamos a ver cómo usar la información que nos aporta el indicador para gestionar nuestras órdenes de salida, en concreto, cómo generar un stop de pérdidas dinámico en función del indicador.

El Stop de Pérdidas Dinámico
Cuando hablamos de un stop de pérdidas dinámico (o trailing stop), nos estamos refiriendo a una clase de stop de pérdidas (el cual nos sirve para controlar el nivel máximo de pérdida) que se adapta a los movimientos del precio.

El stop dinámico actúa de la siguiente forma:
1) Si el movimiento es favorable, nos permite garantizar una ganancia mínima, puesto que aprovecha el avance de los precios a favor de nuestra posición, colocando el valor del stop a un precio que, aún en caso de que se produjera un retroceso, recoge ganancias por estar mejor situado que el propio precio de entrada.

2) Si el movimiento es desfavorable, el uso de este stop no va a afectar al nivel máximo de pérdida especificado, puesto que un stop dinámico bien diseñado no debe retrasar nunca el valor del stop más allá de dicho nivel.

Para calcular este stop, debemos partir del precio de entrada y de la máxima pérdida permitida. A partir de este valor, moveremos el stop sólo si el nuevo valor propuesto es más favorable que el último valor guardado. Ejemplo:




Stop Dinámico en función del CCI
Una vez hemos visto cómo actúa un stop dinámico, vamos a proceder a diseñar uno muy específico en función del CCI.

Para ello, partiremos de la siguiente teoría asociada al indicador:

1) Cuando el CCI se aleja de la banda cero, implica un fuerte movimiento.
2) Cuando el CCI retroce y se aproxima a la banda cero, puede informar del agotamiento del impulso.

Utilizando esta premisa como referencia, consideraremos los siguientes criterios para nuestro sistema:

1) Cuando el CCI se aleja de la banda cero, dejaremos correr el negocio, ya que esperamos que el precio se mueva a favor de la orden. En lo que respecta al stop de pérdidas, lo mantendremos en el nivel inicial o bien no lo moveremos desde su último estado.
2) Cuando el CCI retrocede y se aproxima a cero, suponemos que el impulso empieza a agotarse y que por tanto no avanzará mucho más. Como consecuencia, vamos a acercar el stop de pérdidas al precio para garantizar una mínima ganancia.

Veamos un ejemplo:



Como vemos, la idea es simple: En lugar de modificar el stop en función del crecimiento del precio, lo movemos una vez el CCI nos indica que el impulso se ha agotado.

Estrategia Stop Loss CCI
Una vez hemos explicado cual es el procedimiento que va a seguir ésta clase de stop de pérdidas, a continuación vamos a diseñar la estrategia propiamente dicha.

Para ello, vamos a partir del sistema planteado en el anterior artículo de éste curso de programación. En este caso, usaremos únicamente las reglas de entrada asociadas al método tendencial, es decir, entrar en mercado cuando se produzca el corte del CCI sobre sus bandas de confirmación de tendencia (+100 y -100).

El diseño del sistema sería el siguiente:

Código PDV


Código VBA

'¡¡ Parameters
Dim Contratos As Long '1
Dim PeriodoP As Integer '30
Dim PeriodoM As Integer '30
Dim MinMov As Double '0.015
Dim BandaCompra As Double '100
Dim BandaVenta As Double '-100
Dim StopLossIni As Double '50
'Parameters !!
Dim CCIUData As DataIdentifier
Dim PrecioSTOP As Double
Dim pip As Double
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
    CCIUData = .GetIndicatorIdentifier(CCIU, Data, PeriodoP, PeriodoM, MinMov, 0)
    pip = .GetSymbolInfo(SbiMinMov)
    PrecioSTOP = 0
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
    Dim CCIact As Double
    Dim CCIant As Double
    Dim NewStop As Double
 
    CCIact = .GetIndicatorValue(CCIUData)
    CCIant = .GetIndicatorValue(CCIUData, 1, 1)
 
    If (CCIact > BandaCompra And CCIant <= BandaCompra) Then
        .Buy AtClose, Contratos
    ElseIf (CCIact < BandaVenta And CCIant >= BandaVenta) Then
        .Sell AtClose, Contratos
    End If
 
    If .GetMarketPosition = 1 Then
        If .GetBarsSinceEntry = 1 Then
            PrecioSTOP = .GetEntryPrice - StopLossIni
        Else
            NewStop = .Low - (CCIact * pip)
            If (NewStop > PrecioSTOP) Then PrecioSTOP = .Low - (CCIact * pip)
        End If
        .ExitLong AtStop, Contratos, PrecioSTOP
    ElseIf .GetMarketPosition = -1 Then
        If .GetBarsSinceEntry = 1 Then
            PrecioSTOP = .GetEntryPrice + StopLossIni
        Else
            NewStop = .High - (CCIact * pip)
            If (NewStop < PrecioSTOP) Then PrecioSTOP = .High - (CCIact * pip)
        End If
        .ExitShort AtStop, Contratos, PrecioSTOP
    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