- ¿Cómo escribir indicadores y estrategias en TradingView y conectarlo a un exchange?
- Parte 1: Introducción a Pine Script (versión 5)
- Parte 2: Estructura de alarmas y webhooks en TradingView
- Parte 3: Configuración de un servidor web para recibir alarmas y enviar órdenes al exchange
- Parte 4: Implementación segura de servidores (Linux/Docker/systemd)
- Sección 5 — Consejos de seguridad y estabilidad
- Sección 6: Pruebas retrospectivas, optimización y pruebas futuras
- Sección 7 — Comparación de ubicaciones de centros de datos para el comercio
- Sección 8 — Configuraciones de servidor recomendadas para el comercio
- Sección 9: Consejos prácticos para reducir el riesgo en la automatización del trading
- Conclusión
- Preguntas frecuentes
¿Cómo escribir indicadores y estrategias en TradingView y conectarlo a un exchange?
Esta guía completa y práctica explica paso a paso cómo crear indicadores y estrategias con Pine Script versión 5, crear alarmas de webhooks en TradingView, configurar un servidor de webhooks seguro con Flask y ccxt, y ofrece consejos técnicos y de seguridad, así como la selección de ubicaciones para reducir la latencia. Este artículo es ideal para traders, desarrolladores y equipos de operaciones.
Parte 1: Introducción a Pine Script (versión 5)
La versión 5 de Pine Script incluye nuevas características y funciones avanzadas. Para empezar:
- Elija la versión: De
//@versión=5Usar. - Dos tipos principales: indicador (para visualización en el gráfico y generación de señales) y estrategia (Para realizar pruebas retrospectivas y ejecutar órdenes hipotéticas).
- Variables de entrada: De la función
aporteÚselo para parámetros modificables por el usuario. - Alarmas: De
condición de alertaÚselo para definir condiciones de alarma utilizables en TradingView.
Ejemplo de indicador simple (Cruce de EMA + filtro RSI)
//@version=5
indicator("EMA Crossover + RSI Filter", overlay=true)
// Inputs
shortLen = input.int(9, "EMA Short Length")
longLen = input.int(21, "EMA Long Length")
rsiLen = input.int(14, "RSI Length")
rsiThresh = input.int(50, "RSI Threshold")
// Price
price = close
// Indicators
emaShort = ta.ema(price, shortLen)
emaLong = ta.ema(price, longLen)
rsi = ta.rsi(price, rsiLen)
// Signals
bull = ta.crossover(emaShort, emaLong) and rsi > rsiThresh
bear = ta.crossunder(emaShort, emaLong) and rsi < rsiThresh
plot(emaShort, color=color.blue)
plot(emaLong, color=color.orange)
plotshape(bull, title="Long", location=location.belowbar, color=color.green, style=shape.labelup, text="LONG")
plotshape(bear, title="Short", location=location.abovebar, color=color.red, style=shape.labeldown, text="SHORT")
// Alerts
alertcondition(bull, title="Long Alert", message="LONG_SIGNAL")
alertcondition(bear, title="Short Alert", message="SHORT_SIGNAL")Consejos prácticos: El mensaje de alarma debe estar en formato JSON o en una estructura específica para que el servidor web pueda analizarlo fácilmente; por ejemplo: {"señal":"LARGO","símbolo":"BTCUSDT","periodo de tiempo":"1m"}.
Ejemplo de estrategia sencilla con gestión de riesgos
//@version=5
strategy("EMA Crossover Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)
// inputs ...
// (same indicators as above)
shortLen = input.int(9, "EMA Short Length")
longLen = input.int(21, "EMA Long Length")
rsiLen = input.int(14, "RSI Length")
rsiThresh = input.int(50, "RSI Threshold")
price = close
emaShort = ta.ema(price, shortLen)
emaLong = ta.ema(price, longLen)
rsi = ta.rsi(price, rsiLen)
bull = ta.crossover(emaShort, emaLong) and rsi > rsiThresh
bear = ta.crossunder(emaShort, emaLong) and rsi < rsiThresh
if bull
strategy.entry("Long", strategy.long)
if bear
strategy.entry("Short", strategy.short)
// Example Stop Loss / Take Profit
strategy.exit("Exit Long", from_entry="Long", loss=100, profit=200)
strategy.exit("Exit Short", from_entry="Short", loss=100, profit=200)Explicación: Para realizar pruebas retrospectivas más precisas que estrategia Uso y parámetros detener la pérdida y toma de ganancias Y ajuste el tamaño de la posición.
Parte 2: Estructura de alarmas y webhooks en TradingView
Después de añadir un indicador o una estrategia al gráfico, cree una nueva alerta desde el menú Alertas. En la configuración:
- Tipo de alerta: Opción URL del webhook Seleccione e ingrese la dirección de su servidor (por ejemplo, https://trade.example.com/webhook).
- Mensaje: Utilice JSON estándar; incluya campos
símbolo,acción,precio,periodo de tiempo,UUIDymarca de tiempo.
Ejemplo de mensaje de alarma:
{"symbol":"BTCUSDT","action":"LONG","price":"${close}","timeframe":"1m","strategy":"EMA_CROSS_V1"}
Parte 3: Configuración de un servidor web para recibir alarmas y enviar órdenes al exchange
Arquitectura propuesta:
- TradingView (Alerta) → Webhook HTTPS (NGINX + Flask/Node) → Bot (Lógica de Negocios) → API de Exchange (ccxt o SDK)
Requisitos previos de instalación (ejemplo para Ubuntu)
sudo apt update
sudo apt install -y python3 python3-venv python3-pip
python3 -m venv venv
source venv/bin/activate
pip install flask ccxtEjemplo app.py con Flask y ccxt
from flask import Flask, request, jsonify
import ccxt, os, hmac, hashlib, time
app = Flask(__name__)
API_KEY = os.getenv("EXCHANGE_API_KEY")
API_SECRET = os.getenv("EXCHANGE_API_SECRET")
exchange = ccxt.binance({
'apiKey': API_KEY,
'secret': API_SECRET,
'enableRateLimit': True,
})
@app.route('/webhook', methods=['POST'])
def webhook():
data = request.json
# simple validation: check data presence (use HMAC in production)
if not data:
return jsonify({"error":"no data"}),400
symbol = data.get("symbol")
action = data.get("action")
qty = data.get("qty", 0.001)
try:
if action == "LONG":
order = exchange.create_market_buy_order(symbol, qty)
elif action == "SHORT":
order = exchange.create_market_sell_order(symbol, qty)
else:
return jsonify({"error":"unknown action"}),400
return jsonify(order)
except Exception as e:
return jsonify({"error":str(e)}),500
Parte 4: Implementación segura de servidores (Linux/Docker/systemd)
Recomendación: utilice Docker Compose con nginx como proxy inverso y certbot para TLS.
Ejemplo de docker-compose.yml
version: '3.8'
services:
app:
build: .
restart: always
environment:
- EXCHANGE_API_KEY
- EXCHANGE_API_SECRET
nginx:
image: nginx:stable
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./certs:/etc/letsencrypt
ports:
- "80:80"
- "443:443"Ejemplo de unidad systemd para ejecutar sin Docker
[Unit]
Description=Trading Webhook Bot
After=network.target
[Service]
User=trade
WorkingDirectory=/home/trade/app
Environment=EXCHANGE_API_KEY=your_key_here
Environment=EXCHANGE_API_SECRET=your_secret_here
ExecStart=/home/trade/venv/bin/gunicorn -w 4 -b 127.0.0.1:5000 app:app
Restart=always
[Install]
WantedBy=multi-user.targetEjemplos de comandos administrativos:
sudo systemctl daemon-reload
sudo systemctl enable --now tradebot.service
sudo ufw allow 443/tcp
sudo ufw allow 80/tcp
Sección 5 — Consejos de seguridad y estabilidad
- Almacenamiento seguro de la clave API: Desde la variable de entorno, archivo con
chmod 600O utilice Secret Manager. - TLS: Utilice un certificado válido (certbot + nginx) para HTTPS.
- Confirmación del mensaje: Utilice HMAC-SHA256 para verificar los mensajes entrantes de TradingView.
- Limitaciones y reintentos: Implementar limitación de velocidad y algoritmos de reintento/retroceso.
- Monitoreo y registro: Utilice Prometheus + Grafana o ELK para monitorear la salud y los tiempos de respuesta.
- Protección contra ataques: Utilice Fail2Ban, iptables y servicios Anti-DDoS o CDN para puntos finales públicos.
Sección 6: Pruebas retrospectivas, optimización y pruebas futuras
- Prueba retrospectiva: De funciones
estrategia.*Utilice Pine para el análisis histórico, pero tenga en cuenta las limitaciones paramétricas de Pine. - Mejoramiento: Pruebe los parámetros manualmente o con scripts externos (por ejemplo, generando múltiples gráficos con diferentes parámetros).
- Prueba de avance: Pruebe siempre en una cuenta de demostración o con un volumen pequeño en un VPS de baja latencia después de realizar la prueba retrospectiva.
- Medición de deslizamiento y latencia: Registrar y analizar la hora de recepción del webhook y la hora de ejecución de la orden en el exchange.
Sección 7 — Comparación de ubicaciones de centros de datos para el comercio
La ubicación del centro de datos puede hacer que cada milisegundo cuente para el éxito de las estrategias de alta frecuencia. La selección de la ubicación debe basarse en los intercambios y las rutas BGP.
- Europa (Frankfurt, Ámsterdam): Adecuado para bolsas europeas y algunos fondos de liquidez.
- Este de EE. UU. (Nueva York, NJ): Adecuado para Coinbase y mercados relacionados en Nueva York.
- Asia (Singapur, Tokio, Hong Kong): Adecuado para Binance Asia, OKX y los mercados asiáticos.
Si opera principalmente en Binance o en bolsas asiáticas, un VPS en Singapur o Tokio es más adecuado; para bolsas de EE. UU., una ubicación en Nueva York o Nueva Jersey funcionará mejor.
Sección 8 — Configuraciones de servidor recomendadas para el comercio
VPS para comercio (baja latencia)
- CPU: 2-4 vCPU de alta frecuencia
- RAM: 4-8 GB
- Almacenamiento: SSD NVMe 50-100 GB
- Red: baja latencia/1 Gbps, BGP/Anycast si es necesario
Servidor de backtesting/computación pesada
- CPU: más de 8 vCPU
- RAM: 32+ GB
- Almacenamiento: NVMe 1TB
- GPU: Si se necesita ML/AI para procesar modelos
Además, utilice funciones de seguridad como Anti-DDoS, redes privadas y administración de firewall para aumentar la estabilidad y la seguridad del servicio.
Sección 9: Consejos prácticos para reducir el riesgo en la automatización del trading
- Stop Loss y Exposición Máxima: Establezca un stop loss y un monto máximo de exposición para cada orden.
- Estado de la cuenta API: Consulte restricciones y estado KYC.
- Cortacircuitos: Detenga el bot si los errores aumentan o la latencia aumenta significativamente.
- Vigilancia de la salud: Supervise el tiempo de actividad, la latencia y el estado de carga y configure alertas para el equipo de soporte.
Conclusión
Esta guía cubrió los pasos principales desde la escritura de indicadores y estrategias en Pine Script (versión 5), la creación de alarmas de webhook en TradingView, la configuración de un servidor webhook seguro con Flask/ccxt, hasta consideraciones de seguridad importantes, la elección de una ubicación de centro de datos y las configuraciones de servidor recomendadas.
Si necesita soluciones de infraestructura que incluyan VPS de baja latencia, servidores anti-DDoS o servicios de servidor gráfico para procesamiento pesado, nuestra empresa ofrece estas instalaciones con más de 85 ubicaciones globales y puede configurar y optimizar su infraestructura.









