II Curso de Programación. Sistema Ejercicio 33

Esta semana publicamos el ejercicio 33 de nuestro 2º Curso de Programación para Visual Chart 5. Los ejercicios del 33 al 35 consistieron en ejemplos diferentes entre sí que abordaban varias cuestiones y que se servían como repaso a lo visto a lo largo del seminario.

Sistema Ejercicio 33: Sistema cruce canal de Keltner con TrailingStop.
Este ejercicio fue un ejemplo de estrategia que utiliza entradas en stop y que se apoya en el valor de las bandas del canal de Keltner  (valores por defecto en 30,10,2).

Ya hablamos con anterioridad de éste indicador. Si quieren conocerlo con más profundidad, accedan al siguiente enlace:

Acerca del Canal de Keltner

Sin embargo, lo más interesante del ejercicio es que incluye dos métodos de salida: un trailing stop (valor a 40) y un segundo canal de keltner más rápido (10,10,1.2). El objetivo es que la orden de salida se ejecute sobre el valor que reaccione antes. 

El interés del ejercicio, por tanto, se centra en la gestión de las órdenes de salida, ya que se trata de una estrategia en la que debemos controlar los stops de salida para que sólo envíe el mejor situado.


En la imagen, vemos dos negocios en los que cada uno de ellos cierra mediante un mecanismo de salida distinto: el negocio a largos del principio, cierra al tocar la banda inferior del canal de Keltner rápido. Mientras que el negocio a cortos siguiente, alcanza antes el trailing stop, debido a que se produce un aumento de la volatilidad que aleja en exceso a las bandas de Keltner. 


Gracias a ésta idea, tratamos de aumentar la tasa de fiabilidad de los puntos de salida.

Recapitulando, las reglas del sistema quedarían así:
1) Enviar orden de entrar largos en base a la banda superior del Keltner Lento.
2) Enviar orden de entrar cortos en base a la banda inferior del Keltner Lento.
3) Colocar un stop en base a la banda opuesta del Keltner Rápido.
4) Una vez alcance cierto margen de ganancia (según parámetro TrailingStop), activar un stop dinámico.
5) Modificar el stop de salida en base al precio más próximo de las dos condiciones anteriores.

Por último, el sistema lleva añadido un horario de operativa entre las 9:30 y las 19:00. Este sistema está pensado para que sea intradiario.

El diseño del sistema quedaría así:

Código PDV



Codigo 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 '1
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim Period As Integer '30
Dim Constant As Double '2
Dim Period2 As Integer '10
Dim Constant2 As Double '1.2
Dim TrailingStop As Double '40
'Parameters !!
Dim keltnerdata As DataIdentifier
Dim keltnerdata2 As DataIdentifier
Dim pricets As Double
Dim activats As Boolean
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
keltnerdata = .GII(KELTNER, Data, Period, Constant)
keltnerdata2 = .GII(KELTNER, Data, Period2, Constant2)
pricets = 0
activats = False
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()

If (.Time >= HoraIni And .Time < HoraFin) Then
Dim keltnersup As Double
Dim keltnerinf As Double

keltnerinf = .GetIndicatorValue(keltnerdata, 0, 1)
keltnersup = .GetIndicatorValue(keltnerdata, 0, 3)

'entradas
If (pos_abierta <> 1 And .Close() < keltnersup) Then
.Buy AtStop, Contratos, keltnersup
End If
If (pos_abierta <> -1 And .Close() > keltnerinf) Then
.Sell AtStop, Contratos, keltnerinf
End If

'salidas
Dim pstoptrail As Double
Dim pstopkeltner
If (pos_abierta = 1) Then
If (.GetBarsSinceEntry() = 0) Then
activats = False
End If
If (activats = False) Then
If (.Close() - pentrada >= TrailingStop) Then
activats = True
pricets = pentrada
End If
End If
If (activats = True) Then
If .Close() > pricets Then
pricets = .Close()
End If
pstoptrail = pricets - TrailingStop
End If
pstopkeltner = .GetIndicatorValue(keltnerdata2, 0, 1)
If (pstoptrail <> 0 And pstoptrail > pstopkeltner) Then
.ExitLong AtStop, Contratos, pstoptrail
Else
.ExitLong AtStop, Contratos, pstopkeltner
End If
ElseIf (pos_abierta = -1) Then
If (.GetBarsSinceEntry() = 0) Then
activats = False
End If
If (activats = False) Then
If (pentrada - .Close() >= TrailingStop) Then
activats = True
pricets = pentrada
End If
End If
If (activats = True) Then
If .Close() < pricets Then
pricets = .Close()
End If
pstoptrail = pricets + TrailingStop
End If
pstopkeltner = .GetIndicatorValue(keltnerdata2, 0, 3)
If (pstoptrail <> 0 And pstoptrail < pstopkeltner) Then
.ExitShort AtStop, Contratos, pstoptrail
Else
.ExitShort AtStop, Contratos, pstopkeltner
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

Bollinger Volatility Oscillator N

Estudio de las divergencias en el RSI