II Curso de Programación. Sistema Ejercicios 31-32
Esta semana publicamos la solución de los ejercicios 31 y 32 de nuestro 2º Curso de Programación para Visual Chart 5. En esta ocasión, se trata de ejercicios relacionados con el indicador de retrocesos Fibonacci Retracements. Nuevamente, se trata de una herramienta que nos permite trazar sobre el subyacente una serie de niveles de soporte y resistencia calculados sobre datos diarios.
El indicador de retrocesos de Fibonacci está disponible para todos los usuarios de Visual Chart. Pueden descargarlo desde el siguiente enlace:
Fibonacci Retracements
Sistema Ejercicio 31: Sistema de Retrocesos
El objetivo de éste ejercicio era el de llevar a la práctica la interpretación del indicador. Así, si el precio del subyacente rompe al alza los niveles inferiores del indicador, teóricamente tenderá a cubrir la distancia hasta el nivel superior. En estos casos, la estrategia tomará posiciones largas. Si ocurre lo contrario, la estrategia tomará posiciones cortas.
Las reglas del sistema quedarían así:
1) Cuando el precio toque el nivel de Compra (38.2), tomar posiciones largas.
2) Deshacer si toca el Objetivo Compra (61.8).
3) Cuando el precio toque el nivel de Venta (61.8), tomar posiciones cortas.
4) Deshacer si toca el Objetivo Venta (38.2).
Obviamente, se puede dar la circunstancia de que el precio del subyacente no se desplace en el sentido esperado, por lo que además añadimos al sistema un stop de pérdidas (por defecto a 40 puntos).
Por último, el sistema lleva añadido un horario de operativa entre las 9:30 y las 19:00. Este sistema es puramente intradiario puesto que el cálculo de los niveles depende de los datos del día anterior. Se recomienda utilizar una compresión temporal con un minutaje bajo, para que las órdenes puedan activarse cuanto antes (recordemos que los sistemas activan y modifican las órdenes al cambio de barra).
Anexo: Ejercicio 32
Ampliamos la estrategia diseñada durante el ejercicio 31 con la siguiente variación: Para evitar un número muy alto de operaciones laterales, planteamos la opción de que el sistema sólo pudiera operar en el sentido opuesto a la dirección de la tendencia del día anterior.
La explicación es la siguiente: teóricamente, la ventaja de calcular estos niveles es que al producirse dicho retroceso, cabe esperar que el subyacente cubra la distancia generada por el impulso del día anterior hasta ciertos niveles. En concreto, se espera que si rompe un 38,2% del retroceso se prolongue el movimiento contrario hasta alcanzar un 61,8%.
Por tanto parece tener sentido que sólo se opere en la dirección del retroceso.
Para ello, añadimos al sistema un parámetro con el que poder activar y desactivar esta opción (lo cual nos permite optimizar y comprobar pormenorizadamente qué es más efectivo). De modo que si la opción estaba activa, sólo se operaba en un sentido:
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).
El indicador de retrocesos de Fibonacci está disponible para todos los usuarios de Visual Chart. Pueden descargarlo desde el siguiente enlace:
Fibonacci Retracements
Sistema Ejercicio 31: Sistema de Retrocesos
El objetivo de éste ejercicio era el de llevar a la práctica la interpretación del indicador. Así, si el precio del subyacente rompe al alza los niveles inferiores del indicador, teóricamente tenderá a cubrir la distancia hasta el nivel superior. En estos casos, la estrategia tomará posiciones largas. Si ocurre lo contrario, la estrategia tomará posiciones cortas.
Las reglas del sistema quedarían así:
1) Cuando el precio toque el nivel de Compra (38.2), tomar posiciones largas.
2) Deshacer si toca el Objetivo Compra (61.8).
3) Cuando el precio toque el nivel de Venta (61.8), tomar posiciones cortas.
4) Deshacer si toca el Objetivo Venta (38.2).
Obviamente, se puede dar la circunstancia de que el precio del subyacente no se desplace en el sentido esperado, por lo que además añadimos al sistema un stop de pérdidas (por defecto a 40 puntos).
Por último, el sistema lleva añadido un horario de operativa entre las 9:30 y las 19:00. Este sistema es puramente intradiario puesto que el cálculo de los niveles depende de los datos del día anterior. Se recomienda utilizar una compresión temporal con un minutaje bajo, para que las órdenes puedan activarse cuanto antes (recordemos que los sistemas activan y modifican las órdenes al cambio de barra).
Anexo: Ejercicio 32
Ampliamos la estrategia diseñada durante el ejercicio 31 con la siguiente variación: Para evitar un número muy alto de operaciones laterales, planteamos la opción de que el sistema sólo pudiera operar en el sentido opuesto a la dirección de la tendencia del día anterior.
La explicación es la siguiente: teóricamente, la ventaja de calcular estos niveles es que al producirse dicho retroceso, cabe esperar que el subyacente cubra la distancia generada por el impulso del día anterior hasta ciertos niveles. En concreto, se espera que si rompe un 38,2% del retroceso se prolongue el movimiento contrario hasta alcanzar un 61,8%.
Por tanto parece tener sentido que sólo se opere en la dirección del retroceso.
Para ello, añadimos al sistema un parámetro con el que poder activar y desactivar esta opción (lo cual nos permite optimizar y comprobar pormenorizadamente qué es más efectivo). De modo que si la opción estaba activa, sólo se operaba en un sentido:
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 Integer '1
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim PctRetro1 As Double '100
Dim PctRetro2 As Double '61.8
Dim PctRetro3 As Double '50
Dim PctRetro4 As Double '38.2
Dim PctRetro5 As Double '0
Dim NivelCompra As Double '5
Dim ObjetivoCompra As Integer '3
Dim NivelVenta As Double '1
Dim ObjetivoVenta As Integer '3
Dim StopPerdida As Double '75
Dim SoloAFavor As Integer '1
'Parameters !!
Dim retrodata As DataIdentifier
Dim tenddia As Integer
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
End Sub
Dim Contratos As Integer '1
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim PctRetro1 As Double '100
Dim PctRetro2 As Double '61.8
Dim PctRetro3 As Double '50
Dim PctRetro4 As Double '38.2
Dim PctRetro5 As Double '0
Dim NivelCompra As Double '5
Dim ObjetivoCompra As Integer '3
Dim NivelVenta As Double '1
Dim ObjetivoVenta As Integer '3
Dim StopPerdida As Double '75
Dim SoloAFavor As Integer '1
'Parameters !!
Dim retrodata As DataIdentifier
Dim tenddia As Integer
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
retrodata = .GetIndicatorIdentifier(RETROFIBO, Data, PctRetro1, PctRetro2, PctRetro3, PctRetro4, PctRetro5)
tenddia = 0
End Withtenddia = 0
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 retro1 As Double
Dim retro2 As Double
Dim retro3 As Double
Dim retro4 As Double
Dim retro5 As Double
retro1 = .GetIndicatorValue(retrodata, 0, 1)
retro2 = .GetIndicatorValue(retrodata, 0, 2)
retro3 = .GetIndicatorValue(retrodata, 0, 3)
retro4 = .GetIndicatorValue(retrodata, 0, 4)
retro5 = .GetIndicatorValue(retrodata, 0, 5)
'cambio de día
If (.Date() <> .Date(1)) Then
Dim pentrada As Double
pos_abierta = .GetMarketPosition()
pentrada = .GetEntryPrice()
Dim retro1 As Double
Dim retro2 As Double
Dim retro3 As Double
Dim retro4 As Double
Dim retro5 As Double
retro1 = .GetIndicatorValue(retrodata, 0, 1)
retro2 = .GetIndicatorValue(retrodata, 0, 2)
retro3 = .GetIndicatorValue(retrodata, 0, 3)
retro4 = .GetIndicatorValue(retrodata, 0, 4)
retro5 = .GetIndicatorValue(retrodata, 0, 5)
'cambio de día
If (.Date() <> .Date(1)) Then
If (.Close() < retro4) Then
tenddia = 1
ElseIf (.Open() > retro2) Then
tenddia = -1
Else
tenddia = 0
End If
End If
If (.Time >= HoraIni And .Time < HoraFin) Then
If (.Time >= HoraIni And .Time < HoraFin) Then
'entradas
Dim entrada As Double
If (pos_abierta <> 1 And (SoloAFavor = 0 Or tenddia = 1)) Then
Dim entrada As Double
If (pos_abierta <> 1 And (SoloAFavor = 0 Or tenddia = 1)) Then
If NivelCompra = 5 Then
entrada = retro5
ElseIf NivelCompra = 4 Then
entrada = retro4
ElseIf NivelCompra = 3 Then
entrada = retro3
Else
entrada = retro2
End If
If (.Close() < entrada) Then
If (.Close() < entrada) Then
.Buy AtStop, Contratos, entrada
End If
End If
If (pos_abierta <> -1 And (SoloAFavor = 0 Or tenddia = -1)) Then
If (pos_abierta <> -1 And (SoloAFavor = 0 Or tenddia = -1)) Then
If NivelVenta = 1 Then
entrada = retro1
ElseIf NivelVenta = 2 Then
entrada = retro2
ElseIf NivelVenta = 3 Then
entrada = retro3
Else
entrada = retro4
End If
If (.Close() > entrada) Then
If (.Close() > entrada) Then
.Sell AtStop, Contratos, entrada
End If
End If
'salidas
Dim objetivo As Double
If (pos_abierta = 1) Then
'salidas
Dim objetivo As Double
If (pos_abierta = 1) Then
.ExitLong AtStop, Contratos, pentrada - StopPerdida
If ObjetivoCompra = 1 Then
If ObjetivoCompra = 1 Then
objetivo = retro1
ElseIf ObjetivoCompra = 2 Then
objetivo = retro2
ElseIf ObjetivoCompra = 3 Then
objetivo = retro3
Else
objetivo = retro4
End If
.ExitLong AtLimit, Contratos, objetivo
.ExitLong AtLimit, Contratos, objetivo
ElseIf (pos_abierta = -1) Then
.ExitShort AtStop, Contratos, pentrada + StopPerdida
If ObjetivoVenta = 5 Then
If ObjetivoVenta = 5 Then
objetivo = retro5
ElseIf ObjetivoVenta = 4 Then
objetivo = retro4
ElseIf ObjetivoVenta = 3 Then
objetivo = retro3
Else
objetivo = retro2
End If
.ExitShort AtLimit, Contratos, objetivo
.ExitShort AtLimit, Contratos, objetivo
End If
Else
If (pos_abierta = 1) Then
.ExitLong AtClose, Contratos
ElseIf (pos_abierta = -1) Then
.ExitShort AtClose, Contratos
End If
End If
End WithEnd Sub
Comentarios
Publicar un comentario
¡Gracias!