II Curso de Programación. Sistema Ejercicios 36-37
Esta semana publicamos los ejercicios 36 y 37 de nuestro 2º Curso de Programación para VIsual Chart 5. Se finaliza con ellos el conjunto de artículos que hemos dedicado a repasar las estrategias de dicho curso de programación.
Sistema Ejercicio 36. Entradas en base a una segunda serie de datos
Este ejercicio va a resultar sumamente interesante ya que muchos usuarios trabajan utilizando varios productos a la vez. La idea elemental es la siguiente: Queremos operar sobre un producto financiero concreto, si bien deseamos que las señales de compra y venta dependan de un segundo producto.
En este ejercicio 36, por ejemplo, operamos sobre el Mini-Ibex si bien las condiciones dependen de un CCI aplicado sobre el Ibex Grande:
En la imagen observamos cómo el CCI se calcula respecto al Ibex Grande (MFXI). Cada vez que el indicador cruza la banda central, se genera una nueva señal en el Ibex Pequeño (MFMI).
Las reglas por tanto de la estrategia a diseñar serían las siguientes:
Si el CCI (sobre Ibex Grande) es mayor que 0, tomar posiciones largas en Ibex Pequeño.
Si el CCI (sobre Ibex Grande) es menor que 0, tomar posiciones cortas en Ibex Pequeño.
Además, vamos a añadir un stoploss y un objetivo de ganancias.
Como veremos más adelante en el código, la condición esencial es utilizar como serie de datos el identificador Data2. Este identificador genérico, sirve para hacer referencia al segundo gráfico que aplicamos en la misma ventana. En nuestro ejemplo, el identificador Data2 hará referencia al Ibex Grande, si bien en si cambiáramos dicha serie por otra, Data2 tomaría como referencia la nueva serie de datos elegida.
Problemas con una compresión temporal mayor
Un factor relevante a tener en cuenta sucede cuando tratamos de usar como segunda serie de datos un gráfico con una compresión temporal mayor. Al hacer esto, es necesario gestionar cuándo se está produciendo el cambio de barra en la compresión temporal mayor ya que, de no hacer esto, tendremos problemas a la hora de generar nuevos negocios:
La solución para evitar esto consistirá en comprobar las reglas de entrada (o salida) sólo en el momento exacto en el que se produzca el cambio de barra de la segunda serie de datos. Este proceso lo vemos representado en el código que incluimos como ejemplo.
Anexo: Ejercicio 37
Ampliamos la estrategia diseñada durante el ejercicio 36 con la siguiente variación: aplicar una salida parcial haciendo lo siguiente:
1) Añadir una Media Simple (15) pero en este caso sobre el Ibex Pequeño.
2) Operar al menos con 2 contratos.
3) Cuando el mercado cruce a la media, cerrar la mitad de los contratos (orden a mercado).
4) El resto mantenerlos hasta tocar las salidas (objetivo o stop de pérdidas).
Debemos añadir un control entrada de modo que cumpla dirección de la media para que la estrategia siga una lógica.
En la imagen observamos cómo el sistema abre largos con 2 contratos y cierra uno cuando el cierre de una barra queda por debajo de la media (aplicada sobre el Ibex Pequeño). El contrato que sigue vigente se liquida cuando llega la señal contraria de venta.
El diseño 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).
Sistema Ejercicio 36. Entradas en base a una segunda serie de datos
Este ejercicio va a resultar sumamente interesante ya que muchos usuarios trabajan utilizando varios productos a la vez. La idea elemental es la siguiente: Queremos operar sobre un producto financiero concreto, si bien deseamos que las señales de compra y venta dependan de un segundo producto.
En este ejercicio 36, por ejemplo, operamos sobre el Mini-Ibex si bien las condiciones dependen de un CCI aplicado sobre el Ibex Grande:
En la imagen observamos cómo el CCI se calcula respecto al Ibex Grande (MFXI). Cada vez que el indicador cruza la banda central, se genera una nueva señal en el Ibex Pequeño (MFMI).
Las reglas por tanto de la estrategia a diseñar serían las siguientes:
Si el CCI (sobre Ibex Grande) es mayor que 0, tomar posiciones largas en Ibex Pequeño.
Si el CCI (sobre Ibex Grande) es menor que 0, tomar posiciones cortas en Ibex Pequeño.
Además, vamos a añadir un stoploss y un objetivo de ganancias.
Como veremos más adelante en el código, la condición esencial es utilizar como serie de datos el identificador Data2. Este identificador genérico, sirve para hacer referencia al segundo gráfico que aplicamos en la misma ventana. En nuestro ejemplo, el identificador Data2 hará referencia al Ibex Grande, si bien en si cambiáramos dicha serie por otra, Data2 tomaría como referencia la nueva serie de datos elegida.
Problemas con una compresión temporal mayor
Un factor relevante a tener en cuenta sucede cuando tratamos de usar como segunda serie de datos un gráfico con una compresión temporal mayor. Al hacer esto, es necesario gestionar cuándo se está produciendo el cambio de barra en la compresión temporal mayor ya que, de no hacer esto, tendremos problemas a la hora de generar nuevos negocios:
La solución para evitar esto consistirá en comprobar las reglas de entrada (o salida) sólo en el momento exacto en el que se produzca el cambio de barra de la segunda serie de datos. Este proceso lo vemos representado en el código que incluimos como ejemplo.
Anexo: Ejercicio 37
Ampliamos la estrategia diseñada durante el ejercicio 36 con la siguiente variación: aplicar una salida parcial haciendo lo siguiente:
1) Añadir una Media Simple (15) pero en este caso sobre el Ibex Pequeño.
2) Operar al menos con 2 contratos.
3) Cuando el mercado cruce a la media, cerrar la mitad de los contratos (orden a mercado).
4) El resto mantenerlos hasta tocar las salidas (objetivo o stop de pérdidas).
Debemos añadir un control entrada de modo que cumpla dirección de la media para que la estrategia siga una lógica.
En la imagen observamos cómo el sistema abre largos con 2 contratos y cierra uno cuando el cierre de una barra queda por debajo de la media (aplicada sobre el Ibex Pequeño). El contrato que sigue vigente se liquida cuando llega la señal contraria de venta.
El diseño 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 '2
Dim PeriodoP As Integer '14
Dim PeriodoM As Integer '14
Dim MMov As Double '0.015
Dim BandValue As Double '0
Dim Objetivo As Double '120
Dim StopPerdidas As Double '75
Dim PeriodoMedia As Integer '15
'Parameters !!
Dim ccidata As DataIdentifier
Dim ultimahora2 As Long
Dim ultimodia2 As Long
Dim avdata As DataIdentifier
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
ccidata = .GII(CCI, Data2, PeriodoP, PeriodoM, MMov, BandValue)
avdata = .GII(AvSimple, Data, PeriodoMedia, PriceClose)
ultimodia2 = 0
ultimahora2 = 0
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
Dim pos_abierta As Integer
Dim pentrada As Double
pos_abierta = .GetMarketPosition()
pentrada = .GetEntryPrice()
Dim nuevaentrada As Integer
If (ultimahora2 <> .Time(0, Data2) Or ultimodia2 <> .Date(0, Data2)) Then
Dim cciact As Double
Dim cciant As Double
cciact = .GIV(ccidata)
cciant = .GIV(ccidata, 1, 1)
If (cciact > BandValue And cciant <= BandValue) Then
nuevaentrada = 1
ElseIf (cciact < BandValue And cciant >= BandValue) Then
nuevaentrada = -1
End If
ultimahora2 = .Time(0, Data2)
ultimodia2 = .Date(0, Data2)
End If
Dim mediaact As Double
mediaact = .GIV(avdata)
If (pos_abierta <> 1 And nuevaentrada = 1 And .Close() > mediaact) Then
.Buy AtClose, Contratos
pos_abierta = 1
pentrada = .Close()
ElseIf (pos_abierta <> -1 And nuevaentrada = -1 And .Close() < mediaact) Then
.Sell AtClose, Contratos
pos_abierta = -1
pentrada = .Close()
End If
If (pos_abierta = 1) Then
If (.CurrentContracts() = Contratos And .Close() < mediaact) Then
.ExitLong AtClose, Contratos / 2
End If
.ExitLong AtStop, .CurrentContracts(), pentrada - StopPerdidas
.ExitLong AtLimit, .CurrentContracts(), pentrada + Objetivo
ElseIf (pos_abierta = -1) Then
If (.CurrentContracts() = Contratos And .Close() > mediaact) Then
.ExitShort AtClose, Contratos / 2
End If
.ExitShort AtStop, .CurrentContracts(), pentrada + StopPerdidas
.ExitShort AtLimit, .CurrentContracts(), pentrada - Objetivo
End If
End With
End Sub
Dim Contratos As Long '2
Dim PeriodoP As Integer '14
Dim PeriodoM As Integer '14
Dim MMov As Double '0.015
Dim BandValue As Double '0
Dim Objetivo As Double '120
Dim StopPerdidas As Double '75
Dim PeriodoMedia As Integer '15
'Parameters !!
Dim ccidata As DataIdentifier
Dim ultimahora2 As Long
Dim ultimodia2 As Long
Dim avdata As DataIdentifier
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
ccidata = .GII(CCI, Data2, PeriodoP, PeriodoM, MMov, BandValue)
avdata = .GII(AvSimple, Data, PeriodoMedia, PriceClose)
ultimodia2 = 0
ultimahora2 = 0
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
Dim pos_abierta As Integer
Dim pentrada As Double
pos_abierta = .GetMarketPosition()
pentrada = .GetEntryPrice()
Dim nuevaentrada As Integer
If (ultimahora2 <> .Time(0, Data2) Or ultimodia2 <> .Date(0, Data2)) Then
Dim cciact As Double
Dim cciant As Double
cciact = .GIV(ccidata)
cciant = .GIV(ccidata, 1, 1)
If (cciact > BandValue And cciant <= BandValue) Then
nuevaentrada = 1
ElseIf (cciact < BandValue And cciant >= BandValue) Then
nuevaentrada = -1
End If
ultimahora2 = .Time(0, Data2)
ultimodia2 = .Date(0, Data2)
End If
Dim mediaact As Double
mediaact = .GIV(avdata)
If (pos_abierta <> 1 And nuevaentrada = 1 And .Close() > mediaact) Then
.Buy AtClose, Contratos
pos_abierta = 1
pentrada = .Close()
ElseIf (pos_abierta <> -1 And nuevaentrada = -1 And .Close() < mediaact) Then
.Sell AtClose, Contratos
pos_abierta = -1
pentrada = .Close()
End If
If (pos_abierta = 1) Then
If (.CurrentContracts() = Contratos And .Close() < mediaact) Then
.ExitLong AtClose, Contratos / 2
End If
.ExitLong AtStop, .CurrentContracts(), pentrada - StopPerdidas
.ExitLong AtLimit, .CurrentContracts(), pentrada + Objetivo
ElseIf (pos_abierta = -1) Then
If (.CurrentContracts() = Contratos And .Close() > mediaact) Then
.ExitShort AtClose, Contratos / 2
End If
.ExitShort AtStop, .CurrentContracts(), pentrada + StopPerdidas
.ExitShort AtLimit, .CurrentContracts(), pentrada - Objetivo
End If
End With
End Sub
Comentarios
Publicar un comentario
¡Gracias!