II Curso de Programación. Sistema Ejercicio 14.

Continuamos con la publicación de los sistemas de ejemplo que estamos elaborando a través de nuestro 2º Curso de Programación para Visual Chart 5.

En este caso, publicamos la resolución del sistema propuesto durante el ejercicio 14.

Sistema Ejercicio 14: StopLoss en Soporte y Resistencia con pérdida máxima porcentual

Durante este ejercicio, se propuso la creación de un sistema con el cual poder repasar el diseño de los stops porcentuales. Además, se planteaba un diseño de stop dinámico basado en niveles de soporte y resistencia.

Reglas de entrada.
El sistema entra cuando se produce un cruce entre dos medias de diferente periodo.

Reglas de salida.
El sistema cierra posición en base a los nuevos soportes y resistencias que se vayan generando. Además, incluye un margen porcentual de pérdida máxima, de modo que el stop de pérdida nunca puede superar dicho margen.



Para obtener los niveles de soporte y resistencia el sistema utiliza las funciones GetHighest() y GetLowest().

Para obtener la pérdida máxima, se añade el parámetro StopPerdida, que representa un tanto por ciento del precio de entrada.

El desarrollo del sistema sería el siguiente:


Código PDV



Código VBA

'¡¡ Parameters
Dim Contratos As Long '1
Dim PeriodoCorta As Integer '5
Dim PeriodoLarga As Integer '30
Dim StopPerdida As Double '0.1
Dim DistanciaMaxMin As Integer '10
'Parameters !!
Dim avshortdata As DataIdentifier
Dim avlongdata As DataIdentifier
Dim preciostop As Double
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP


preciostop = 0
avshortdata = .GetIndicatorIdentifier(AvExponential, Data, PeriodoCorta, PriceClose)
avlongdata = .GetIndicatorIdentifier(AvExponential, Data, PeriodoLarga, PriceClose)
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP

Dim medcortaact As Double
Dim medcortaant As Double
Dim medlargaact As Double
Dim medlargaant As Double
Dim pos_abierta As Integer
Dim pentrada As Double
Dim ulsop As Double
Dim ulres As Double
Dim stopmax As Double

medcortaact = .GetIndicatorValue(avshortdata)
medcortaant = .GetIndicatorValue(avshortdata, 1, 1)
medlargaact = .GetIndicatorValue(avlongdata)
medlargaant = .GetIndicatorValue(avlongdata, 1, 1)
pos_abierta = .GetMarketPosition()
pentrada = .GetEntryPrice()
ulres = .GetHighest(Data, PriceHigh, DistanciaMaxMin)
ulsop = .GetLowest(Data, PriceLow, DistanciaMaxMin)

'entradas
If (pos_abierta <> 1 And medcortaact > medlargaact And medcortaant <= medlargaant) Then
.Buy AtClose, Contratos
pos_abierta = 1
pentrada = .Close()
preciostop = 0
ElseIf (pos_abierta <> -1 And medcortaact < medlargaact And medcortaant >= medlargaant) Then
.Sell AtClose, Contratos
pos_abierta = -1
pentrada = .Close()
preciostop = 0
End If

'salidas
If (pos_abierta = 1) Then
stopmax = pentrada * (1 - StopPerdida / 100)
If (preciostop = 0 Or ulsop > preciostop) Then
'control pérdida máxima
If (ulsop < stopmax) Then
preciostop = stopmax
Else
preciostop = ulsop
End If
End If
.ExitLong AtStop, Contratos, preciostop
ElseIf (pos_abierta = -1) Then
stopmax = pentrada * (1 + StopPerdida / 100)
If (preciostop = 0 Or ulres < preciostop) Then
'control pérdida máxima
If (ulres > stopmax) Then
preciostop = stopmax
Else
preciostop = ulres
End If
End If
.ExitShort AtStop, Contratos, preciostop
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