II Curso de Programación. Sistema Ejercicios 29-30

Esta semana publicamos la solución de los ejercicios 29 y 30 de nuestro 2º Curso de Programación para Visual Chart 5. Estos dos ejercicios estaban asociados al estudio de los Pivot Points, herramienta que nos permite visualizar niveles de soporte y resistencia diarios donde se espera que el precio reaccione.

Visual Chart dispone de dos indicadores del tipo Pivot Point, cada uno de ellos con sus propias características. Para saber más, pueden visitar los siguientes enlaces:

Pivot Point 01
Pivot Point 02

En lo relativo a los ejercicios 29 y 30, el indicador que se usa de referencia es el indicador Pivot Point 01.



Sistema Ejercicio 29: Sistema Ruptura niveles S1 y R1
Lo que se pretende con este ejercicio es tener un sistema de referencia que opere a favor de tendencia usando los Pivot Points.

Los niveles S1 y R1 son los niveles de soporte y resistencia más próximos al niveles pivot point.

Las reglas que aplica esta estrategia serían las siguientes:
1) Cuando el precio toque el nivel de resistencia R1, tomar posiciones largas.
2) Cuando el precio toque el nivel de soporte S1, tomar posiciones cortas.

Si el precio alcanza alguno de los otros niveles, cerrar posición.

Por último, añadir un horario de operativa entre las 9:30 y las 19:00.

En la siguiente imagen vemos ilustrada la estrategia:


Si observamos, el 28 de enero entra corto al superar el nivel de soporte y cierra la posición al alcanzar el horario de cierre. Lo mismo ocurre con la orden del día siguiente. El día 30 sirve de ejemplo para comprobar cómo se produce el cierre de los negocios al alcanzar uno de los niveles siguientes al nivel de entrada. 

Anexo: Ejercicio 30
El ejercicio 30 consistía en una ampliación del ejercicio anterior.

Añadimos al sistema el parámetro CrucePvtPoint (por defecto valor a 0). Este parámetro servía para activar la entrada por cruce con el nivel pivot point.

Si se activa (valor a 1), la estrategia cambia en base al siguiente criterio:

1) Cuando el precio cruce el nivel P + Filtro, tomar posiciones largas.
2) Cuando el precio cruce el nivel P - Filtro, tomar posiciones cortas.

Si el precio alcanza alguno de los otros niveles, cerrar posición.


Con este cambio, pasamos a una estrategia más agresiva, pues no esperamos a que se confirme la dirección de la tendencia con la ruptura de los niveles S1 y R1, sino que en cuanto supera el nivel pivot point, opera. 

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 Variante As Integer '0
Dim CrucePvtPoint As Double '0
Dim FiltroPvtPoint As Double '0
'Parameters !!
Dim pvtptdata As DataIdentifier
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
pvtptdata = .GetIndicatorIdentifier(PVTPOINT01, Data, HoraIni, Variante)
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 nivelp As Double
Dim nivels1 As Double
Dim nivelr1 As Double
Dim nivels2 As Double
Dim nivelr2 As Double

nivelp = .GetIndicatorValue(pvtptdata, 0, 3)
nivels1 = .GetIndicatorValue(pvtptdata, 0, 4)
nivelr1 = .GetIndicatorValue(pvtptdata, 0, 2)
nivels2 = .GetIndicatorValue(pvtptdata, 0, 5)
nivelr2 = .GetIndicatorValue(pvtptdata, 0, 1)

If (.Time >= HoraIni And .Time < HoraFin) Then
'entradas
If (pos_abierta <> 1) Then
If (CrucePvtPoint = 0) Then
If (.Close() < nivelr1) Then
.Buy AtStop, Contratos, nivelr1
End If
Else
If (.Close() > nivelp + FiltroPvtPoint And .Close(1) <= nivelp + FiltroPvtPoint) Then
.Buy AtClose, Contratos
pos_abierta = 1
pentrada = .Close()
End If
End If
End If
If (pos_abierta <> -1) Then
If (CrucePvtPoint = 0) Then
If (.Close() > nivels1) Then
.Sell AtStop, Contratos, nivels1
End If
Else
If (.Close() < nivelp - FiltroPvtPoint And .Close(1) >= nivelp - FiltroPvtPoint) Then
.Sell AtClose, Contratos
pos_abierta = -1
pentrada = .Close()
End If
End If
End If

'salidas
If (pos_abierta = 1) Then
If (CrucePvtPoint = 0) Then
.ExitLong AtStop, Contratos, nivelp
Else
.ExitLong AtStop, Contratos, nivels1
End If
If (CrucePvtPoint = 0) Then
.ExitLong AtLimit, Contratos, nivelr2
Else
.ExitLong AtLimit, Contratos, nivelr1
End If
ElseIf (pos_abierta = -1) Then
If (CrucePvtPoint = 0) Then
.ExitShort AtStop, Contratos, nivelp
Else
.ExitShort AtStop, Contratos, nivelr1
End If
If (CrucePvtPoint = 0) Then
.ExitShort AtLimit, Contratos, nivels2
Else
.ExitShort AtLimit, Contratos, nivels1
End If
End If
Else
If (pos_abierta = 1) Then
.ExitLong AtClose, Contratos
ElseIf (pos_abierta = -1) Then
.ExitShort AtClose, Contratos
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