II Curso de Programación. Sistema Tema 9
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.
Sistema Tema 9: Sistema Cruce Dos Medias con Gestión Monetaria
Este sistema lo diseñamos para explicar cómo poder incluir dentro de un sistema una gestión monetaria, es decir, la capacidad para poder modificar el número de contratos en base a la ganancia que esté generando el sistema.
Para ello, nos basamos en una variante de la fórmula del Fixed Ratio. Este método lo que propone es aumentar el número de contratos ante una serie de ganancias y disminuirlos si aparece una serie de pérdidas. La fórmula que se aplicó fue la siguiente:
Número de contratos = Ganancia Total Acumulada / Delta.
Donde Delta es el nivel de riesgo que queremos correr. Cuánto menor es el valor Delta, mayor es el riesgo que asumimos.
Las reglas del sistema serían las siguientes:
1. Comprar cuando la media corta cruce al alza a la media larga.
2. Vender cuando la media corta cruce a la baja a la media larga.
3. Colocamos un stop de pérdidas a M puntos.
4. Colocamos un objetivo de beneficios a N puntos.
Como hemos dicho, cada negocio entrará con un número de contratos en base a la fórmula vista anteriormente. El valor Delta vendrá determinado por un parámetro de entrada que llamaremos NivelRiesgo.
Por último, si la ganancia es menor o igual que el NivelRiesgo, el sistema opera con un número mínimo de contratos determinados por otro parámetro llamado ContratosIni. La idea es que el sistema siempre esté operando aunque entre en pérdidas.
El desarrollo del sistema sería el siguiente:
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 Tema 9: Sistema Cruce Dos Medias con Gestión Monetaria
Este sistema lo diseñamos para explicar cómo poder incluir dentro de un sistema una gestión monetaria, es decir, la capacidad para poder modificar el número de contratos en base a la ganancia que esté generando el sistema.
Para ello, nos basamos en una variante de la fórmula del Fixed Ratio. Este método lo que propone es aumentar el número de contratos ante una serie de ganancias y disminuirlos si aparece una serie de pérdidas. La fórmula que se aplicó fue la siguiente:
Número de contratos = Ganancia Total Acumulada / Delta.
Donde Delta es el nivel de riesgo que queremos correr. Cuánto menor es el valor Delta, mayor es el riesgo que asumimos.
Las reglas del sistema serían las siguientes:
1. Comprar cuando la media corta cruce al alza a la media larga.
2. Vender cuando la media corta cruce a la baja a la media larga.
3. Colocamos un stop de pérdidas a M puntos.
4. Colocamos un objetivo de beneficios a N puntos.
Como hemos dicho, cada negocio entrará con un número de contratos en base a la fórmula vista anteriormente. El valor Delta vendrá determinado por un parámetro de entrada que llamaremos NivelRiesgo.
Por último, si la ganancia es menor o igual que el NivelRiesgo, el sistema opera con un número mínimo de contratos determinados por otro parámetro llamado ContratosIni. La idea es que el sistema siempre esté operando aunque entre en pérdidas.
El desarrollo del sistema sería el siguiente:
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 ContratosInicio As Long '1
Dim NivelRiesgo As Double '100
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim PeriodoCorta As Integer '5
Dim PeriodoLarga As Integer '30
Dim Objetivo As Double '100
Dim StopPerdida As Double '50
'Parameters !!
Dim avshortdata As DataIdentifier
Dim avlongdata As DataIdentifier
Dim contratos As Long
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
contratos = ContratosInicio
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
If (.Time >= HoraIni And .Time < HoraFin) Then
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
medcortaact = .GetIndicatorValue(avshortdata)
medcortaant = .GetIndicatorValue(avshortdata, 1, 1)
medlargaact = .GetIndicatorValue(avlongdata)
medlargaant = .GetIndicatorValue(avlongdata, 1, 1)
pos_abierta = .GetMarketPosition()
pentrada = .GetEntryPrice()
'entradas
If (pos_abierta <> 1 And medcortaact > medlargaact And medcortaant <= medlargaant) Then
'gestion monetaria
If (.NetProfit < NivelRiesgo) Then
contratos = ContratosInicio
Else
contratos = .NetProfit / NivelRiesgo
End If
.Buy AtClose, contratos
pos_abierta = 1
pentrada = .Close()
ElseIf (pos_abierta <> -1 And medcortaact < medlargaact And medcortaant >= medlargaant) Then
'gestion monetaria
If (.NetProfit < NivelRiesgo) Then
contratos = ContratosInicio
Else
contratos = .NetProfit / NivelRiesgo
End If
.Sell AtClose, contratos
pos_abierta = -1
pentrada = .Close()
End If
'salidas
If (pos_abierta = 1) Then
.ExitLong AtStop, contratos, pentrada - StopPerdida
.ExitLong AtLimit, contratos, pentrada + Objetivo
ElseIf (pos_abierta = -1) Then
.ExitShort AtStop, contratos, pentrada + StopPerdida
.ExitShort AtLimit, contratos, pentrada - Objetivo
End If
Else
.ExitShort AtClose, contratos
.ExitLong AtClose, contratos
End If
End With
End Sub
Dim ContratosInicio As Long '1
Dim NivelRiesgo As Double '100
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim PeriodoCorta As Integer '5
Dim PeriodoLarga As Integer '30
Dim Objetivo As Double '100
Dim StopPerdida As Double '50
'Parameters !!
Dim avshortdata As DataIdentifier
Dim avlongdata As DataIdentifier
Dim contratos As Long
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
contratos = ContratosInicio
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
If (.Time >= HoraIni And .Time < HoraFin) Then
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
medcortaact = .GetIndicatorValue(avshortdata)
medcortaant = .GetIndicatorValue(avshortdata, 1, 1)
medlargaact = .GetIndicatorValue(avlongdata)
medlargaant = .GetIndicatorValue(avlongdata, 1, 1)
pos_abierta = .GetMarketPosition()
pentrada = .GetEntryPrice()
'entradas
If (pos_abierta <> 1 And medcortaact > medlargaact And medcortaant <= medlargaant) Then
'gestion monetaria
If (.NetProfit < NivelRiesgo) Then
contratos = ContratosInicio
Else
contratos = .NetProfit / NivelRiesgo
End If
.Buy AtClose, contratos
pos_abierta = 1
pentrada = .Close()
ElseIf (pos_abierta <> -1 And medcortaact < medlargaact And medcortaant >= medlargaant) Then
'gestion monetaria
If (.NetProfit < NivelRiesgo) Then
contratos = ContratosInicio
Else
contratos = .NetProfit / NivelRiesgo
End If
.Sell AtClose, contratos
pos_abierta = -1
pentrada = .Close()
End If
'salidas
If (pos_abierta = 1) Then
.ExitLong AtStop, contratos, pentrada - StopPerdida
.ExitLong AtLimit, contratos, pentrada + Objetivo
ElseIf (pos_abierta = -1) Then
.ExitShort AtStop, contratos, pentrada + StopPerdida
.ExitShort AtLimit, contratos, pentrada - Objetivo
End If
Else
.ExitShort AtClose, contratos
.ExitLong AtClose, contratos
End If
End With
End Sub
Comentarios
Publicar un comentario
¡Gracias!