Diseñaste una estrategia en Pine Script y quieres que opere sola. Pero TradingView no ejecuta órdenes en tu bróker directamente (salvo integraciones nativas). El puente es el webhook: la alerta se dispara, envía un mensaje a un servidor tuyo, y ese servidor ejecuta la orden vía API del bróker. Esta guía monta ese pipeline entero — y es honesta sobre dónde puede fallar.
01La arquitectura de punta a punta
Son cuatro eslabones. Entender el flujo es esencial antes de escribir una línea:
Requisito previo: la función de webhook en las alertas exige un plan de pago de TradingView. Los planes gratuitos no envían webhook. Y necesitas un servidor con URL pública (una VPS, o servicios tipo Render/Railway) para recibir el POST.
02Paso 1: la alerta en TradingView
En tu Pine Script usas alert() con un mensaje en JSON (para que el servidor lo interprete). Después, al crear la alerta en la interfaz, pegas la URL de tu webhook en el campo "URL del Webhook".
// en Pine Script — mensaje estructurado en JSON if ta.crossover(ma_rapida, ma_lenta) alert('{"segredo":"MEU_SEGREDO","acao":"COMPRA","ativo":"BTCUSDT","qtd":0.01}', alert.freq_once_per_bar_close)
El segredo es vital — es lo que impide que cualquiera que descubra tu URL dispare órdenes falsas. Veremos la validación en el servidor.
03Paso 2: el servidor receptor
Un servidor simple en Python con FastAPI que recibe el webhook, valida el secreto y procesa:
# servidor.py from fastapi import FastAPI, Request, HTTPException import os app = FastAPI() SEGREDO = os.getenv("WEBHOOK_SECRET") # nunca hardcodear @app.post("/webhook") async def webhook(request: Request): dados = await request.json() # 1. valida el secreto — bloquea peticiones falsas if dados.get("segredo") != SEGREDO: raise HTTPException(status_code=403, detail="Não autorizado") # 2. interpreta la señal acao = dados.get("acao") ativo = dados.get("ativo") qtd = dados.get("qtd") # 3. ejecuta en el bróker (función de su módulo de ejecución) if acao == "COMPRA": executar_compra(ativo, qtd) elif acao == "VENDA": executar_venda(ativo, qtd) return {"status": "ok", "acao": acao}
La función executar_compra usa la API del bróker — exactamente el código que mostramos en el tutorial de Binance o en la API de MT5. El webhook solo sustituye la parte que "decide" — ahora quien decide es el Pine Script.
La seguridad es obligatoria, no opcional: tu URL de webhook es pública. Sin validación por secreto, cualquiera que descubra la URL puede disparar órdenes en tu cuenta. Usa siempre: (1) un secreto en el mensaje, (2) HTTPS, (3) idealmente valida también la IP de origen de TradingView. Trátalo como tratarías la contraseña del banco.
04Paso 3: dónde alojar el servidor
El servidor necesita URL pública y estar siempre en línea. Opciones:
- VPS (la misma del bot) — control total, IP fija para que puedas filtrar. Mira nuestra guía de VPS.
- Plataformas de deploy (Render, Railway, Fly.io) — levantan el servidor rápido, tienen plan gratuito limitado. Bueno para probar.
- Túnel local (ngrok) — solo para pruebas, expone tu PC local temporalmente. Nunca para producción.
¿Necesitas una VPS para alojarlo?
Mira cómo elegir y configurar la VPS que va a correr tu servidor de webhook 24/7.
05Webhook vs. integración nativa
Antes de montar todo este pipeline, considera la alternativa: algunos brókeres tienen integración nativa con TradingView — envías la orden directo desde el gráfico, sin servidor intermediario. Pepperstone es un ejemplo. Compara:
- Webhook + servidor: flexible (funciona con cualquier bróker que tenga API), pero añade puntos de fallo (servidor, latencia, seguridad) y exige mantenimiento.
- Integración nativa: más simple y confiable (sin un servidor tuyo en medio), pero limitada a los brókeres que la ofrecen y a lo que la integración permite.
Recomendación: si tu bróker tiene integración nativa y le sirve a tu estrategia, prefiérela — menos cosas que se puedan romper. El webhook brilla cuando necesitas lógica personalizada en medio (ej.: gestión de riesgo propia, múltiples brókeres) o cuando el bróker solo ofrece API, no integración con TradingView.
06Los riesgos honestos de la automatización por webhook
Lo que puede salir mal (y va a salir, tarde o temprano): el servidor puede caerse y pierdes la señal. La petición puede perderse en la red. Hay latencia entre la alerta y la ejecución (los segundos pueden importar). Una alerta puede dispararse dos veces (orden duplicada). Necesitas logs, idempotencia (no ejecutar la misma orden dos veces) y monitoreo. La automatización por webhook es poderosa, pero no es "configúralo y olvídate".
Prácticas que reducen el riesgo: registrar cada petición recibida y cada orden enviada; implementar idempotencia (cada alerta tiene un ID, ignora los repetidos); tener un "kill switch" (una forma de apagar todo rápido); y — siempre — probar el pipeline entero en cuenta demo durante semanas antes de pasar a real.
07Preguntas frecuentes
¿Qué es un webhook de TradingView?
Es una petición HTTP que TradingView envía automáticamente a una URL tuya cuando se dispara una alerta. Esa petición puede activar un servidor que ejecuta órdenes en el bróker, automatizando estrategias hechas en Pine Script.
¿Necesito un plan de pago de TradingView?
Sí. La función de webhook en las alertas exige un plan de pago. Los gratuitos no permiten enviar webhook. Además, necesitas un servidor con URL pública para recibirlo.
¿Es seguro automatizar por webhook?
Tiene riesgos: la URL es pública (necesita validación por secreto), el servidor puede caerse, hay latencia y las alertas pueden duplicarse. Para estrategias sensibles al tiempo, la integración nativa es más confiable. Prueba siempre en demo y usa logs, idempotencia y kill switch.
¿Cuál es la diferencia con la integración nativa?
La integración nativa (ej.: Pepperstone) ejecuta directo desde el gráfico, sin un servidor tuyo — más simple y confiable. El webhook es más flexible (cualquier bróker con API, lógica personalizada en medio) pero añade puntos de fallo. Prefiere la nativa cuando te sirva.
¿Puedo usar webhook para la B3 brasileña?
Sí, siempre que tu bróker tenga una API accesible. El servidor receptor llamaría a la API del bróker (o al puente MT5-Python) para ejecutar en la B3. El flujo es el mismo; solo cambia la función de ejecución al final.