PineForge ejecuta backtests deterministas de Pine Script fuera de TradingView: offline, en una imagen Docker.
¿Por qué offline?
El backtest en el navegador destaca para iterar junto al gráfico. El modo sin conexión es lo adecuado cuando el siguiente paso es capital real: pista de auditoría, CI que valide cada commit y un resultado de hace dos meses que se reproduzca hoy, operación por operación.
Ejecutar sin conexión te da lo que el motor en navegador no ofrece: resultados determinista. El mismo script, los mismos datos y la misma versión de la imagen dan las mismas operaciones. Fijas la versión de la imagen, guardas los informes en un repositorio, comparas listas de operaciones entre commits y lo ejecutas todo sin interfaz en CI. El CSV que usas es tuyo, el motor se ejecuta en local y el informe registra una huella de lo que lo generó.
La lista práctica: versiones de imagen fijadas, para que un commit de hace dos meses dé hoy la misma lista de operaciones; tus propios datos, desde velas de un exchange hasta barras que construyes a partir de ticks, siempre que sean OHLCV; comprobaciones en CI que hacen fallar la compilación ante una regresión; y una estrategia que es un archivo y no depende de una plataforma concreta.
Si alguna vez intentaste compartir un backtest y solo pudiste enviar una captura del gráfico, te falta ejecutar en modo sin conexión.
Cómo hacer un backtest de Pine Script offline
PineForge transpila PineScript v6 a C++ nativo y lo ejecuta en tu máquina con una sola imagen Docker.
Tres pasos. La imagen se descarga una sola vez; a partir de ahí, todo se ejecuta sin conexión.
Paso 1: descarga el runtime
Una sola imagen, ghcr.io/pineforge-4pass/pineforge-release. Sin pip, sin clave, sin registro: la transpilación, la compilación y el backtest se ejecutan dentro de ella, sin conexión. El motor que contiene es Apache-2.0; el transpilador que incluye es gratuito para trading personal.
Paso 2: transpila tu Pine a C++
Ejecuta la imagen en modo solo transpilación y convertirá tu PineScript v6 en un archivo fuente C++ completo, en local. Durante el backtest no se ejecuta ningún intérprete de Pine: la imagen compila el C++ a código nativo.
docker run --rm --network=none \
-e PINEFORGE_TRANSPILE_ONLY=1 \
-v "$(pwd)/my_strategy.pine":/in/strategy.pine:ro \
ghcr.io/pineforge-4pass/pineforge-release:1.10.0 > strategy.cppPaso 3: haz el backtest
Monta tu CSV OHLCV junto al C++ generado y ejecuta la imagen. El CSV necesita la cabecera timestamp,open,high,low,close,volume, con las marcas de tiempo en milisegundos UNIX. El motor ejecuta la estrategia barra a barra y escribe un informe JSON en stdout. También puedes saltarte el paso 2: monta strategy.pine en su lugar y la imagen lo transpila primero.
docker run --rm --network=none \
-v "$(pwd)/strategy.cpp":/in/strategy.cpp:ro \
-v "$(pwd)/ohlcv.csv":/in/ohlcv.csv:ro \
ghcr.io/pineforge-4pass/pineforge-release:1.10.0 > report.jsonEl informe JSON incluye un bloque de resumen (total de operaciones, ganadoras y perdedoras, porcentaje de acierto, P&L neto, drawdown máximo), la lista completa de operaciones (horas de entrada y salida, precios, cantidad, P&L e índices de barra), métricas como el factor de beneficio, Sharpe y Sortino, la curva de capital y una huella del motor, el transpilador, los parámetros de entrada y los datos de la ejecución (null si no se pudo calcular).
Eso es todo. Sin GUI, sin re-login de cuenta, sin cargar charts. Si tienes Docker, tienes backtests PineForge offline.
Qué puedes backtestear
Respuesta corta: todo lo serializable como OHLCV. PineForge no está cableado a ningún data vendor. Tú traes datos; el motor corre la estrategia.
- Crypto desde tu exchange. Trades crudos de Binance, Bybit, Kraken o cualquier venue con REST/WebSocket. Agrega al timeframe que uses. Mete el CSV. Prueba el par y venue exactos que operarás.
- Barras construidas a partir de ticks. Si construyes barras a partir de ticks o del libro de órdenes, pásalas como OHLCV. Al motor le da igual de dónde vengan las barras.
- Otras series. El motor solo lee timestamp, open, high, low, close y volume; las columnas adicionales se ignoran. Una puntuación de sentimiento o una métrica on-chain solo se puede probar en backtest si la codificas en esas columnas.
Las 312 estrategias de la galería vienen del corpus abierto y cada una se evalúa frente a la propia exportación de TradingView. Con el motor en main, la comprobación del corpus fija 311 de ellas en excelente: el mismo número de operaciones, precios con un margen del 0,01 % y P&L con un margen del 1 % en el percentil 90, con límites más amplios de precio de salida y P&L para las 7 estrategias cuyas salidas trail_* se evalúan con el perfil de producción. La restante es una anomalía declarada. Para el nivel excelente, cuando TradingView muestra dos o más Signals de entrada distintos en el mismo instante exacto, al mismo precio y en la misma dirección, el motor muestra allí el mismo número de entradas distintas (identidad de entradas distintas).