1. Introducción
El indicador EMAs personalizables + VWAP + Cruces (Modular) es una herramienta diseñada para ofrecer una lectura clara, flexible y profesional de la estructura del mercado mediante:
- Dos medias móviles exponenciales (EMA corta y EMA larga).
- La línea VWAP institucional.
- Señales visuales de cruces entre EMAs.
- Un panel institucional que resume tendencia, fuerza, distancia, relación con VWAP y sesgo general.
Este indicador es ideal para traders que buscan simplicidad, modularidad y una lectura ejecutiva del mercado.
2. Objetivo del Indicador
El objetivo es proporcionar:
- Una lectura clara de la tendencia mediante EMAs.
- Confirmación institucional mediante VWAP.
- Señales de cruce para entradas o cambios de sesgo.
- Un panel que sintetiza la información en un vistazo.
- Configuración modular para activar solo lo que necesitas.
3. Componentes del Indicador
El indicador está compuesto por cuatro módulos principales:
3.1. EMAs (Exponential Moving Averages)
- EMA corta (por defecto 9).
- EMA larga (por defecto 21).
- Ambas totalmente configurables en:
- Periodo
- Color
- Grosor
- Estilo de línea
3.2. VWAP (Volume Weighted Average Price)
- Línea institucional que muestra el precio promedio ponderado por volumen.
- Útil para identificar zonas de valor y desequilibrio.
3.3. Señales de Cruce
- Flecha verde (▲) cuando la EMA corta cruza por encima de la EMA larga.
- Flecha roja (▼) cuando la EMA corta cruza por debajo.
- Activables/desactivables desde el panel.
3.4. Panel Institucional
Incluye:
- Tendencia actual
- Fuerza porcentual
- Distancia entre EMAs
- Intensidad (nube)
- Estado respecto a VWAP
- Termómetro visual
- Sesgo general
Todo con colores dinámicos y fondo adaptativo.
4. Inputs del Indicador
4.1. Visibilidad
Puedes activar o desactivar cada módulo:
- Mostrar EMA corta
- Mostrar EMA larga
- Mostrar VWAP
- Mostrar señales de cruce
Esto permite usar el indicador como:
- Sistema completo
- Solo EMAs
- Solo VWAP
- Solo señales
- O cualquier combinación
4.2. Periodos
Define los periodos de cálculo:
- EMA corta (default 9)
- EMA larga (default 21)
Puedes adaptarlos a tu estilo:
- Scalping → 5/13
- Intradía → 9/21
- Swing → 20/50
4.3. Colores
Cada línea tiene su propio color configurable:
- EMA corta
- EMA larga
- VWAP
4.4. Grosor
Controla el grosor de cada línea (1–5).
4.5. Estilo de Línea
Puedes elegir entre:
- Line
- Histogram
- Area
- Columns
- Circles
- Stepline
Esto permite adaptar el indicador a tu estilo visual.
5. Señales de Cruce
El indicador detecta automáticamente:
Cruce Alcista
- EMA corta cruza por encima de EMA larga
- Señal: ▲ verde
- Ubicación: debajo de la vela
Cruce Bajista
- EMA corta cruza por debajo de EMA larga
- Señal: ▼ roja
- Ubicación: arriba de la vela
Estas señales pueden usarse como:
- Confirmación de entrada
- Cambio de sesgo
- Filtro de tendencia
6. Panel Institucional
El panel aparece en la esquina inferior izquierda y muestra:
6.1. Tendencia
Determina si:
- EMA corta > EMA larga → Alcista
- EMA corta < EMA larga → Bajista
- Igual → Neutral
Color dinámico:
- Verde → Alcista
- Rojo → Bajista
- Amarillo → Neutral
6.2. Fuerza (%)
Mide qué tan separadas están las EMAs respecto al máximo histórico reciente.
Interpretación:
- 0–40% → Débil
- 40–70% → Tendencia moderada
- 70–100% → Tendencia fuerte
6.3. Distancia entre EMAs
Valor numérico de separación entre ambas EMAs.
Útil para:
- Identificar compresión
- Detectar expansión
- Medir momentum
6.4. Intensidad (Nube)
Valor entre 10 y 90 que representa la fuerza relativa.
6.5. Estado respecto a VWAP
- ▲ Sobre VWAP → Sesgo alcista institucional
- ▼ Bajo VWAP → Sesgo bajista institucional
- ⚪ En VWAP → Zona de equilibrio
6.6. Termómetro Visual
Barra de 10 bloques:
- Más bloques llenos → mayor fuerza
- Color dinámico según tendencia
6.7. Sesgo General
Combinación de:
- Tendencia
- Fuerza
- Relación con VWAP
Puede ser:
- 🟢 Fuerte Alcista
- 🔴 Fuerte Bajista
- 🟡 Tendencia Débil
- 🟡 Neutral
7. Cómo Usarlo en tu Trading
7.1. Confirmación de Tendencia
- EMA corta > EMA larga
- Precio sobre VWAP
- Fuerza > 60%
→ Sesgo alcista confiable.
7.2. Entradas por Cruce
- Cruce alcista → buscar compras
- Cruce bajista → buscar ventas
7.3. Filtros Institucionales
- No operar contra VWAP
- Evitar señales con fuerza < 40%
- Confirmar con el termómetro
7.4. Gestión de Riesgo
- Entrar en retrocesos hacia EMA corta
- Salir cuando fuerza cae por debajo de 30%
- Evitar operar cuando el panel marca “Neutral”
8. Recomendaciones Finales
- Mantén el indicador limpio: activa solo lo que necesitas.
- Usa VWAP como filtro institucional.
- No operes cruces débiles.
- Observa la fuerza y el termómetro antes de entrar.
- El panel es tu brújula: úsalo para confirmar contexto.
9. Conclusión
Este indicador combina simplicidad, modularidad y lectura institucional en un solo paquete.
Es ideal para traders que buscan claridad, confirmación y una visión ejecutiva del mercado.
10. Script en Pine
//@version=5
indicator("EMAs personalizables + VWAP + Cruces (Modular)", overlay=true)
// === INPUTS DE VISIBILIDAD ===
showEmaShort = input.bool(true, "Mostrar EMA corta")
showEmaLong = input.bool(true, "Mostrar EMA larga")
showVWAP = input.bool(true, "Mostrar VWAP")
showSignals = input.bool(true, "Mostrar cruces")
// === INPUTS DE PERIODOS ===
emaShortLen = input.int(9, "Periodo EMA corta", minval=1)
emaLongLen = input.int(21, "Periodo EMA larga", minval=1)
// === INPUTS DE COLORES ===
emaShortColor = input.color(color.blue, "Color EMA corta")
emaLongColor = input.color(color.orange, "Color EMA larga")
vwapColor = input.color(color.purple, "Color VWAP")
// === INPUTS DE GROSOR ===
emaShortWidth = input.int(2, "Grosor EMA corta", minval=1, maxval=5)
emaLongWidth = input.int(2, "Grosor EMA larga", minval=1, maxval=5)
vwapWidth = input.int(1, "Grosor VWAP", minval=1, maxval=5)
// === INPUTS DE ESTILO ===
emaShortStyleOpt = input.string("line", "Estilo EMA corta", options=["line","histogram","area","columns","circles","stepline"])
emaLongStyleOpt = input.string("line", "Estilo EMA larga", options=["line","histogram","area","columns","circles","stepline"])
vwapStyleOpt = input.string("line", "Estilo VWAP", options=["line","histogram","area","columns","circles","stepline"])
// === CONVERSIÓN DE ESTILO ===
emaShortStyle = emaShortStyleOpt == "histogram" ? plot.style_histogram :
emaShortStyleOpt == "area" ? plot.style_area :
emaShortStyleOpt == "columns" ? plot.style_columns :
emaShortStyleOpt == "circles" ? plot.style_circles :
emaShortStyleOpt == "stepline" ? plot.style_stepline : plot.style_line
emaLongStyle = emaLongStyleOpt == "histogram" ? plot.style_histogram :
emaLongStyleOpt == "area" ? plot.style_area :
emaLongStyleOpt == "columns" ? plot.style_columns :
emaLongStyleOpt == "circles" ? plot.style_circles :
emaLongStyleOpt == "stepline" ? plot.style_stepline : plot.style_line
vwapStyle = vwapStyleOpt == "histogram" ? plot.style_histogram :
vwapStyleOpt == "area" ? plot.style_area :
vwapStyleOpt == "columns" ? plot.style_columns :
vwapStyleOpt == "circles" ? plot.style_circles :
vwapStyleOpt == "stepline" ? plot.style_stepline : plot.style_line
// === EMAs ===
emaShort = ta.ema(close, emaShortLen)
emaLong = ta.ema(close, emaLongLen)
// === VWAP ===
vwapLine = ta.vwap(close)
// === PLOTS ===
plot(showEmaShort ? emaShort : na, title="EMA corta", color=emaShortColor, linewidth=emaShortWidth, style=emaShortStyle)
plot(showEmaLong ? emaLong : na, title="EMA larga", color=emaLongColor, linewidth=emaLongWidth, style=emaLongStyle)
plot(showVWAP ? vwapLine : na, title="VWAP", color=vwapColor, linewidth=vwapWidth, style=vwapStyle)
// === CRUCES ===
cruceAlcista = ta.crossover(emaShort, emaLong)
cruceBajista = ta.crossunder(emaShort, emaLong)
plotshape(showSignals and cruceAlcista, title="Cruce Alcista", style=shape.triangleup, location=location.belowbar, color=color.new(color.lime, 0), size=size.small, text="▲ Alcista")
plotshape(showSignals and cruceBajista, title="Cruce Bajista", style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text="▼ Bajista")
// === ALERTAS ===
alertcondition(cruceAlcista, title="Alerta Cruce Alcista", message="EMA corta cruzó arriba de EMA larga")
alertcondition(cruceBajista, title="Alerta Cruce Bajista", message="EMA corta cruzó abajo de EMA larga")
// =========================
// PANEL INSTITUCIONAL (ESQUINA SUPERIOR IZQUIERDA)
// =========================
var table infoPanel = table.new(position.bottom_left, 2, 7, border_width=1, frame_color=color.new(color.white, 80))
// Cálculos base
diff = math.abs(emaShort - emaLong)
maxDiff = ta.highest(diff, 200)
intensity = maxDiff == 0.0 ? 0.0 : diff / maxDiff
opacity = 90 - (intensity * 70)
opacity := math.min(math.max(opacity, 10.0), 90.0)
tendencia = emaShort > emaLong ? "▲ Alcista" : emaShort < emaLong ? "▼ Bajista" : "⚪ Neutral"
fuerzaPct = math.round(intensity * 100)
distancia = diff
vwapEstado = close > vwapLine ? "▲ Sobre VWAP" : close < vwapLine ? "▼ Bajo VWAP" : "⚪ En VWAP"
// Termómetro visual (0–100% → 10 bloques)
blocks = math.round(fuerzaPct / 10)
barra = ""
for i = 1 to 10
barra += i <= blocks ? "▓" : "░"
// Colores dinámicos
tendColor = emaShort > emaLong ? color.new(color.lime, 0) : emaShort < emaLong ? color.new(color.red, 0) : color.new(color.yellow, 0)
fuerzaColor = fuerzaPct > 70 ? color.new(color.lime, 0) : fuerzaPct > 40 ? color.new(color.yellow, 0) : color.new(color.red, 0)
vwapTextColor = close > vwapLine ? color.new(color.lime, 0) : close < vwapLine ? color.new(color.red, 0) : color.new(color.yellow, 0)
termColor = tendColor
// Sesgo general
sesgo = "🟡 Neutral"
sesgoColor = color.new(color.yellow, 0)
if fuerzaPct > 70 and emaShort > emaLong and close > vwapLine
sesgo := "🟢 Fuerte Alcista"
sesgoColor := color.new(color.lime, 0)
else if fuerzaPct > 70 and emaShort < emaLong and close < vwapLine
sesgo := "🔴 Fuerte Bajista"
sesgoColor := color.new(color.red, 0)
else if fuerzaPct > 40
sesgo := "🟡 Tendencia Débil"
sesgoColor := color.new(color.yellow, 0)
// Fondo institucional y adaptativo (más transparente para no tapar líneas)
bgPanel = color.new(color.black, 85)
bgDynamic = bgPanel
if sesgo == "🟢 Fuerte Alcista"
bgDynamic := color.new(color.lime, 90)
else if sesgo == "🔴 Fuerte Bajista"
bgDynamic := color.new(color.red, 90)
else if sesgo == "🟡 Tendencia Débil"
bgDynamic := color.new(color.yellow, 90)
// Encabezados
table.cell(infoPanel, 0, 0, "Tendencia", text_color=color.white, bgcolor=bgDynamic)
table.cell(infoPanel, 0, 1, "Fuerza (%)", text_color=color.white, bgcolor=bgDynamic)
table.cell(infoPanel, 0, 2, "Distancia EMAs", text_color=color.white, bgcolor=bgDynamic)
table.cell(infoPanel, 0, 3, "Intensidad nube", text_color=color.white, bgcolor=bgDynamic)
table.cell(infoPanel, 0, 4, "VWAP", text_color=color.white, bgcolor=bgDynamic)
table.cell(infoPanel, 0, 5, "Termómetro", text_color=color.white, bgcolor=bgDynamic)
table.cell(infoPanel, 0, 6, "Sesgo General", text_color=color.white, bgcolor=bgDynamic)
// Valores
table.cell(infoPanel, 1, 0, tendencia, text_color=tendColor, bgcolor=color.new(color.black, 0))
table.cell(infoPanel, 1, 1, str.tostring(fuerzaPct) + "%", text_color=fuerzaColor, bgcolor=color.new(color.black, 0))
table.cell(infoPanel, 1, 2, str.tostring(distancia, format.mintick), text_color=color.white, bgcolor=color.new(color.black, 0))
table.cell(infoPanel, 1, 3, str.tostring(opacity), text_color=color.white, bgcolor=color.new(color.black, 0))
table.cell(infoPanel, 1, 4, vwapEstado, text_color=vwapTextColor, bgcolor=color.new(color.black, 0))
table.cell(infoPanel, 1, 5, barra, text_color=termColor, bgcolor=color.new(color.black, 0))
table.cell(infoPanel, 1, 6, sesgo, text_color=sesgoColor, bgcolor=color.new(color.black, 0))
11. Y se ve así:
