II Curso de Programación. Sistema Tema 8
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 8: Sistema Cruce Media con Varios Objetivos
Utilizamos éste sistema para explicar cómo incluir dos objetivos de ganancia por negocio a través del uso de órdenes de salida al cierre.
Durante el seminario, explicamos que la aplicación de órdenes limitadas no es compatible con la salida parcial de contratos, puesto que las órdenes limitadas y en stop de los sistemas en Visual Chart permanecen activas durante todo el transcurso de la barra. Como consecuencia, una orden de salida especificada inicialmente como parcial puede terminar cerrando el negocio de forma completa.
Un modo de solucionar esto es sustituyendo las órdenes limitadas por órdenes al cierre. Obviamente, esta opción significará la pérdida de oportunidades de salida, pero permite que un sistema incluya salidas parciales.
En un posterior ejercicio, incluimos en el sistema un tercer objetivo de ganancias, por lo que el sistema pasaba a tener tres niveles de ganancia.
Las reglas del sistema serían las siguientes:
1. Comprar cuando el precio cruce al alza a la media exponencial.
2. Vender cuando el precio cruce a la baja a la media exponencial.
3. Colocamos un stop de pérdidas con el total de los contratos de entrada.
4. Si el precio alcanza el primer objetivo, cerramos 1/3 de los contratos.
5. Si el precio alcanza el segundo objetivo, cerramos 1/3 o 2/3 de los contratos (depende de la cantidad de contratos abiertos).
6. Si el precio alcanza el tercer objetivo, cerramos todos los contratos que queden abiertos.
El desarrollo del sistema sería el siguiente:
Código PDV
Código VBA
Sistema Tema 8: Sistema Cruce Media con Varios Objetivos
Utilizamos éste sistema para explicar cómo incluir dos objetivos de ganancia por negocio a través del uso de órdenes de salida al cierre.
Durante el seminario, explicamos que la aplicación de órdenes limitadas no es compatible con la salida parcial de contratos, puesto que las órdenes limitadas y en stop de los sistemas en Visual Chart permanecen activas durante todo el transcurso de la barra. Como consecuencia, una orden de salida especificada inicialmente como parcial puede terminar cerrando el negocio de forma completa.
Un modo de solucionar esto es sustituyendo las órdenes limitadas por órdenes al cierre. Obviamente, esta opción significará la pérdida de oportunidades de salida, pero permite que un sistema incluya salidas parciales.
En un posterior ejercicio, incluimos en el sistema un tercer objetivo de ganancias, por lo que el sistema pasaba a tener tres niveles de ganancia.
Las reglas del sistema serían las siguientes:
1. Comprar cuando el precio cruce al alza a la media exponencial.
2. Vender cuando el precio cruce a la baja a la media exponencial.
3. Colocamos un stop de pérdidas con el total de los contratos de entrada.
4. Si el precio alcanza el primer objetivo, cerramos 1/3 de los contratos.
5. Si el precio alcanza el segundo objetivo, cerramos 1/3 o 2/3 de los contratos (depende de la cantidad de contratos abiertos).
6. Si el precio alcanza el tercer objetivo, cerramos todos los contratos que queden abiertos.
El desarrollo del sistema sería el siguiente:
Código PDV
Código VBA
'¡¡ Parameters
Dim Contratos As Long '3
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim PeriodoMedia As Integer '100
Dim Objetivo1 As Double '50
Dim Objetivo2 As Double '100
Dim Objetivo3 As Double '150
'Parameters !!
Dim avdata As DataIdentifier
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
avdata = .GetIndicatorIdentifier(AvExponential, Data, PeriodoMedia, PriceClose)
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
If (.Time >= HoraIni And .Time < HoraFin) Then
Dim avact As Double
Dim avant As Double
Dim gmp As Integer
Dim gep As Double
Dim cc As Long avact = .GetIndicatorValue(avdata)
avant = .GetIndicatorValue(avdata, 1, 1)
gmp = .GetMarketPosition()
gep = .GetEntryPrice()
cc = .CurrentContracts()
'entradas
If (.GetMarketPosition() <> 1 And .Close() > avact And .Close(1) <= avant) Then
.Buy AtClose, Contratos
gmp = 1
gep = .Close
cc = Contratos
ElseIf (.GetMarketPosition() <> -1 And .Close() < avact And .Close(1) >= avant) Then
.Sell AtClose, Contratos
gmp = -1
gep = .Close
cc = Contratos
End If 'salidas
If (gmp = 1) Then
.ExitLong AtStop, cc, .GetLowest(Data, PriceLow, 100)
If (.Close() >= (gep + Objetivo3)) Then
.ExitLong AtClose, cc
ElseIf (cc = Contratos) Then
If (.Close() >= (gep + Objetivo2)) Then
.ExitLong AtClose, (2 / 3) * Contratos
Else
If (.Close() >= (gep + Objetivo1)) Then
.ExitLong AtClose, (Contratos / 3)
End If
End If
ElseIf (cc >= (2 / 3) * Contratos) Then
If (.Close() >= (gep + Objetivo2)) Then
.ExitLong AtClose, (Contratos / 3)
End If
End If
ElseIf (gmp = -1) Then
.ExitShort AtStop, Contratos, .GetHighest(Data, PriceHigh, 100)
If (.Close() <= (gep - Objetivo3)) Then
.ExitShort AtClose, cc
ElseIf (cc = Contratos) Then
If (.Close() <= (gep - Objetivo2)) Then
.ExitShort AtClose, (2 / 3) * Contratos
Else
If (.Close() <= (gep - Objetivo1)) Then
.ExitShort AtClose, (Contratos / 3)
End If
End If
ElseIf (cc >= (2 / 3) * Contratos) Then
If (.Close() <= (gep - Objetivo2)) Then
.ExitShort AtClose, (Contratos / 3)
End If
End If
End If
Else
.ExitShort AtClose, .CurrentContracts()
.ExitLong AtClose, .CurrentContracts()
End If
End With
End Sub
Comentarios
Publicar un comentario