📘 MANUAL DE USO – Indicador “EMAs personalizables + VWAP + Cruces (Modular)”

📘 MANUAL DE USO – Indicador “EMAs personalizables + VWAP + Cruces (Modular)”

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í: