Automatizar la actualización de los tickers composite
Si me habéis seguido hasta aquí ya habéis terminado lo más difícil. ¡Podéis calcular cualquier amplitud y mostrarla en un solo gráfico con solo hacer un scan en el Amibroker! Pero claro… si queréis calcular indicadores de varios watchlists… es muy pesado. Es pesado hasta poner todos los parámetros de los explore en caso de que uséis otros screeners intercalados con las actualizaciones… Pero aquí entran en juego los scan predeterminados y el javascript para salvarnos el día.
Los scan «predeterminados» no son más que configuraciones de explore/scan/backtest guardadas en el Amibroker por si queremos volver a usarlas en el futuro. Almacenan el watchlist sobre el que se ha pasado, el periodo temporal, la fórmula y todas las opciones, parámetros, etc que hayáis activado antes de hacer el scan. Para guardar estas variables tan solo tenéis que ir a File –> Save As… tras hacer un scan y se os guardará como un archivo «Analysis project» (*.apx).
Voy a seros sincero… yo a esto no le encontraba ningún sentido antes de lograr automatizarlo todo… se tarda más abriendo el apx que volviendo a poner los settings y las fórmulas. Eso sin contar con que si cambias la fórmula tienes que actualizar el apx para que no te de fallo, pero bueno…
Guardad todos los scan que queráis automatizar en una carpeta. Yo los tengo en Amibroker/scans. Para que un apx funcione mediante javascript necesita que el Amibroker esté abierto (no lo abre automáticamente).
A continuación creamos un archivo javascript (*.js) con la siguiente fórmula:
var AB=new ActiveXObject("Broker.Application"); var file=new Array();var Analysis=new Array(); var projectnumber=7;file[0]="C:\\Program files\\Amibroker\\scans\\sp500.apx"; file[1]="C:\\Program files\\Amibroker\\scans\\todasmp.apx"; file[2]="C:\\Program files\\Amibroker\\scans\\bonos.apx"; file[3]="C:\\Program files\\Amibroker\\scans\\metales.apx"; file[4]="C:\\Program files\\Amibroker\\scans\\energias.apx"; file[5]="C:\\Program files\\Amibroker\\scans\\dba.apx"; file[6]="C:\\Program files\\Amibroker\\scans\\amplitud.apx"; try {for(var n=0;n<projectnumber;n++) {Analysis[n]=AB.AnalysisDocs.Open(file[n]); if(Analysis[n]) {Analysis[n].Run(0); while(Analysis[n].IsBusy)WScript.Sleep(100);} } } catch(err){WScript.echo("Exception: "+ err.message);}
AB.SaveDatabase();
Os explico paso a paso:
- Creamos las variables que vamos a usar para la automatización. Un objeto ActiveX y dos arrays.
var AB=new ActiveXObject("Broker.Application"); var file=new Array(); var Analysis=new Array();
- Indicamos cuántos scan queremos automatizar. En este ejemplo para que no sea muy largo he puesto 7.
var projectnumber=7;
- Enumeramos empezando desde 0 los archivos apx indicando el directorio en el que están guardados y el nombre exacto del mismo. En javascript es necesario que el directorio en vez de tener un «\» tenga dos.
file[0]="C:\\Program files\\Amibroker\\scans\\sp500.apx"; file[1]="C:\\Program files\\Amibroker\\scans\\todasmp.apx"; file[2]="C:\\Program files\\Amibroker\\scans\\bonos.apx"; file[3]="C:\\Program files\\Amibroker\\scans\\metales.apx"; file[4]="C:\\Program files\\Amibroker\\scans\\energias.apx"; file[5]="C:\\Program files\\Amibroker\\scans\\dba.apx"; file[6]="C:\\Program files\\Amibroker\\scans\\amplitud.apx";
- Creamos el bucle que hará que se vayan abriendo los distintos scan uno detrás de otro (no simultáneamente). Modificando el número detrás del run se pueden poner también backtests y explore automáticamente, y creando varios bucles try/if se pueden hasta combinar varios tipos de scans/explore/backtest, pero ahora mismo no voy a liar más el asunto. Si existe un error durante el proceso te sale un aviso.
try {for(var n=0;n<projectnumber;n++) {Analysis[n]=AB.AnalysisDocs.Open(file[n]); if(Analysis[n]) {Analysis[n].Run(0); while(Analysis[n].IsBusy)WScript.Sleep(100);} } } catch(err){WScript.echo("Exception: "+ err.message);}
- Guardamos todos los tickers que se han descargado/creado durante el proceso (por si te quieres ir y volver al rato, para que si se va la luz no se pierda todo).
AB.SaveDatabase();
¡¡Y se acabó!!. Ahora ya podréis darle doble click al javascript y ver cómo los scans se van abriendo solos mientras os dedicáis a otras cosas… Bueno, eso si contáis con la venia del windows XD.
Dos cosas respecto al windows:
- Los archivos javascript son archivos de texto plano (como los del bloc de notas) pero tienen un par de características especiales, como la terminación en .js. Si no queréis problemas a la hora de crear el archivo bajaos un archivo .js de internet, le dais a botón derecho abrir con bloc de notas, borráis el contenido y le metéis vuestra fórmula.
- A la hora de ejecutar el javascript tiene que ser con el «Microsoft Windows Based Script Host», así que la primera vez que lo uséis también deberéis darle a botón derecho, abrir con, elegir otra aplicación, buscar ese programa y activar la casilla «Usar siempre esta aplicación para abrir los archivos .js»
Y recordad… el Amibroker debe estar abierto para ejecutar el javascript.
¡¡Buen trading!!
Buenas Alberto,
De nuevo muchas gracias por tu post.
He seguido las indicaciones de los demás post y todo ha funcionado perfecto ya que está muy bien explicado.
El tema es que la programación del foro de los indicadores auto, en vez de tener por ejemplo la variable AD como tienes tu, es la variable AdDif.
Si configuro el include de Indicadoresdeamplitud como indicas, puedo crear sin problema la linea AD con el código que tu comentas. El problema es que todos los demás códigos, mclellan, adn, etc… no me funcionan.
Hay alguna forma de hacer los pasos, y que todos los indicadores que ya funcionaban, funcionen con los composyte??
Saludos!
Uffff… yo no mezclaría ni sobreescribiría fórmulas, pero si es lo que quieres…
Lo único que debes hacer es modificar el archivo «include» y definir las variables de amplitud exactamente con los mismos nombres que los de las fórmulas que se usan en el foro.
Por ejemplo y tal como dices, en vez de poner AD = foreign (~sp500dayad,»c»), deberias poner Addif = foreign (~sp500dayad,»c»)
Tomo nota Alberto!
Entonces tu que has hecho?? Crear todas las fórmulas de nuevo para indicadores que leen tickers composyte?
Yo es que pensaba aplicar ya directamente los indicadores auto del foro, pero si puede ser más problemático me hago una serie de indicadores nuevos.
A ver, yo soy de la antigua escuela… estoy acostumbrado a tener varias versiones del mismo indicador en vez de sobreescribir códigos.
No obstante, tal como te he dicho, todo es cuestión de saber «qué variable» pasa a ser «qué composyte». Lo primero es identificar qué include del foro estás usando… Ya que hay dos distintos (AmplitudTotal e IndicadoresdeAmplitud).
En función de cuál de los dos sean (y de qué versión estés usando) te puedo traducir las variables, aunque si has entendido todas mis explicaciones no te debería costar trabajo hacerlo.
Y como último consejo, en vez de sobreescribir el archivo include del foro, crearía uno distinto y lo que haría sería cambiar la primera línea de todas las fórmulas para que dependiesen de tu nuevo include. De esta forma, en caso de un fallo de cualquier tipo te sería más fácil volver a usar temporalmente el archivo include original para seguir tirando con los indicadores.
Un saludo.
Muchas gracias Alberto, se agradece el consejo.
Saludos!