Curso de Programación. 9.3. Commodity Channel Index. Objetivo de Ganancias.

Finalizamos el tema 9 centrándonos en un aspecto general de cualquier tipo de estrategia: La aplicación de un objetivo de ganancia como método de salida de negocio. Vamos a ver cómo incluir este tipo de gestión al sistema que hemos desarrollado durante este tema. Para ver la estrategia de referencia, pueden acceder al siguiente artículo.

El Objetivo de Ganancias
Incluir un objetivo de ganancias a nuestro sistema nos permite asegurar un nivel de ganancia preestablecido para cada posición abierta.

Por tanto, este tipo de operación es similar al stop de pérdidas pero en sentido inverso, es decir, para controlar la recogida de beneficios.

El inconveniente que presenta éste tipo de órdenes es que estamos limitando la ganancia cuando el movimiento está siendo favorable, perdiendo la oportunidad de recoger un mayor número de beneficios, ya que probablemente el impulso se prolongue más allá de nuestro punto de salida.

A raíz de ésta reflexión, podríamos distinguir entre dos tipos de escenarios donde la utilización de un objetivo de ganancias afecta de una manera u otra a los sistemas:

1) El mejor escenario sería en aquellos mercados donde la volatilidad es alta y por tanto podemos encontrar movimientos de poco recorrido. En estos casos, un objetivo de ganancias nos puede asegurar recoger un mínimo de ganancias para cada negocio, como podemos ver en el siguiente ejemplo:



2) El peor escenario sería en aquellos mercados con movimientos tendenciales de largo recorrido, ya que cortaremos las ganancias antes de tiempo. Ejemplo:




Como vemos, el uso de órdenes objetivo es más favorable cuando la estrategia trata de buscar operaciones a corto plazo.

Obviamente, estas consideraciones no pueden servirnos cuando desconocemos el comportamiento del valor sobre el que aplicaremos nuestra estrategia, si bien nos permite destacar los casos donde un objetivo de ganancias puede mejorar o empeorar los resultados de un sistema.

Consideraciones relativas al uso de Objetivos y StopLoss
En lo que respecta al uso combinado de órdenes objetivo y órdenes stoploss desde una estrategias automática, aclarar que el modo de comportarse de éste par de órdenes simula al tipo de órdenes OCO: Es decir, que no tenemos que controlar la cancelación de una u otra orden porque se realiza de forma automática.

Así, en cuanto se ejecuta alguna de las dos órdenes de salida, la orden vigente queda cancelada automáticamente. Este proceso es transparente para el usuario y por tanto no hay que realizar ninguna gestión en lo que respecta a esto desde el código del sistema.

Estrategia CCI con Objetivo
A continuación, vamos a modificar el sistema ejemplo del punto 9.2 aplicándole un objetivo de ganancias.

Para ello, vamos a incluir en el sistema lo siguiente:
1) Un parámetro para determinar la distancia del objetivo de ganancias al que llamaremos TakeProfit.
2) Un parámetro para poder elegir entre un objetivo porcentual o en puntos al que llamaremos PtosOPcte.
3) Las correspondientes órdenes de salida utilizando como tipo de orden las órdenes LIMITADAS.

Por último, vamos a añadir un control para que el sistema no realice reentradas una vez ha cerrado un negocio por alcanzar el stop o el objetivo, de modo que espera a la siguiente orden de sentido inverso para volver a entrar.

Para controlar esta gestión, añadiremos una variable llamada UlNegocio que se irá actualizando con cada nuevo negocio. Luego, incluiremos dentro de las condiciones de entrada un control en función del valor de dicha variable.

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

Código PDV


Codigo VBA

'¡¡ Summary
' Classification: Curso
'Summary !!
'¡¡ 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
Dim TakeProfit As Double '100
Dim PtosOPcte As Integer '0 '0=Puntos 1=Porcentaje
'Parameters !!
Dim CCIUData As DataIdentifier
Dim PrecioSTOP As Double
Dim pip As Double
Dim UlNegocio As Integer
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)
    UlNegocio = 0
    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) And UlNegocio <> 1 Then
        .Buy AtClose, Contratos
        UlNegocio = 1
    ElseIf (CCIact < BandaVenta And CCIant >= BandaVenta) And UlNegocio <> -1 Then
        .Sell AtClose, Contratos
        UlNegocio = -1
    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
        If TakeProfit <> 0 Then
            If PtosOPcte = 0 Then
                .ExitLong AtLimit, Contratos, .GetEntryPrice() + (TakeProfit * pip)
            Else
                .ExitLong AtLimit, Contratos, .GetEntryPrice() * (1 + TakeProfit / 100)
            End If
        End If
    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
        If TakeProfit <> 0 Then
            If PtosOPcte = 0 Then
                .ExitShort AtLimit, Contratos, .GetEntryPrice() - (TakeProfit * pip)
            Else
                .ExitShort AtLimit, Contratos, .GetEntryPrice() * (1 - TakeProfit / 100)
            End If
        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

Estudio de las divergencias en el RSI