Total Alumnos
0
Posiciones Activas
0
Rendimiento General
$0.00
Win Rate Promedio
0%
Ranking de Rentabilidad
| Rango | Email Estudiante | Balance Actual | PNL Neto Total | Rentabilidad (%) | Win Rate | Trades | Posiciones | Detalle |
|---|---|---|---|---|---|---|---|---|
| Cargando ranking de estudiantes... | ||||||||
Gestión de Alumnos del Concurso
| Email Estudiante | Fecha Registro | Última Actividad | Balance Inicial | Acciones |
|---|---|---|---|---|
| Cargando base de datos... | ||||
🔌 Integración con TradingView
💡 ¿Cómo funciona el Webhook del Concurso?
El servidor local recibe alertas en tiempo real de TradingView mediante peticiones HTTP POST al endpoint del Webhook.
Para que sea 100% automático, la plantilla utiliza la función alert() incorporada de Pine Script. Tus estudiantes solo deben pegar la URL del Webhook al crear la alerta y seleccionar "Cualquier llamada a la función alert()" (Any alert() function call). ¡No necesitan configurar ningún texto o JSON en el mensaje de la alerta!
1. Endpoint URL del Webhook
Configura este enlace como la dirección del Webhook en la alerta de TradingView:
2. Código Base en Pine Script (Estrategia Automática)
Tus estudiantes pueden agregar esta plantilla Pine Script v6 a sus estrategias. Detecta automáticamente las entradas, salidas, stop loss y take profit en tiempo real y despacha las estadísticas al servidor local sin intervención manual:
//@version=6
// URL del Webhook: https://lyndon-ciderlike-nondynamically.ngrok-free.dev/webhook?token=${settings.webhookToken}
strategy("Plantilla Concurso TradingView - Apex", overlay=true, margin_long=100, margin_short=100)
// CONFIGURACIÓN DEL ESTUDIANTE
student_email = input.string("estudiante@correo.com", title="Tu Email Registrado")
quantity_multiplier = input.float(1.0, title="Multiplicador de Contratos")
// Parámetros de Stop Loss y Take Profit en PIPS (o ticks para futuros, 0 para desactivar)
sl_pips = input.int(100, title="Stop Loss (Pips/Ticks)")
tp_pips = input.int(200, title="Take Profit (Pips/Ticks)")
// ==========================================
// 💡 TUS CONDICIONES DE ENTRADA Y SALIDA
// ==========================================
// Reemplaza "false" por tus propios indicadores o condiciones de trading.
// Por ejemplo:
// buy_condition = ta.crossover(ta.sma(close, 9), ta.sma(close, 21))
// sell_condition = ta.crossunder(ta.sma(close, 9), ta.sma(close, 21))
buy_condition = false
sell_condition = false
// Ejecutar las órdenes en la estrategia
if buy_condition
strategy.entry("Long", strategy.long, qty=quantity_multiplier)
if sell_condition
strategy.entry("Short", strategy.short, qty=quantity_multiplier)
// Configurar SL y TP en la estrategia
long_sl = sl_pips > 0 ? strategy.position_avg_price - (sl_pips * syminfo.mintick) : na
long_tp = tp_pips > 0 ? strategy.position_avg_price + (tp_pips * syminfo.mintick) : na
short_sl = sl_pips > 0 ? strategy.position_avg_price + (sl_pips * syminfo.mintick) : na
short_tp = tp_pips > 0 ? strategy.position_avg_price - (tp_pips * syminfo.mintick) : na
if strategy.position_size > 0
strategy.exit("Exit Long", "Long", stop=long_sl, limit=long_tp)
if strategy.position_size < 0
strategy.exit("Exit Short", "Short", stop=short_sl, limit=short_tp)
// ==========================================
// ⚙️ ENVÍO AUTOMÁTICO DE WEBHOOKS
// ==========================================
// Esta sección detecta cambios de posición en la estrategia y despacha
// las alertas en formato JSON al webhook sin que el estudiante deba escribir nada.
prev_pos = strategy.position_size[1]
curr_pos = strategy.position_size
if curr_pos != prev_pos
string json_msg = ""
if curr_pos > 0 and prev_pos <= 0 // Entrada a Compra (Long)
json_msg := '{"email": "' + student_email + '", "symbol": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + ', "quantity": ' + str.tostring(math.abs(curr_pos)) + ', "sl": ' + str.tostring(long_sl) + ', "tp": ' + str.tostring(long_tp) + '}'
else if curr_pos < 0 and prev_pos >= 0 // Entrada a Venta Corta (Short)
json_msg := '{"email": "' + student_email + '", "symbol": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + ', "quantity": ' + str.tostring(math.abs(curr_pos)) + ', "sl": ' + str.tostring(short_sl) + ', "tp": ' + str.tostring(short_tp) + '}'
else if curr_pos == 0 // Cierre total de posición (Flat)
json_msg := '{"email": "' + student_email + '", "symbol": "' + syminfo.ticker + '", "action": "flat", "price": ' + str.tostring(close) + '}'
else if (curr_pos > 0 and prev_pos > 0) or (curr_pos < 0 and prev_pos < 0) // Aumento o reducción parcial
string act = curr_pos > prev_pos ? "buy" : "sell"
float sl_val = curr_pos > 0 ? long_sl : short_sl
float tp_val = curr_pos > 0 ? long_tp : short_tp
json_msg := '{"email": "' + student_email + '", "symbol": "' + syminfo.ticker + '", "action": "' + act + '", "price": ' + str.tostring(close) + ', "quantity": ' + str.tostring(math.abs(curr_pos - prev_pos)) + ', "sl": ' + str.tostring(sl_val) + ', "tp": ' + str.tostring(tp_val) + '}'
if json_msg != ""
alert(json_msg, alert.freq_all)
⚙️ Configuración Global del Concurso
Capital virtual con el que los estudiantes iniciarán y con el que se calculará el porcentaje de rentabilidad.
Filtro de seguridad en la URL del Webhook para evitar ejecuciones externas fraudulentas.
🔑 Contraseña del Administrador
Cambia la clave por defecto "admin123" para proteger la administración del concurso de trading.
⚠️ Zona Peligrosa
Wipe total del concurso. Esto restablecerá los balances y vaciará el historial de absolutamente todos los estudiantes registrados de forma irreversible.