Una línea decide lo que tu script puede hacer
Todo script de Pine se declara como uno de unos pocos tipos, y la declaración es la segunda línea del archivo [2]. Dos de esos tipos importan aquí:
//@version=6
indicator("Mi indicador") // dibuja en el gráfico
//@version=6
strategy("Mi estrategia") // dibuja, y además opera
La explicación habitual es «las estrategias se pueden backtestear». Es cierto y se salta el mecanismo, que es más útil conocer.
strategy() enciende el emulador de bróker
strategy() (se abre en una pestaña nueva) no añade un botón de backtest. Acopla un bróker simulado a tu
script. Todo lo que se asocia con una estrategia existe porque ese emulador está
funcionando:
| Lo que obtienes | Porque |
|---|---|
| el panel Strategy Tester | ahora hay una cuenta simulada de la que informar |
strategy.entry(), strategy.exit(), strategy.close() | hay algo a lo que enviar órdenes |
| una curva de capital y una cifra de drawdown | el emulador lleva un saldo |
| la List of Trades | el emulador registra sus propias ejecuciones |
el estado de la posición y strategy.closedtrades | el emulador mantiene posiciones |
Por eso no puedes añadirle un backtest a un indicador. Un script indicator() (se abre en una pestaña nueva)
no tiene cuenta, ni órdenes, ni posición — no porque se le haya negado la
función, sino porque no hay un bróker al otro lado.
El emulador es un modelo, y conviene conocer sus suposiciones
Como tus resultados salen de una simulación, las reglas de la simulación forman parte de tus resultados. Las dos más importantes están documentadas:
- En una barra cuyo rango contiene tu stop y tu objetivo, el emulador deduce cuál llegó primero según dónde esté la apertura respecto al máximo y al mínimo [1]. Es una regla determinista, no una medición — el detalle está en gestión de riesgo.
- Si el precio cruza el nivel de una orden dentro de un hueco entre barras, el emulador asume que no existen datos intrabarra en el hueco [1]. Así que un stop dentro de un hueco de fin de semana no se ejecuta a tu precio de stop.
Ninguna es un defecto. Es lo que un simulador tiene que hacer cuando solo tiene barras. Pero significan que «el backtest dice» es siempre una abreviatura de «el emulador, bajo estas suposiciones, dice».
Dos consecuencias prácticas
Un indicator() vendido como bot no lo es. Puede dibujar flechas y lanzar
alertas; no puede mantener una posición ni informar de un drawdown. Si la segunda
línea de un script publicado dice indicator(, ninguna curva de capital que
muestre salió de ese script.
Convertir un indicador en estrategia no es renombrarlo. Tienes que decidir
cosas que el indicador nunca necesitó: cuándo entrar, cuándo salir, cuánto, y qué
pasa con una posición abierta cuando la señal se repite. Pine pone pyramiding (se abre en una pestaña nueva)
en 1 por defecto [1], así que esa última tiene respuesta la elijas o no.
Esas decisiones son el trabajo de verdad, y son las mismas que convertir una estrategia manual obliga a sacar a la luz.
Cómo convertir un indicador en una estrategia
La sección anterior dice que convertir un indicador no es cambiarle el nombre. Esta muestra en qué consiste la conversión, paso a paso, con un mismo indicador de principio a fin: un script de RSI que marca la barra en la que el RSI vuelve a cruzar por encima de 30.
//@version=6
indicator("RSI cross", overlay = false)
rsiLen = input.int(14, "RSI length")
r = ta.rsi(close, rsiLen)
plot(r, "RSI")
crossUp = ta.crossover(r, 30)
plotshape(crossUp, "Cross up", shape.triangleup, location.bottom)
alertcondition(crossUp, "RSI cross up", "RSI crossed above 30")
Este script responde a una sola pregunta: ¿cuándo se cumple la condición? Una estrategia tiene que responder a cuatro más.
1. Cambia la declaración y escribe sus valores por defecto
Sustituye indicator( por strategy(. Eso enciende el emulador de bróker, y
además te da ajustes que no elegiste. Si no los defines, la comisión es cero, el
deslizamiento es cero, cada orden es de un contrato o una unidad y
pyramiding vale 1. Un informe con esos valores describe un mercado sin
costes. Así que escríbelos, con las cifras de tu bróker en lugar de las de
ejemplo:
strategy("RSI cross strategy", overlay = false,
initial_capital = 10000,
default_qty_type = strategy.cash, default_qty_value = 1000,
commission_type = strategy.commission.percent, commission_value = 0.05,
slippage = 2,
pyramiding = 1)
Una cantidad fija de efectivo por operación deja la prueba sin interés compuesto, que hace parecer mejor una regla mediocre cuanto más larga es la prueba.
2. Convierte la señal en una entrada
El triángulo se convierte en una orden:
if crossUp and strategy.position_size == 0
strategy.entry("Long", strategy.long)
Aquí cambian dos cosas. La orden se decide al cierre de la barra y, por defecto,
se ejecuta en la apertura de la barra siguiente, no al precio en el que se
dibujó el triángulo. Y strategy.position_size == 0 responde a la pregunta que
el indicador nunca tuvo: qué pasa cuando la señal se repite con una operación
abierta. Aquí, nada.
Deja las llamadas a ta.rsi() y ta.crossover() donde estaban, en su propia
línea y en el nivel superior, para que se ejecuten en cada barra.
3. Decide la salida
El indicador nunca la necesitó, y es de donde sale la mayor parte del resultado.
Las opciones habituales son un stop y un objetivo con strategy.exit(), una
salida por señal contraria con strategy.close() o un límite de tiempo. Un stop
y un objetivo, en porcentaje del precio de entrada:
stopPct = input.float(1.0, "Stop loss %")
targetPct = input.float(2.0, "Take profit %")
if strategy.position_size > 0
entryPrice = strategy.position_avg_price
strategy.exit("Exit", "Long",
stop = entryPrice * (1 - stopPct / 100),
limit = entryPrice * (1 + targetPct / 100))
Fíjate en lo que no está: que el RSI vuelva a cruzar por debajo de 70 no cierra nada si no escribes esa regla. Una flecha del indicador nunca fue una salida.
4. Lleva el tamaño y los costes al resultado
El beneficio neto del informe es dinero, así que el tamaño y los costes del paso 1 lo mueven directamente. Antes de leer cualquier cifra, comprueba que la comisión y el deslizamiento coinciden con tu bróker; los detalles están en los parámetros de costes. Después lee el informe en el orden que explica la guía del Probador de estrategias: primero el número de operaciones y luego el drawdown.
Lo que no se traslada
| En el indicador | En la estrategia |
|---|---|
alertcondition() | no tiene efecto en una estrategia, y el Pine Editor te lo advierte; solo operan las llamadas strategy.* |
plot(), plotshape() | siguen dibujando y no cambian ningún resultado |
| un valor de un marco temporal superior | puede no haberse conocido al cierre de la barra; revisa el repintado y el lookahead antes de fiarte de la prueba |
| «en el gráfico se ve bien» | ahora es un número de operaciones que puedes comprobar |
Las mismas reglas sin escribir Pine
En el Strategy Builder de AlfaTactix eliges TradingView como plataforma en el
paso 1 de sus 7 pasos. La regla del indicador va en el paso 3, Reglas de
entrada; el stop y el objetivo, en el paso 5, Salidas; el tamaño, en el paso 6,
Riesgo y gestión del dinero. Obtienes un archivo strategy() de Pine Script v6
en el que cada indicador está escrito como código que puedes leer.
El límite es real: el formulario ofrece 47 tipos de indicador integrados y no importa código Pine, así que no puedes pegar un indicador personalizado. Si tu indicador es uno de esos tipos, rehaces su regla en el formulario; si no lo es, el camino es el código de arriba. Para empezar desde tu regla, créala en el generador de Pine Script.
Lo que no es una estrategia de TradingView
La palabra estrategia está haciendo tres trabajos distintos en este tema, y confundirlos es caro:
- un script de Pine cuya declaración es
strategy() - un plan de trading — reglas, tamaño, cuándo no vas a operar
- un sistema automatizado que coloca órdenes en un bróker
Un script strategy() es el primero. Con frecuencia se vende como el tercero.
No coloca órdenes
Este es el límite que merece precisión. Una estrategia puede lanzar alertas, y una alerta creada desde una estrategia puede configurarse para que los eventos de ejecución de órdenes también la disparen [5]. Pero una alerta es una notificación. Pasar de una alerta disparada a una posición abierta requiere una integración con el bróker, y el retardo entre ambas es tuyo: no está en el emulador, que asumió que la ejecución ocurrió al precio que modeló.
Y un detalle que sorprende a casi todos:
Las alertas solo se disparan en la barra en tiempo real. [5]
Así que un backtest que muestra doscientas operaciones produce cero alertas. Cada ejecución del informe es una reproducción del historial; una alerta es un evento en tiempo real. Nada en la parte histórica del gráfico disparó nunca una, y ninguna configuración lo cambia. El comportamiento completo, incluida la constante de frecuencia que por defecto dispara intrabarra y no al cierre, está en ejecutar y mantener una estrategia.
No es un plan de trading
Un script strategy() contiene entradas, salidas y tamaño. Un plan de trading
contiene además las partes que nunca se vuelven código: cuánto de tu capital
recibe esta idea, qué haces cuando está en drawdown, cuándo la abandonarías, y
qué más estás ejecutando en paralelo.
El script no puede contenerlas, y un backtest no puede probarlas. Por eso una estrategia con buena curva de capital y sin plan alrededor sigue fracasando, y no porque el código estuviera mal.
No es evidencia por sí solo
Un script strategy() que compila, se ejecuta e informa de un beneficio ha
demostrado que el emulador, bajo sus suposiciones, en esta porción de
historial, con estos parámetros, produjo esta curva. Cada cláusula de esa frase
es una salvedad:
| Cláusula | Por qué limita la afirmación |
|---|---|
| las suposiciones del emulador | el orden intrabarra se deduce, los huecos se tratan como vacíos [1] |
| esta porción de historial | cuánta te dan depende de tu plan de cuenta [6] |
| estos parámetros | si probaste diez conjuntos, el mejor es una estimación sesgada |
| este instrumento | el slippage va en ticks, y un tick no mide lo mismo en otro sitio |
Nada de eso vuelve inútil el backtesting. Lo convierte en un filtro y no en un pronóstico: puede decirte que una idea está rota, y no puede decirte que una idea sea buena.
¿Para qué sirve entonces?
Para especificar una idea con precisión suficiente para que pueda estar equivocada. Suena modesto y es todo el valor. Una regla que puedes enunciar, probar y auditar es una que puedes mejorar; una sensación discrecional es una sobre la que solo puedes discutir.

