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
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
Hola!! Por un lado, puede acceder a la lista de órdenes ejecutadas a través de la herramienta de estadística de sistemas. En cuanto a la lista de órdenes activas, Visual Chart ofrece la posibilidad de visualizar sobre el gráfico el precio al que se han ido enviando dichas órdenes. Para ello, accedemos a las propiedades del sistema (una vez está aplicado a un subyacente) y en el campo Ordenes cambiamos la propiedad Histórico = No visible por Historico = Visible. Esta propiedad es de mucha utilidad. En cuanto a cómo se ordena la ejecución de órdenes, la respuesta la puede encontrar dentro del manual que puede descargar desde el siguiente enlace: http://www.visualchart.com/MarketMonitor/EP/VC5/Images/Descargas/SISTEMAS_TRADING_V2.pdf
ResponderEliminar