Descripción ,Historia y Origen.

Este sistema fue originalmente desarrollado por Jordi Gumbert y en la actualidad se puede encontrar en la web www.libanesweb.com dentro de la sección de estrategias.
Libanés hizo un gran trabajo de recopilación de estrategias de todo tipo y su formulación para metastock y realizó un estudio sobre todas ellas para tratar de identificar cuales eran las que mejor se comportaban en función del comportamiento del mercado. En su web podéis ver el estudio y sus conclusiones.

La estrategia utilizada como ejemplo para ilustrar como se podría automatizar cualquier estrategia con visual chart para enviar a mercado órdenes a través de la TWS ha sido la de Jordi por una razón fundamental: funciona bien en cualquier tipo de mercado. Además el estudio fue hecho antes del año 2000 y vamos a utilizar sus conclusiones para después analizar si los resultados posteriores han sido los esperados o hay que modificar alguna idea.

La estrategia está basada en el oscilador DI positivo y DI negativo en su interpretación tradicional.
La novedad que introdujo Jordi fue añadir una media al oscilador y utilizar los cruces de las medias de los osciladores para operar en vez del cruce de los osciladores:

' Se comprueba si es un cruce al alza o a la baja
If .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo2, 1, 1) < .GetIndicatorValue(AvExponentialDINegativeDataPeriodo4, 1, 1) _
And .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo2) >= .GetIndicatorValue(AvExponentialDINegativeDataPeriodo4) Then
' Cruce al alza.

.Buy AtMarket, 1


Else

If .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo4, 1, 1) > .GetIndicatorValue(AvExponentialDINegativeDataPeriodo2, 1, 1) _
And .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo4) <= .GetIndicatorValue(AvExponentialDINegativeDataPeriodo2) Then
'Cruce a la baja

.Sell AtMarket, 1


End If
End If

Este código es para Visual Chart. En el primer if se especifica que si la media DIpositivo de ayer estaba por debajo de la media DInegativa y hoy está por encima es que ha habido un cruce al alza la tendencia es alcista y por lo tanto entramos comprados (compramos un futuro o acciones) en mercado.
En el segundo if se especifica lo contrario : si la media DIpositivo de ayer estaba por encima de la media DInegativa y hoy está por debajo es que ha habido un cruce a la baja la tendencia es bajista y por lo tanto entramos vendidos (vendemos un futuro o acciones) en mercado.

Tal y como está planteado el código siempre estamos en mercado o comprados o vendidos pero no tiene porqué ser así. Se puede modificar para que opere sólo al alza o a la baja pero para este ejemplo vamos a dejarlo así.

Sólo falta añadirle las líneas necesarias para que envíe las órdenes a mercado:

numeroArchivo = FreeFile

Open "C:\Archivos de Programa\TSimPlus\auto.tsm" For Binary Access Write Shared As #numeroArchivo
'Donde pone "C:\Archivos de Programa\TSimPlus\" hay que poner la ruta donde cada uno tenga instalado el
'Tsimplus

' Se comprueba si es un cruce al alza o a la baja
If .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo2, 1, 1) < .GetIndicatorValue(AvExponentialDINegativeDataPeriodo4, 1, 1) _
And .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo2) >= .GetIndicatorValue(AvExponentialDINegativeDataPeriodo4) Then
' Cruce al alza.

.Buy AtMarket, 1
numeroArchivo = FreeFile
tipoOrden="buymkt"

Open "C:\Archivos de Programa\TSimPlus\auto.tsm" For Binary Access Write Shared As #numeroArchivo
'Donde pone "C:\Archivos de Programa\TSimPlus\" hay que poner la ruta donde cada uno tenga 'instalado el Tsimplus

Put #numeroArchivo, , "place," & tipoOrden & ",estx50,1, , "

Close #numeroArchivo
Else
If .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo4, 1, 1) > .GetIndicatorValue(AvExponentialDINegativeDataPeriodo2, 1, 1) _
And .GetIndicatorValue(AvExponentialDIPositiveDataPeriodo4) <= .GetIndicatorValue(AvExponentialDINegativeDataPeriodo2) Then
'Cruce a la baja

.Sell AtMarket, 1
numeroArchivo = FreeFile
tipoOrden="sellmkt"

Open "C:\Archivos de Programa\TSimPlus\auto.tsm" For Binary Access Write Shared As #numeroArchivo
'Donde pone "C:\Archivos de Programa\TSimPlus\" hay que poner la ruta donde cada uno tenga 'instalado el Tsimplus

Put #numeroArchivo, , "place," & tipoOrden & ",estx50,1, , "

Close #numeroArchivo

End If
End If

El sistema completo incluyendo definición e inicialización de variables es SGumbertVer0.vba

Por limitaciones del programa Tsim+ el límite máximo de operaciones está limitado a una operación cada 350 milisegundos . Así que si queremos enviar a mercado varias órdenes a la vez es necesario hacerlo con un intervalo algo mayor por ejemplo 400 milisegundos.

Dudas ,sugerencias, errores ... enviar un correo a equipo@Visualbolsa.com