En este artículo vamos a explicar de forma sencilla como detectar candelas maestras en el gráfico de precios en la plataforma TradingView mediante su lenguaje de programación PineScript 6 usando un código simple. Este código lo explicamos paso a paso para facilitar su comprensión, incluso para los principiantes. Antes de empezar vamos a explicar en qué consisten las candelas maestras.
¿Que son las candelas maestras?
La Candela Maestra se identifica en un gráfico de candelas cuando una sola vela, conocida como la candela maestra, engloba los máximos y mínimos de las siguientes cuatro o más candelas. Los traders interpretan esto como una señal de consolidación del mercado. Cuando ocurre un breakout por encima o por debajo del rango de la candela maestra, suele considerarse una señal para una operación potencial. El patrón consta de las siguientes características:
- La candela maestra suele ser más grande que la vela promedio en el gráfico.
- Debe estar seguida inmediatamente por al menos cuatro velas que no superen su máximo ni su mínimo.
- Los breakouts del rango de la vela maestra pueden ocurrir en cualquier dirección (alcista o bajista).
La siguiente imagen muestra cómo se ven estos patrones en teoría:

Pueden encontrar más información sobre esta formación en: ¿Que son las candelas maestras?
Código del detector de candelas maestras en Pinescript 6
Primero vamos a mostrar el código completo y luego vamos a explicar cada parte:
//@version=6
indicator("Detector de Velas Maestras - Envolvente", overlay=true)
// Parámetros configurables
rangeMultiplier = input.float(1.5, "Multiplicador de Rango (vs promedio)", minval=1.0, step=0.1)
avgPeriod = input.int(20, "Período para Promedio de Rango", minval=5, maxval=100)
lookbackCandles = input.int(3, "Velas Anteriores a Englobar", minval=1, maxval=10)
showLabels = input.bool(true, "Mostrar Etiquetas")
showLines = input.bool(true, "Mostrar Líneas de Soporte/Resistencia")
// Calcular el rango de cada vela
candleRange(offset) =>
high[offset] - low[offset]
// Calcular el promedio del rango
averageRange = ta.sma(candleRange(0), avgPeriod)
// Función para verificar si una vela es maestra (envolvente)
isMasterCandle() =>
// La vela actual debe tener un rango significativamente mayor al promedio
currentRange = candleRange(0)
isLargeCandle = currentRange >= rangeMultiplier * averageRange
// Verificar que engloba las velas anteriores
engulfedCount = 0
allEngulfed = true
if isLargeCandle
currentHigh = high
currentLow = low
// Revisar las velas anteriores
for i = 1 to lookbackCandles
prevHigh = high[i]
prevLow = low[i]
// La vela actual debe contener completamente la vela anterior
if prevHigh <= currentHigh and prevLow >= currentLow
engulfedCount += 1
else
allEngulfed := false
break
isLargeCandle and allEngulfed and engulfedCount >= lookbackCandles
// Detectar vela maestra actual
currentIsMaster = isMasterCandle()
// Guardar datos de vela maestra para seguimiento
var float masterHigh = na
var float masterLow = na
var int masterBarIndex = na
var bool activeMaster = false
var int barsInsideMaster = 0
// Guardar datos de vela maestra cuando se detecta
if currentIsMaster
masterHigh := high
masterLow := low
masterBarIndex := bar_index
activeMaster := true
barsInsideMaster := 0
// Monitorear si las velas siguientes permanecen dentro del rango
if activeMaster and not currentIsMaster
if high <= masterHigh and low >= masterLow
barsInsideMaster += 1
else
// Si sale del rango, verificar breakout
if close > masterHigh or close < masterLow activeMaster := false // Detectar breakout bullishBreakout = activeMaster and close > masterHigh and close[1] <= masterHigh
bearishBreakout = activeMaster and close < masterLow and close[1] >= masterLow
// Desactivar vela maestra después del breakout
if bullishBreakout or bearishBreakout
activeMaster := false
// Visualización
// Colorear la vela maestra
barcolor(currentIsMaster ? color.new(color.orange, 0) : na, title="Vela Maestra")
// Dibujar líneas de la vela maestra activa
var line upperLine = na
var line lowerLine = na
var box masterBox = na
if currentIsMaster
// Eliminar líneas y cajas anteriores
if not na(upperLine)
line.delete(upperLine)
if not na(lowerLine)
line.delete(lowerLine)
if not na(masterBox)
box.delete(masterBox)
if showLines
// Crear nuevas líneas
upperLine := line.new(bar_index, masterHigh, bar_index + 10, masterHigh,
color=color.new(color.blue, 0), width=2, style=line.style_dashed)
lowerLine := line.new(bar_index, masterLow, bar_index + 10, masterLow,
color=color.new(color.blue, 0), width=2, style=line.style_dashed)
// Crear caja semi-transparente para visualizar el rango
masterBox := box.new(bar_index - lookbackCandles, masterHigh, bar_index, masterLow,
border_color=color.new(color.orange, 0),
bgcolor=color.new(color.orange, 90),
border_width=2)
// Extender líneas mientras la vela maestra esté activa
if activeMaster and not na(upperLine) and showLines
line.set_x2(upperLine, bar_index + 1)
line.set_x2(lowerLine, bar_index + 1)
// Marcar vela maestra con triángulo
plotshape(currentIsMaster,
title="Vela Maestra Detectada",
location=location.abovebar,
style=shape.triangledown,
size=size.small,
color=color.new(color.orange, 0))
// Señales de breakout
plotshape(bullishBreakout,
title="Breakout Alcista",
location=location.belowbar,
style=shape.triangleup,
size=size.normal,
color=color.new(color.green, 0))
plotshape(bearishBreakout,
title="Breakout Bajista",
location=location.abovebar,
style=shape.triangledown,
size=size.normal,
color=color.new(color.red, 0))
// Etiquetas informativas
if showLabels and currentIsMaster
labelText = " VELA MAESTRA\n" +
"Rango: " + str.tostring(candleRange(0), format.mintick) + "\n" +
"Promedio: " + str.tostring(averageRange, format.mintick) + "\n" +
"Engloba: " + str.tostring(lookbackCandles) + " velas"
label.new(bar_index, high,
text=labelText,
color=color.new(color.orange, 10),
textcolor=color.white,
style=label.style_label_down,
size=size.normal)
if showLabels and bullishBreakout
label.new(bar_index, low,
text=" BREAKOUT ALCISTA\nVelas dentro: " + str.tostring(barsInsideMaster),
color=color.new(color.green, 10),
textcolor=color.white,
style=label.style_label_up,
size=size.normal)
if showLabels and bearishBreakout
label.new(bar_index, high,
text=" BREAKOUT BAJISTA\nVelas dentro: " + str.tostring(barsInsideMaster),
color=color.new(color.red, 10),
textcolor=color.white,
style=label.style_label_down,
size=size.normal)
// Alerta
alertcondition(currentIsMaster, title="Vela Maestra Detectada", message="¡Vela Maestra formada!")
alertcondition(bullishBreakout, title="Breakout Alcista", message="¡Breakout alcista de Vela Maestra!")
alertcondition(bearishBreakout, title="Breakout Bajista", message="¡Breakout bajista de Vela Maestra!")
Cuando ejecutamos este código nos muestra las candelas maestras actuales y pasadas junto con sus datos más importantes como muestra la siguiente imagen:

