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