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
Interesante artículo. Es cierto que algunas veces nuestras estrategias hacen reentradas "no esperadas". A la hora de hacer un análisis de la ejecución de las estrategias desarrolladas. ¿Hay algún registro de las ordenes lanzadas/ejecutadas en una estrategia? En el modo de programación, a parte de la herramienta de depuración de código, echo de menos una forma de conocer en cada momento qué ordenes hay pendientes y cual de ellas son ejecutadas; tampoco he encontrado información sobre el orden de ejecución de las ordenes lanzadas; no me refiero a ordenes enlazadas, sino a órdenes lanzadas individualmente en una barra, como se ordena su ejecución en la siguiente barra ¿FIFO, LIFO? ¿dependiendo del tipo de orden o del modo de ejecución, hay una FIFO/LIFO asociada? Pienso que un poco de luz sobre estos temas hará que comprendamos mejor cuando nuestros algoritmos toman una u otra decisión, aunque siempre podemos programar nosotros las restricciones, es mucho más limpio programar acorde al flujo de órdenes que no modificarlo.
ResponderEliminarGracias por el artículo y un saludo.