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

'¡¡ 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

Entradas populares de este blog

Como consultar el GAP % de un conjunto de valores

MANEJO DE PLANTILLAS. Eliminar plantilla de un gráfico activa

Bollinger Volatility Oscillator N