DT Oscillator para AmiBroker

Sinceramente, no me canso de repetirlo. Qué gran programa es Amibroker!!! Nunca me cansaré de agradecer a Alquimista, Bertini y otros foristas que me lo hayan descubierto. Su tosco aspecto y sus detalles poco convencionales esconden un excelente y muy flexible lenguaje de programación y unas posibilidades poco comunes en un programa de estas características.

En el presente artículo os comento como he traducido a Amibroker el conocido DT Oscillator de Miner (de hecho, es el primer indicador que escribo para este programa, aunque he compilado unos cuantos ya) y, de paso, os enseño cómo es la estructura del código utilizado en este programa para crear indicadores y sistemas.

Bien, antes de comenzar os recomiendo que os descargueís el código AFL y lo cargueís en Amibroker. Para ello simplemente teneis que ir al Foro, descargaros el fichero AFL y copiarlo en la carpeta ..\Formulas\Custom que teneis debajo de donde hayais instalado AmiBroker. A continuación, abrid AmiBroker, id a Workspace -> Pestaña Charts, y alli os deberia aparecer en la sección Custom.

Veamos el codigo de forma detallada:

> Lo primero es declarar los parámetros:

PeriodoRSI= Param("PeriodoRSI", 13, 1, 250, 1);
PeriodoStoch=Param("PeriodoStoch", 8, 1, 250, 1);
TipoMedia=Param("TipoMedia", 1, 1, 2, 1);
PeriodoSK=Param("PeriodoSK", 5, 1, 250, 1);
PeriodoSD=Param("PeriodoSD", 3, 1, 250, 1);
BandaSuperior=Param("BandaSuperior", 70, 50, 100, 1);
BandaInferior=Param("BandaInferior", 30, 0, 50, 1);

Si no declarasemos así los parámetros, después no nos aparecerían cuando insertemos el indicador y no podríamos modificar nada. La estructura para declarar un parámetro, como podeís deducir después de ver lo anterior, es:

Nombre_Parámetro=Param("Etiqueta", Valor por defecto, Valor minimo admitido, Valor maximo admitido,Cambio minimo (esto es para cuando optimicemos));

Fijaos que todas las lineas terminan con punto y coma; esto es fundamental, si no las poneis al comprobar el código (dentro de Analysis-> Formula Editor, seleccionar Tools->Verify Syntax) seguramente os dé error.

> Ahora pasamos a hacer cálculos; primero debemos calcular un Estocástico sobre un RSI. Esto se hace con la siguiente línea:

StoRSI= 100*(( RSI( PeriodoRSI) - LLV( RSI( PeriodoRSI ) , PeriodoStoch ) ) / ( ( HHV( RSI( PeriodoRSI) , PeriodoStoch ) ) - LLV(RSI( PeriodoRSI ), PeriodoStoch ) ) );

Fijaos que ni he tenido que declarar la variable StoRSI ni insertar el RSI. Sencillamente las funciones y las variables (excepto los parámetros) se escriben tal cual, AmiBroker ya se encarga de reconocerlos. La función RSI no necesita comentario y las funciones HHV y LLV son las clasicas Mayor máximo (Highest High Value) y menor mínimo(Lowest Low Value).

> Perfecto, ya solo nos queda aplicar una media móvil a StoRSI y al resultado aplicarle otra media. Esto con otros programas sería algo más complicado pero con AmiBroker es realmente sencillo:

if(TipoMedia==1)
{
SK=MA(StoRSI,PeriodoSK);
SD=MA(SK,PeriodoSD);
}

if(TipoMedia==2)
{
SK=EMA(StoRSI,PeriodoSK);
SD=EMA(SK,PeriodoSD);
}

Observen que al declarar los parámetros he introducido uno llamado TipoMedia por si queremos tener la versión simple (asignando 1 a ese valor), que construimos con la función MA, o exponencial (pondriamos ese valor igual a 2), que construimos con la función EMA. De esta forma construimos la estructura condicional que acabamos de ver. Aqui cabe resaltar cuatro cosas:

>> La expresión a evaluar en la condición siempre va entre paréntesis después del If
>> El final de un if nunca lleva punto y coma
>> Las instrucciones a ejecutar en caso de que sea cierta la condición deben ir siempre entre llaves { }
>> Verán que hay un doble igual (==). Dicho doble igual indica que queremos saber si la variable TipoMedia ha tomado valor 1 ó 2. Si pusieramos un igual simple (=) asignariamos un valor esa variable, cosa que en este caso no queremos hacer.

Ya tenemos los indicadores. Ahora a pintarlos ;-) Para ello utilizamos la siguiente parte del código:

Plot(SK,"DTOscSK",ParamColor( "ColorSK", colorBlue ),styleLine);
Plot(SD,"DTOscSD",ParamColor( "ColorSD", colorBlack ),styleDashed);
Plot(0,"ZeroLine",ParamColor( "ColorZero", colorBlack ),styleLine);
Plot(BandaSuperior,"BandaSuperior",ParamColor( "ColorUpper", colorRed ),styleLine);
Plot(BandaInferior,"BandaInferior",ParamColor( "ColorLower", colorGreen ),styleLine);

Como pueden observar, con la función Plot representamos las dos líneas del DT Oscillator, la línea cero para referencia y dos bandas configurables. Los argumentos de ls función Plot son los siguientes:

Plot (Valor a dibujar, "Etiqueta", Color, Estilo)

Aquí entran en juego dos funciones. Por un lado, ParamColor("Etiqueta", Color), que permite asignar los siguientes colores: red, blue, green, turquoise, gold, violet, bright green, dark yellow. Mediante esta función convertimos el color en un parámetro más lo que resulta muy cómodo. Por otro lado, Style+Estilo permite asignar el estilo de la línea añadiendo una de las siguientes palabras a Style: Line, Histogram, Thick, Dots, Dashed, Candle, NoLine, Bar, SwingDots, etc.

En fin, como pueden ver, las posibilidades del lenguaje implementado en AmiBroker son bastante amplias. En breve espero tener terminados dos artículos, uno sobre lanzamiento manual de órdenes desde AmiBroker a la TWS y otro sobre la total automatización de un sistema. Espero tenerlo antes de Julio, permanezcan atentos.

Un saludo
X-Trader



Si te ha gustado este articulo, ¡compártelo en redes!