II Curso de Programación. Sistema Ejercicios 23 al 26

Los ejercicios del 23 al 26 de nuestro 2º Curso de Programación estuvieron dedicados a la utilización de métodos de consulta de fecha y hora. El conjunto de ellos quedó recogido en un mismo sistema cuyo diseño publicamos a continuación.

Sistema Ejercicio 23: Sistema Una Entrada por Día

Como decíamos, la finalidad de éste grupo de ejercicios era la de ver con diferentes ejemplos cómo podemos acceder a los datos de fecha y hora así como las distintas consultas que podemos llevar a cabo. El punto de partida consistía en un sistema que opera en base a la tendencia determinada por una media móvil simple de periodo 15. La particularidad del sistema reside en que sólo queremos realizar un negocio por sesión. Para añadir este filtro, deberemos acceder al campo de fecha de cada barra y controlar que sólo puede hacer un nuevo negocio si se produce un cambio de día.


Como vemos en el ejemplo, tras cerrar cada negocio, el sistema no ejecuta uno nuevo hasta que no se produce el cambio de día, lo que da lugar a que todos los negocios se abran en la barra de apertura de sesión.

Además de esto, añadimos tres filtros temporales más al sistema:



Modificación 1 (ejercicio 24). Añadir filtro Operar sólo los viernes
Añadimos un parámetro con el cual poder activar/desactivar este filtro (filtro SoloViernes).
Si SoloViernes valía 1, entonces activábamos el filtro y por tanto sólo se podían realizar negocios los viernes
Conseguimos gracias a esto tener un ejemplo de referencia para poder filtrar negocios en base a un día concreto de la semana.

Modificación 2 (ejercicio 25). Añadir filtro Operar sólo la segunda quincena
Añadimos un parámetro con el cual poder activar/desactivar este filtro (filtro SoloSegundaQuincena).
Si SoloSegundaQuincena valía 1, entonces activábamos el filtro y por tanto sólo se podían realizar negocios a partir del día 15 de cada mes. 
La finalidad del ejercicio consistía en mostrar cómo podemos extraer el número de día del campo de fecha.

Modificación 3 (ejercicio 26). Añadir filtro Operar sólo los meses pares.
Añadimos un parámetro con el cual poder activar/desactivar este filtro (filtro SoloMesPar).
Si SoloMesPar valía 1, entonces activábamos el filtro y por tanto sólo se podían realizar negocios en meses pares (febrero, abril, junio, ...). 

La finalidad del ejercicio consistía en mostrar cómo podemos extraer el número de mes del campo de fecha.

El desarrollo del sistema sería el siguiente:

Código PDV:
Observen que la principal particularidad de éste sistema es que las funciones que no están implementadas para la Plataforma Visual pueden añadirse entrecomillando la función dentro de un elemento de tipo sentencia.


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 SoloViernes As Integer '1
Dim SoloSegundaQuincena As Integer '1
Dim SoloMesPar As Integer '1
Dim Periodo As Integer '15
Dim StopInicial As Double '75
Dim TrailingStop As Double '65
Dim HoraEntrada As Integer '800
Dim HoraSalida As Integer '2200
'Parameters !!
Dim avdata As DataIdentifier
Dim preciots As Double
Dim activarts As Boolean
Option Explicit
Public APP As SysUserApp
Implements System
Public Sub System_OnInitCalculate()
With APP


avdata = .GetIndicatorIdentifier(AvSimple, Data, Periodo, PriceClose)
activarts = False
preciots = 0

End With
End Sub
Public Sub System_OnCalculateBar(ByVal Bar As Long)
With APP

Dim medact As Double

medact = .GetIndicatorValue(avdata)

Dim pos_abierta As Integer
Dim pentrada As Double

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

If (.Time() >= HoraEntrada And .Time() < HoraSalida) Then
If (pos_abierta = 0) Then
Dim nuevaentrada As Boolean
If (.NumberOfTrades() = 0) Then
nuevaentrada = True
Else
If (.Date(.GetBarsSinceExits(1)) <> .Date()) Then
nuevaentrada = True
End If
End If

If (nuevaentrada) Then
'solo viernes
If (SoloViernes = 1) Then
If Weekday(.TimeEx(), vbMonday) <> 5 Then
nuevaentrada = False
End If
End If

'solo segunda quincena
If (SoloSegundaQuincena = 1) Then
If DatePart("d", .TimeEx()) < 15 Then
nuevaentrada = False
End If
End If

'solo mes par
If (SoloMesPar = 1) Then
If DatePart("m", .TimeEx()) Mod 2 <> 0 Then
nuevaentrada = False
End If
End If

If (nuevaentrada) Then
If (.Close() > medact) Then
.Buy AtClose, Contratos
pos_abierta = 1
pentrada = .Close()
activarts = False
ElseIf (.Close() < medact) Then
.Sell AtClose, Contratos
pos_abierta = -1
pentrada = .Close()
activarts = False
End If
End If
End If
End If

If (pos_abierta = 1) Then
If (activarts = False) Then
If (.Close() - pentrada) >= TrailingStop Then
activarts = True
preciots = .Close()
End If
End If
If (activarts) Then
If (.Close() > preciots) Then
preciots = .Close()
End If
.ExitLong AtStop, Contratos, preciots - TrailingStop
Else
.ExitLong AtStop, Contratos, pentrada - StopInicial
End If
ElseIf (pos_abierta = -1) Then
If (activarts = False) Then
If (pentrada - .Close()) >= TrailingStop Then
activarts = True
preciots = .Close()
End If
End If
If (activarts) Then
If (.Close() < preciots) Then
preciots = .Close()
End If
.ExitShort AtStop, Contratos, preciots + TrailingStop
Else
.ExitShort AtStop, Contratos, pentrada + StopInicial
End If
End If
Else
If (pos_abierta = 1) Then
.ExitLong AtClose, Contratos
ElseIf (pos_abierta = -1) Then
.ExitShort AtClose, Contratos
End If
End If
End With
End Sub


Comentarios

Entradas populares de este blog

Como consultar el GAP % de un conjunto de valores

Bollinger Volatility Oscillator N

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