¿Como detectar candelas maestras con TradingView?

0
233
Detector de candelas maestras en TradingView

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:

Ejemplo de una Master Candle o Vela Maestra

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

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 6
  • overlay=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 actual
  • offset = 1: vela anterior
  • offset = 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.5 y averageRange = 10 pips
  • La vela debe tener al menos 15 pips de 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 actual
    • prevLow >= 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 currentIsMaster es 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ínea
  • str.tostring(): convierte números a texto
  • format.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:

  1. Cada nueva barra → calcula si es vela maestra
  2. Si es vela maestra → guarda niveles, dibuja caja y líneas
  3. En barras siguientes → verifica si permanecen dentro o rompen
  4. Si hay breakout → dibuja señal y desactiva seguimiento
  5. 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


 

Raul Canessa

Leave a reply