II Curso de Programación. Sistema Tema 4 y 5.

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 4 y 5: Sistema RSI cruce niveles sobrecompra/sobreventa 

Con éste sistema tratamos de explicar cómo desarrollar sistemas basados en osciladores. Para ello, usamos el indicador Relative Strength Index (RSI) como ejemplo. En éste sistema, vemos la típica regla de entrada basada en la salida de los niveles de agotamiento.

Además, el sistema incluye los métodos de salida más comunes: Un stop de pérdidas fijo, un objetivo de ganancias y por último, un stop dinámico o trailing stop:




Las reglas del sistema eran las siguientes:

1. Comprar al pasar el RSI de estar sobrevendido (por encima de 70) a estar fuera de sobreventa (por debajo de 70).
2. Vender al pasar el RSI de estar sobrecomprado (por debajo de 30) a estar fuera de sobrecompra (por encima de 30).

Lo interesante de éste tipo de sistemas es que en caso de acierto, se adelantan a la nueva tendencia, permitiendo obtener un buen momento de entrada.

Por el contrario, cuando un oscilador falla, puede generar una pérdida de largo recorrido si no se controla. Para ello, incluimos en el sistema un stop de pérdida máxima.

Además, incluimos también un objetivo de ganancia, de modo que al alcanzar una cantidad determinada de puntos, el sistema liquidaba el negocio abierto.

Por último, incluimos un trailing stop. Mediante éste tipo de stop dinámico, buscamos aprovechar el movimiento del precio favorable a la operación, aún si finalmente dicho impulso no alcance el punto objetivo.


El desarrollo de éste sistema sería el siguiente:

Código PDV


Código VBA

'¡¡ Parameters
Dim PeriodoRSI As Integer '14
Dim UpperBand As Double '70
Dim LowerBand As Double '30
Dim StopPerdidas As Double '50
Dim Objetivo As Double '100
Dim TrailingStop As Double '40
'Parameters !!
Dim rsidata As DataIdentifier
Dim precio_ts As Double
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
    precio_ts = 0
    rsidata = .GetIndicatorIdentifier(RSI, Data, PeriodoRSI, UpperBand, LowerBand)
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
    Dim rsi_act As Double
    Dim rsi_ant As Double
    Dim pentrada As Double
    Dim pos_abierta As Integer
  
  
    Dim pstoploss As Double
  
    rsi_act = .GetIndicatorValue(rsidata)
    rsi_ant = .GetIndicatorValue(rsidata, 1, 1)
  
    pos_abierta = .GetMarketPosition()
    pentrada = .GetEntryPrice()
  
    'reglas de entrada
    If (.GetMarketPosition() <> 1 And rsi_ant <= LowerBand And rsi_act > LowerBand) Then
        .Buy AtStop, 1, .High()
        pos_abierta = 1
        pentrada = .High
    ElseIf (.GetMarketPosition() <> -1 And rsi_ant >=UpperBand And rsi_act<UpperBand) Then
        .Sell AtStop, 1, .Low()
        pos_abierta = -1
        pentrada = .Low()
    End If
  
    'salida largos
    If (pos_abierta = 1) Then
        pstoploss = pentrada - StopPerdidas
        If (.GetMarketPosition = 1) Then
            If (.GetBarsSinceEntry() = 0) Then
                precio_ts = pentrada
            End If
            If (.High() > precio_ts) Then
                precio_ts = .High()
            End If
            If (precio_ts - TrailingStop > pstoploss) Then
                pstoploss = precio_ts - TrailingStop
            End If
            .ExitLong AtLimit, 1, pentrada + Objetivo
        End If
        .ExitLong AtStop, 1, pstoploss
    End If
  
    'salida cortos
    If (pos_abierta = -1) Then 
        pstoploss = pentrada + StopPerdidas     
        If (.GetMarketPosition = -1) Then     
            If (.GetBarsSinceEntry() = 0) Then
                precio_ts = pentrada
            End If         
            If (.Low() < precio_ts) Then
                precio_ts = .Low()
            End If         
            If (precio_ts + TrailingStop < pstoploss) Then
                pstoploss = precio_ts + TrailingStop
            End If         
            .ExitShort AtLimit, 1, pentrada - Objetivo
        End If     
        .ExitShort AtStop, 1, pstoploss
    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

Estudio de las divergencias en el RSI