II Curso de Programación. Sistema Ejercicio 28

Esta semana publicamos la solución del ejercicio 28 de nuestro 2º Curso de Programación para Visual Chart 5. En este caso tenemos un segundo ejercicio dedicado al estudio del indicador Ichimoku Kinko Hyo.

Al igual que en el primer ejercicio (ejercicio 27), el indicador de referencia utilizado para éste sistema es la versión 2 del Ichimoku, el cual pueden encontrar en el siguiente enlace.

Ichimoku 2

Sistema Ejercicio 28: Sistema seguimiento nube Kumo

Uno de los aspectos más característicos del indicador es la representación de la nube de puntos denominada kumo. La nube es una manifestación de los precios esperados del gráfico para un periodo determinado. Este dato es mucho más interesante que observar a una media, pues acota una zona de precios probables en lugar de un único precio, lo que en términos de estadística, implica una mayor fiabilidad.

Además, la nube cambia de color en base a una serie de reglas de tendencia, por tanto, observando su color, podemos determinar si el seguimiento es alcista o bajista.

A partir del kumo se pueden aplicar diferentes estrategias: esperar el cruce del precio por encima o debajo de la nube, observar la amplitud de la nube para determinar la volatilidad del mercado, usar la nube como señal de stop de pérdidas, etc... Las reglas que usaremos en este ejercicio serán las siguientes:
1. Si la nube marca tendencia alcista y el precio está por encima de ella, entraremos largos.
2. Si la nube marca tendencia bajista y el precio está por debajo de ella, entraremos cortos.



En cuanto a las condiciones de salida, el sistema aplica un stop de pérdidas fijo, y además, a partir de alcanzar cierta ganancia, coloca el stop en base a la posición de la nube, con lo cual obtiene un stop dinámico.

En la siguiente imagen vemos ilustrada la estrategia:


En la imagen podemos observar cómo actúa el stop de pérdidas. En la entrada a corto, alcanza el margen de beneficio y partir de ese momento sitúa el stop en el nivel marcado por la nube, el cual termina alcanzando. Sin embargo, la entrada a largo no consigue alcanzar dicho nivel y por eso no desplaza el stop.

Por último, incluimos al sistema un horario de operativa.

El diseño del sistema quedaría así:

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 Contratos As Long '1
Dim HoraIni As Integer '900
Dim HoraFin As Integer '1900
Dim TenkanSENPeriod As Integer '9
Dim KijunSENPeriod As Integer '26
Dim SenkouSPANProjection As Integer '26
Dim SenkouSPANA As Integer '52
Dim SenkouSPANB As Integer '26
Dim StopLoss As Double '75
Dim StopKumo As Double '50
'Parameters !!
Dim activastopkumo As Boolean
Dim ichdata As DataIdentifier
Dim reentrada As Integer
Dim pip As Double
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP
ichdata = .GetIndicatorIdentifier(ICHKH2, Data, 26, TenkanSENPeriod, KijunSENPeriod, SenkouSPANProjection, SenkouSPANA, SenkouSPANB, 0)
reentrada = 0
pip = .GetSymbolInfo(SbiMinMov)
activastopkumo = False
End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP
Dim pos_abierta As Integer
Dim pentrada As Double

pos_abierta = .GetMarketPosition()
pentrada = .GetEntryPrice()

Dim kumo_sup_act As Double
Dim kumo_inf_act As Double
Dim kumo_trend_act As Integer
kumo_sup_act = .GetIndicatorValue(ichdata, 0, 3)
kumo_inf_act = .GetIndicatorValue(ichdata, 0, 4)
kumo_trend_act = 1
If (kumo_inf_act > kumo_sup_act) Then
kumo_inf_act = .GetIndicatorValue(ichdata, 0, 3)
kumo_sup_act = .GetIndicatorValue(ichdata, 0, 4)
kumo_trend_act = -1
End If
Dim kumo_sup_ant As Double
Dim kumo_inf_ant As Double
Dim kumo_trend_ant As Integer
kumo_sup_ant = .GetIndicatorValue(ichdata, 1, 3)
kumo_inf_ant = .GetIndicatorValue(ichdata, 1, 4)
kumo_trend_ant = 1
If (kumo_inf_ant > kumo_sup_ant) Then
kumo_trend_ant = -1
End If

If (.Time >= HoraIni And .Time < HoraFin) Then
'entradas
If (pos_abierta <> 1) Then
If (.Close() > kumo_sup_act) Then
If (kumo_trend_act = 1 And (kumo_trend_ant = -1 Or reentrada = 1)) Then
.Buy AtClose, Contratos
pos_abierta = 1
pentrada = .Close()
activastopkumo = False
reentrada = 0
End If
End If
End If
If (pos_abierta <> -1) Then
If (.Close() < kumo_inf_act) Then
If (kumo_trend_act = -1 And (kumo_trend_ant = 1 Or reentrada = -1)) Then
.Sell AtClose, Contratos
pos_abierta = -1
pentrada = .Close()
activastopkumo = False
reentrada = 0
End If
End If
End If

'salidas
If (pos_abierta = 1) Then
If (activastopkumo = False) Then
activastopkumo = (.Close() - pentrada >= StopKumo * pip)
End If
If (activastopkumo) Then
.ExitLong AtStop, Contratos, kumo_sup_act
Else
.ExitLong AtStop, Contratos, pentrada - StopLoss * pip
End If
ElseIf (pos_abierta = -1) Then
If (activastopkumo = False) Then
activastopkumo = (pentrada - .Close() >= StopKumo * pip)
End If
If (activastopkumo) Then
.ExitShort AtStop, Contratos, kumo_inf_act
Else
.ExitShort AtStop, Contratos, pentrada + StopLoss * pip
End If
End If
Else
If (pos_abierta = 1) Then
.ExitLong AtClose, Contratos
reentrada = 1
ElseIf (pos_abierta = -1) Then
.ExitShort AtClose, Contratos
reentrada = -1
End If
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