Scripting: escribir un indicador (JavaScript)
Un script de indicador define compute(bars, params, ctx) y devuelve una lista de salidas. Esta página enumera las formas que puede devolver, de dónde salen sus parámetros y cómo se guarda el script.
Senzoukria · Documentación · Actualizado en septiembre de 2026
Dónde encontrarlo
- Dónde
- Página Scripting → Nuevo indicador
- Punto de entrada
- compute(bars, params, ctx), que devuelve un array de salidas
- Destino
- «En el gráfico» (superpuesto) o «Panel propio»
- Lenguaje por defecto
- JavaScript; un script sin lenguaje registrado se lee como JavaScript
- Presupuesto
- 2 segundos por ejecución, en un worker sin red, sin acceso a archivos y sin API de la plataforma
Qué hace
compute() recibe las barras, los valores de los parámetros y un contexto, y devuelve una lista de salidas. El renderizador solo conoce esas salidas —nunca qué script las produjo—, así que añadir un indicador jamás toca el pipeline.
El tiempo viaja en la marca de tiempo de bucket de cada barra, en nanosegundos, la clave temporal de todo el pipeline de footprint. Un punto cuyo valor es null es un hueco: el renderizador levanta el lápiz en vez de trazar una recta falsa a través de un calentamiento o de un reinicio de sesión.
Merece la pena respetar dos convenciones, porque los indicadores integrados las siguen: el delta de un nivel es el volumen comprador menos el vendedor y el delta de una barra es la suma de sus niveles; y el tamaño de tick sale del contexto, nunca escrito a mano en el código.
Formas de salida
| Forma | Por defecto | Qué cambia |
|---|---|---|
| line | grosor 1 | Una serie alineada con las barras; los valores null son huecos. |
| histogram | — | Columnas con un color positivo y otro negativo; una barra sin valor no emite ningún punto. |
| bands | fill 0,12 | Series superior, base e inferior con una opacidad de relleno acotada entre 0 y 1. No existe un helper lib.bands en JavaScript: se construye con of.bands en Python, o se devuelve como objeto plano. |
| markers | — | Puntos a un precio sobre una barra, como punto, flecha arriba o abajo o cuadrado, con etiqueta opcional. |
| levels | to = null | Niveles horizontales de una barra a otra; un final null lleva el nivel hasta el borde derecho. |
| table | align left | Una tabla flotante en el DOM: se puede leer, seleccionar y copiar. |
| panel | — | Un panel pequeño de filas etiqueta/valor, coloreables de forma opcional. |
Parámetros
Los parámetros se pueden declarar en el panel del editor, pero un script también puede leer una clave directamente del código. El lector de parámetros analiza el código de forma estática buscando las tres formas que realmente se escriben —params.get("clave", defecto), params["clave"] y params.clave ?? defecto— además de alias de una línea, como una lambda o una función flecha que envuelva params.
Eso es lo que alimenta la opción «Explorar todos los parámetros legibles» del asistente de backtest, que configura hasta cinco ejes a partir de los parámetros que tu script lee de verdad, con valores alrededor de sus defectos. Es una propuesta en un campo que puedes corregir, no un contrato: una clave construida o un bucle sobre un diccionario no se verán.
Límites y trampas
- Devolver algo que no sea una de las formas anteriores se informa como valor de retorno no reconocido, en lugar de dibujarse.
- Una ejecución que termina sin error y no pinta nada suele significar que los valores devueltos no son números.
- Los scripts viven en el almacenamiento local de esta máquina; no se sincronizan ni se respaldan por ti.
- table y panel son las dos únicas formas que no se dibujan en el canvas: salen como DOM, porque una tabla tiene que poder seleccionarse.
Páginas relacionadas
Esta página en otros idiomas
Preguntas frecuentes
- ¿Cómo llevo mi indicador al gráfico?
- Guárdalo y activa «Mostrar en el gráfico». Se suma al panel de Indicadores, en el grupo «Mis scripts», y desde ahí se activa y se desactiva como cualquier otro indicador.
- ¿Puede un script devolver varias salidas?
- Sí. compute() devuelve un array, y los indicadores integrados hacen lo mismo: un VWAP, por ejemplo, emite una salida bands y una salida line.
- ¿Por qué falta mi media móvil al principio del gráfico?
- Porque los valores de calentamiento se devuelven como null, y null levanta el lápiz. Trazar a través de ellos inventaría datos que el período todavía no ha producido.