1. Introducción
El Panel de Sesiones es un indicador institucional diseñado para mostrar, de forma clara y compacta:
- Los valores OHLC (Apertura, Máximo, Mínimo, Cierre) de cada sesión.
- El rango (High – Low).
- La dirección (Alcista, Bajista o Neutro).
- Un resumen automático que identifica la sesión más volátil y su dirección.
- La opción de trabajar con un timeframe fijo (M3, M5, M15…) para mantener los valores estables sin importar el timeframe del gráfico.
Este panel está optimizado para análisis institucional, backtesting visual y toma de decisiones rápidas.
2. Objetivo del Indicador
El objetivo es ofrecer una vista ejecutiva de las tres sesiones principales:
- Asia
- Londres
- Nueva York
Mostrando:
- Cómo se comportó cada sesión.
- Qué tan amplia fue su volatilidad.
- En qué dirección cerró.
- Cuál fue la sesión dominante del día.
3. Configuración Inicial
El indicador incluye varios parámetros configurables desde el panel de Inputs.
3.1. Mostrar/Ocultar Panel
Permite activar o desactivar el panel completo.
3.2. Selección de Sesiones
Puedes activar o desactivar individualmente:
- Asia
- Londres
- Nueva York
3.3. Timeframe Fijo
Este es uno de los elementos clave del indicador.
- fixedTF: selecciona el timeframe base (ej. M3, M5, M15).
- useFixedTF:
- ON → El panel y el resumen se calculan exclusivamente desde el timeframe fijo.
- OFF → El panel se adapta dinámicamente al timeframe del gráfico.
Ventaja:
Cuando useFixedTF = true, cambiar el timeframe del gráfico no altera los valores del panel.
4. Columnas del Panel
El panel muestra hasta 7 columnas:
- Sesión
- Apertura (Open)
- Máximo (High)
- Mínimo (Low)
- Cierre (Close)
- Rango (High – Low)
- Dirección (Alcista / Bajista / Neutro)
Cada columna puede activarse o desactivarse según tus necesidades.
5. Cálculo de OHLC por Sesión
El indicador calcula los valores OHLC de cada sesión usando:
- El timeframe fijo (si está activado).
- O el timeframe del gráfico (si está desactivado).
El cálculo es robusto y funciona correctamente en cualquier timeframe, incluso si la sesión no coincide con el cierre exacto de una vela.
6. Cierre de Sesión y Valores Finales
El indicador detecta automáticamente el cierre real de cada sesión, sin depender del timeframe del gráfico.
Cuando una sesión termina:
- Se guardan sus valores finales.
- Estos valores permanecen estables durante el resto del día.
- El panel siempre muestra los datos de la última sesión completada.
7. Rango y Dirección
7.1. Rango
Es la diferencia entre el máximo y el mínimo de la sesión:
Rango = High – Low
7.2. Dirección
Se determina comparando el cierre con la apertura:
- Alcista → Cierre > Apertura
- Bajista → Cierre < Apertura
- Neutro → Cierre = Apertura
8. Resumen Institucional
En la última fila del panel aparece un resumen:
“Sesión más volátil: Londres – Bajista”
Este resumen identifica:
- La sesión con mayor rango.
- Su dirección.
- Su color (verde, rojo o gris).
Modo Fijo
Cuando useFixedTF = true:
- El resumen se calcula una sola vez.
- Permanece estable aunque cambies de timeframe.
Modo Dinámico
Cuando useFixedTF = false:
- El resumen se recalcula en cada timeframe.
- Útil para análisis intradía.
9. Interpretación del Panel
9.1. Lectura rápida
El panel permite identificar en segundos:
- Qué sesión tuvo mayor volatilidad.
- Qué sesión dominó el día.
- Si el mercado estuvo tendencial o lateral.
- Si hubo continuidad o reversión entre sesiones.
9.2. Ejemplos
Ejemplo 1 – Día tendencial alcista
- Asia: Alcista
- Londres: Alcista
- NY: Alcista
- Resumen: “Londres – Alcista”
Ejemplo 2 – Reversión
- Asia: Alcista
- Londres: Bajista
- NY: Bajista
- Resumen: “Nueva York – Bajista”
Ejemplo 3 – Volatilidad en Asia
- Asia: Rango amplio
- Londres: Rango pequeño
- NY: Rango medio
- Resumen: “Asia – Neutro”
10. Recomendaciones de Uso
- Usa fixedTF = M5 para análisis institucional.
- Usa fixedTF = M3 para scalping.
- Usa fixedTF = M15 para swing trading.
- Mantén useFixedTF = true si quieres estabilidad entre timeframes.
- Cambia a useFixedTF = false si quieres ver cómo se comporta cada sesión en distintos marcos.
11. Ventajas del Indicador
- Claridad institucional.
- Datos consistentes entre timeframes.
- Resumen automático.
- Ideal para backtesting visual.
- Perfecto para presentaciones, reportes y análisis ejecutivos.
- Diseño limpio y profesional.
12. Conclusión
Este indicador te permite entender el comportamiento diario del mercado de forma inmediata, precisa y visualmente clara.
Es una herramienta diseñada para traders que buscan orden, consistencia y análisis institucional.
13. Script de Pine para uso en Trading View
//@version=5indicator("Panel Sesiones – OHLC + Rango + Dirección + Resumen", overlay=true, max_labels_count=500)//────────────────────────────────────────────// INPUTS//────────────────────────────────────────────showPanel = input.bool(true, "Mostrar Panel")showAsia = input.bool(true, "Asia")showLondon = input.bool(true, "Londres")showNY = input.bool(true, "Nueva York")// Timeframe fijo configurablefixedTF = input.timeframe("5", "Timeframe fijo para cálculos")useFixedTF = input.bool(true, "Usar timeframe fijo para cálculos")// Sesiones (CST México)asiaSess = input.session("0000-0500", "Sesión Asia")londonSess = input.session("0200-1000", "Sesión Londres")nySess = input.session("0730-1500", "Sesión Nueva York")// ColumnascolShowSession = input.bool(true, "Columna: Sesión")colShowOpen = input.bool(true, "Columna: Apertura")colShowHigh = input.bool(true, "Columna: Máximo")colShowLow = input.bool(true, "Columna: Mínimo")colShowClose = input.bool(true, "Columna: Cierre")colShowRange = input.bool(true, "Columna: Rango")colShowDirection = input.bool(true, "Columna: Dirección")// ColorescolorAsia = color.new(color.gray, 0)colorLondon = color.new(color.blue, 0)colorNY = color.new(color.orange, 0)//────────────────────────────────────────────// FUNCIONES//────────────────────────────────────────────inSession(sess) => time(timeframe.period, sess) != 0f_sessionOHLC(sess) => var float hi = na var float lo = na var float op = na var float cl = na if inSession(sess) hi := na(hi) ? high : math.max(hi, high) lo := na(lo) ? low : math.min(lo, low) op := na(op) ? open : op cl := close [op, hi, lo, cl]f_sessionClosed(sess) => not inSession(sess) and inSession(sess)[1]//────────────────────────────────────────────// TIMEFRAME BASE//────────────────────────────────────────────tfSource = useFixedTF ? fixedTF : timeframe.period[asiaOp, asiaHi, asiaLo, asiaCl] = request.security(syminfo.tickerid, tfSource, f_sessionOHLC(asiaSess))[londonOp, londonHi, londonLo, londonCl] = request.security(syminfo.tickerid, tfSource, f_sessionOHLC(londonSess))[nyOp, nyHi, nyLo, nyCl] = request.security(syminfo.tickerid, tfSource, f_sessionOHLC(nySess))//────────────────────────────────────────────// VALORES FINALES DE SESIÓN (INDEPENDIENTES DEL TF DEL GRÁFICO)//────────────────────────────────────────────var float asiaOpFinal = navar float asiaHiFinal = navar float asiaLoFinal = navar float asiaClFinal = navar float londonOpFinal = navar float londonHiFinal = navar float londonLoFinal = navar float londonClFinal = navar float nyOpFinal = navar float nyHiFinal = navar float nyLoFinal = navar float nyClFinal = na// Detectar cierre de sesión usando el timeframe fijo[asiaClosed, londonClosed, nyClosed] = request.security(syminfo.tickerid, tfSource, [f_sessionClosed(asiaSess), f_sessionClosed(londonSess), f_sessionClosed(nySess)])if asiaClosed asiaOpFinal := asiaOp[1] asiaHiFinal := asiaHi[1] asiaLoFinal := asiaLo[1] asiaClFinal := asiaCl[1]if londonClosed londonOpFinal := londonOp[1] londonHiFinal := londonHi[1] londonLoFinal := londonLo[1] londonClFinal := londonCl[1]if nyClosed nyOpFinal := nyOp[1] nyHiFinal := nyHi[1] nyLoFinal := nyLo[1] nyClFinal := nyCl[1]//────────────────────────────────────────────// PANEL//────────────────────────────────────────────var table panel = table.new(position.top_right, 7, 5, border_width=1)// Variables para resumen fijovar string resumenFijo = navar color colorFijo = naf_fillRow(_row, _name, _op, _hi, _lo, _cl, _bgColor) => dir = (not na(_cl) and not na(_op)) ? (_cl > _op ? "Alcista" : _cl < _op ? "Bajista" : "Neutro") : "-" rangeVal = (not na(_hi) and not na(_lo)) ? _hi - _lo : na rangeStr = not na(rangeVal) ? str.tostring(rangeVal, format.mintick) : "-" if colShowSession table.cell(panel, 0, _row, _name, bgcolor=_bgColor) if colShowOpen table.cell(panel, 1, _row, na(_op) ? "-" : str.tostring(_op, format.mintick), bgcolor=_bgColor) if colShowHigh table.cell(panel, 2, _row, na(_hi) ? "-" : str.tostring(_hi, format.mintick), bgcolor=_bgColor) if colShowLow table.cell(panel, 3, _row, na(_lo) ? "-" : str.tostring(_lo, format.mintick), bgcolor=_bgColor) if colShowClose table.cell(panel, 4, _row, na(_cl) ? "-" : str.tostring(_cl, format.mintick), bgcolor=_bgColor) if colShowRange table.cell(panel, 5, _row, rangeStr, bgcolor=_bgColor) if colShowDirection table.cell(panel, 6, _row, dir, bgcolor=_bgColor) [rangeVal, dir]//────────────────────────────────────────────// RENDER PANEL + RESUMEN//────────────────────────────────────────────if showPanel // Encabezados table.cell(panel, 0, 0, "SESIÓN", bgcolor=color.black, text_color=color.white) table.cell(panel, 1, 0, "APERTURA", bgcolor=color.black, text_color=color.white) table.cell(panel, 2, 0, "MÁXIMO", bgcolor=color.black, text_color=color.white) table.cell(panel, 3, 0, "MÍNIMO", bgcolor=color.black, text_color=color.white) table.cell(panel, 4, 0, "CIERRE", bgcolor=color.black, text_color=color.white) table.cell(panel, 5, 0, "RANGO", bgcolor=color.black, text_color=color.white) table.cell(panel, 6, 0, "DIRECCIÓN", bgcolor=color.black, text_color=color.white) row = 1 [rangeAsia, dirAsia] = f_fillRow(row, "Asia", asiaOpFinal, asiaHiFinal, asiaLoFinal, asiaClFinal, color.new(colorAsia, 80)) row += 1 [rangeLondon, dirLondon] = f_fillRow(row, "Londres", londonOpFinal, londonHiFinal, londonLoFinal, londonClFinal, color.new(colorLondon, 80)) row += 1 [rangeNY, dirNY] = f_fillRow(row, "Nueva York", nyOpFinal, nyHiFinal, nyLoFinal, nyClFinal, color.new(colorNY, 80)) row += 1 //──────────────────────────────────────────── // RESUMEN //──────────────────────────────────────────── validRanges = array.new_float() if not na(rangeAsia) array.push(validRanges, rangeAsia) if not na(rangeLondon) array.push(validRanges, rangeLondon) if not na(rangeNY) array.push(validRanges, rangeNY) maxRange = array.size(validRanges) > 0 ? array.max(validRanges) : na string sesionMasVolatil = "—" string dirMasVolatil = "—" if not na(maxRange) if rangeAsia == maxRange sesionMasVolatil := "Asia" dirMasVolatil := dirAsia else if rangeLondon == maxRange sesionMasVolatil := "Londres" dirMasVolatil := dirLondon else if rangeNY == maxRange sesionMasVolatil := "Nueva York" dirMasVolatil := dirNY string resumen = "" color colorResumen = color.new(color.gray, 70) if useFixedTF if na(resumenFijo) and sesionMasVolatil != "—" resumenFijo := "Sesión más volátil: " + sesionMasVolatil + " – " + dirMasVolatil if dirMasVolatil == "Alcista" colorFijo := color.new(color.green, 0) else if dirMasVolatil == "Bajista" colorFijo := color.new(color.red, 0) else colorFijo := color.new(color.gray, 70) resumen := na(resumenFijo) ? "Sesión más volátil: —" : resumenFijo colorResumen := na(colorFijo) ? color.new(color.gray, 70) : colorFijo else resumen := "Sesión más volátil: " + sesionMasVolatil + " – " + dirMasVolatil if dirMasVolatil == "Alcista" colorResumen := color.new(color.green, 0) else if dirMasVolatil == "Bajista" colorResumen := color.new(color.red, 0) else colorResumen := color.new(color.gray, 70) table.cell(panel, 0, 4, resumen, bgcolor=colorResumen, text_color=color.white)