Detector de candelas maestras en TradingView
Ahora vamos a explicar este código en detalle:
¿Como funciona el código del detector de candelas maestras?
El código que mostramos anteriormente no es tan complejo como veremos al mostrar que hacen sus distintas partes:
Configuración inicial
//@version=6
indicator("Detector de Velas Maestras - Envolvente", overlay=true)
@version=6: Especifica que usamos Pine Script versión 6overlay=true: El indicador se dibuja sobre el gráfico de precios (no en panel separado)
Parámetros configurables (inputs)
rangeMultiplier = input.float(1.5, "Multiplicador de Rango (vs promedio)", minval=1.0, step=0.1) avgPeriod = input.int(20, "Período para Promedio de Rango", minval=5, maxval=100) lookbackCandles = input.int(3, "Velas Anteriores a Englobar", minval=1, maxval=10) showLabels = input.bool(true, "Mostrar Etiquetas") showLines = input.bool(true, "Mostrar Líneas de Soporte/Resistencia")
Estos inputs permiten al usuario ajustar el indicador sin modificar el código:
- rangeMultiplier: Cuánto más grande debe ser la vela vs el promedio (1.5 = 150%)
- avgPeriod: Ventana de 20 velas para calcular el rango promedio
- lookbackCandles: Cuántas velas anteriores debe englobar (por defecto 3)
- showLabels/showLines: Opciones de visualización
Funciones auxiliares
candleRange(offset) =>
high[offset] - low[offset]
Calcula el rango (distancia entre máximo y mínimo) de una vela:
offset = 0: vela actualoffset = 1: vela anterioroffset = 2: hace 2 velas, etc.
averageRange = ta.sma(candleRange(0), avgPeriod)
Calcula el promedio móvil simple (SMA) del rango de las últimas 20 velas.
Función principal: isMasterCandle()
isMasterCandle() =>
currentRange = candleRange(0)
isLargeCandle = currentRange >= rangeMultiplier * averageRange
Paso 1: Verifica si la vela actual es “grande”
- Si
rangeMultiplier = 1.5yaverageRange = 10 pips - La vela debe tener al menos
15 pipsde rango
if isLargeCandle
currentHigh = high
currentLow = low
for i = 1 to lookbackCandles
prevHigh = high[i]
prevLow = low[i]
if prevHigh <= currentHigh and prevLow >= currentLow
engulfedCount += 1
else
allEngulfed := false
break
Paso 2: Si es grande, verifica que englobe las velas anteriores
- Recorre las últimas 3 velas (
i = 1, 2, 3) - Para cada vela anterior, verifica:
prevHigh <= currentHigh: el máximo anterior está por debajo del actualprevLow >= currentLow: el mínimo anterior está por encima del actual
- Si todas las velas están contenidas → vela maestra encontrada
isLargeCandle and allEngulfed and engulfedCount >= lookbackCandles
Retorna true solo si cumple ambas condiciones.
Variables de estado (tracking)
var float masterHigh = na var float masterLow = na var int masterBarIndex = na var bool activeMaster = false var int barsInsideMaster = 0
La palabra clave var hace que estas variables mantengan su valor entre barras:
- masterHigh/Low: Guardan los niveles de la última vela maestra
- masterBarIndex: Índice de la barra donde se formó
- activeMaster: Indica si hay una vela maestra activa (esperando breakout)
- barsInsideMaster: Cuenta cuántas velas se quedaron dentro del rango
Lógica de detección y seguimiento
if currentIsMaster
masterHigh := high
masterLow := low
masterBarIndex := bar_index
activeMaster := true
barsInsideMaster := 0
Cuando detecta una vela maestra, guarda sus datos y activa el seguimiento.
if activeMaster and not currentIsMaster
if high <= masterHigh and low >= masterLow
barsInsideMaster += 1
else
if close > masterHigh or close < masterLow
activeMaster := false
En las velas siguientes:
- Si permanecen dentro del rango → incrementa contador
- Si salen del rango → desactiva el seguimiento
bullishBreakout = activeMaster and close > masterHigh and close[1] <= masterHigh bearishBreakout = activeMaster and close < masterLow and close[1] >= masterLow
Detecta breakouts:
- Alcista: Cierre actual por encima del máximo Y cierre anterior por debajo
- Bajista: Cierre actual por debajo del mínimo Y cierre anterior por encima
Visualización – Colores y formas
barcolor(currentIsMaster ? color.new(color.orange, 0) : na, title="Vela Maestra")
Colorea la vela maestra en naranja. El operador ternario ? : significa:
- Si
currentIsMasteres true → color naranja - Si no →
na(sin color)
plotshape(currentIsMaster,
title="Vela Maestra Detectada",
location=location.abovebar,
style=shape.triangledown,
size=size.small,
color=color.new(color.orange, 0))
Dibuja un triángulo naranja hacia abajo encima de la vela maestra.
Líneas y cajas
var line upperLine = na var line lowerLine = na var box masterBox = na
Variables persistentes para almacenar objetos gráficos.
if currentIsMaster
if not na(upperLine)
line.delete(upperLine)
if not na(lowerLine)
line.delete(lowerLine)
if not na(masterBox)
box.delete(masterBox)
Elimina las líneas/cajas anteriores antes de crear nuevas (evita acumulación).
upperLine := line.new(bar_index, masterHigh, bar_index + 10, masterHigh,
color=color.new(color.blue, 0), width=2, style=line.style_dashed)
Crea una línea horizontal punteada azul desde la vela maestra hacia 10 barras adelante.
masterBox := box.new(bar_index - lookbackCandles, masterHigh, bar_index, masterLow,
border_color=color.new(color.orange, 0),
bgcolor=color.new(color.orange, 90),
border_width=2)
Crea una caja semi-transparente que muestra visualmente las velas englobadas:
- Desde 3 velas atrás hasta la vela actual
- Color naranja con 90% de transparencia
if activeMaster and not na(upperLine) and showLines
line.set_x2(upperLine, bar_index + 1)
line.set_x2(lowerLine, bar_index + 1)
Extiende las líneas en cada nueva barra mientras la vela maestra esté activa.
Etiquetas informativas
if showLabels and currentIsMaster
labelText = " VELA MAESTRA\n" +
"Rango: " + str.tostring(candleRange(0), format.mintick) + "\n" +
"Promedio: " + str.tostring(averageRange, format.mintick) + "\n" +
"Engloba: " + str.tostring(lookbackCandles) + " velas"
Construye el texto con información detallada:
\n: salto de líneastr.tostring(): convierte números a textoformat.mintick: formatea según el tick mínimo del instrumento
label.new(bar_index, high,
text=labelText,
color=color.new(color.orange, 10),
textcolor=color.white,
style=label.style_label_down,
size=size.normal)
Crea una etiqueta posicionada en el máximo de la vela, apuntando hacia abajo.
Alertas
alertcondition(currentIsMaster, title="Vela Maestra Detectada", message="¡Vela Maestra formada!")
Permite configurar alertas en TradingView que se disparan cuando:
- Se forma una vela maestra
- Ocurre un breakout alcista
- Ocurre un breakout bajista
Flujo completo del indicador:
- Cada nueva barra → calcula si es vela maestra
- Si es vela maestra → guarda niveles, dibuja caja y líneas
- En barras siguientes → verifica si permanecen dentro o rompen
- Si hay breakout → dibuja señal y desactiva seguimiento
- Las líneas se extienden hasta que ocurra el breakout
Conclusión
Como vemos en este artículo este código permite detectar candelas maestras en cualquier gráfico de precios. Además de detectarlos, los muestra en los gráficos de precios e indica las principales características de cada patrón, incluyendo el rango de la candela maestra y el número de candelas envueltas por esta. Se trata de un código bastante simple y fácil de entender para las personas que tengan cierto conocimiento sobre Pinescript de TradingView.
Este código puede usarse como parte de un sistema de trading más completo que se base en patrones como la candela maestra. Por ejemplo, puede combinarse con cruces de medias móviles de tal modo que solo se muestren las candelas maestras en donde se produce una ruptura a favor de un cruce de una SMA 20 sobre/debajo de una SMA 50.
¿Tienen interés en desarrollar un indicador o sistema automatizado de trading en TradingView? Pueden comunicarse con nosotros a admin@tecnicasdetrading.com
¿Que broker recomendamos para usar la plataforma Tradingview? IC Markests es un broker ECN regulado con años de experiencia en el mercado. Más información en: Análisis del broker IC Markets














