¿Alguna vez has abierto el gráfico de un ticker y has visto algo similar a esto?
Si eres usuario de Amibroker y utilizas el plugin de Investing, seguramente sí. No estoy seguro si ocurre lo mismo con otros proveedores, pero no sería sorprendente.
Podrías pensar que el plugin no funciona bien y no ha descargado correctamente las cotizaciones, pero ese no es el caso. Si vamos a la fuente original, Investing, vemos el siguiente gráfico.
Es exactamente la misma curva.
Si nos acercamos un poco y analizamos la cotización de esas velas, podemos comprobar que en este caso está poniendo ceros en las aperturas. En otros casos, es posible que el cero lo ponga en el Cierre, en el Máximo o en el Mínimo.
Observa el siguiente ejemplo: en la vela seleccionada, ha asignado cero tanto a la apertura, como al máximo y al mínimo.
Llegados a este punto, tienes dos opciones:
La primera opción sería corregir las cotizaciones manualmente. Esto puede resultar un trabajo arduo que requiere mucha dedicación, aunque en el curso de Amibroker te enseñamos un pequeño truco para hacerlo más rápido y de forma mecánica.
Si aún no lo has hecho y no te quieres perder consejos como este, aún estás a tiempo 😊.
La segunda opción, y la que te quiero explicar hoy, es utilizar una función. Sí, es la primera vez que te explico cómo se crea una función, pero creo que ya era hora de explicarte una.
A continuación, te copio el código de la función y te explico línea por línea.
Vamos a definir la función FilteredArray
, que necesita dos variables: la primera, llamada Filter_Var
, podrá ser Verdadero o Falso; y la segunda, llamada Array
, tomará el array que queremos filtrar.
El objetivo de la función es convertir aquellos valores en los arrays donde detectemos un valor de cero, reemplazándolos por el valor de la vela anterior si este era diferente de cero.
A continuación, definimos tres variables locales: comp_array
, exp_array
y val_when
.
- La primera variable,
comp_array
, utiliza la funciónSparseCompress
, que filtra los arrays con valores cero y busca valores diferentes de cero para comprimirlos. - La segunda variable,
exp_array
, utiliza la funciónSparseExpand
para expandir los valores comprimidos en la variable anterior. - En la tercera variable,
val_when
, intercambiamos el valor del array por el nuevo valor expandido. - Para finalizar, utilizamos la función
IIf
para que los valores que sean cero se intercambien por el valor de la tercera variable. En el caso de no ser cero, se mantiene su mismo valor.
Hasta aquí la definición de la función.
Una vez definida, la podemo llamar como a cualquier otra función, es decir, como cuando llamamos a ROC
, ATR
o WMA
.
En este caso, tendremos que usar el argumento FilteredArray(filter_var, array)
para utilizarla.
Lo siguiente que tenemos que hacer es definir el cero. Para ello, vamos a optar por definir que el límite es inferior a 0.0001 y declaramos las variables Spike_filter
, que tomarán valores de verdadero o falso.
Si el valor del Array es mayor que 0.0001, será verdadero; en caso contrario, será falso.
A continuación, creamos unas variables internas para los arrays en las que utilizaremos la función que hemos creado.
La función, al detectar un valor de cero, asigna el valor del array anterior que no era cero.
Por último, solo tenemos que redefinir el OHLC.
Si el filtro es verdadero, es decir, si el valor del array no es cero, entonces mantiene el mismo valor.
Si detecta un cero, lo reemplaza con el valor del array anterior obtenido mediante la función.
Vamos a ver cómo se ve. Solo nos falta añadir el plot para poder agregarlo como indicador.
Es el mismo ejemplo que antes, pero la diferencia es notable.
Si te fijas, en la vela seleccionada, donde antes teníamos el OHL con ceros, ahora ha puesto el OHC de la vela anterior. Utilizar datos gratuitos tiene su coste, y este es uno de ellos, pero es mejor tener el dato de la vela anterior que tener ceros.
Para finalizar, quiero enfatizar que entender el código de esta función no es tarea sencilla. Si no tienes una base en programación avanzada, es probable que no lo entiendas completamente.
Sinceramente, a mí también me costó un buen rato, pero quería compartirlo contigo porque me pareció una idea original.
Con esto quiero decir que, aunque no entiendas del todo la función, puedes utilizarla igualmente, ya que eso sí es fácil.
Debes quedarte con la idea de que lo que hace es convertir los ceros de tu gráfico en cotizaciones más lógicas.
Saqué esta idea leyendo en el foro de Amibroker, cuyo contenido es tan vasto que no podrías terminarlo ni en diez vidas. ¿Te gustaría que explicáramos algo que no llegaste a entender?
👨💻 Código AFL de Amibroker
Espero que te haya gustado la idea. Te dejo a continuación todo el código del indicador que he utilizado.
Esto sabía hacerlo con Python, pero no tenía ni idea de que se pudiera hacer también con Amibroker!!!
Me ha encantado este artículo. Enhorabuena.
Muchas gracias Xavi!