Opening Range Breakout (ORB)
Un indicador para TradingView que dibuja el rango de apertura de Nueva York, Londres y Tokio y marca la primera vela que cierra fuera de él. Es gratuito y de código abierto.
Qué es el rango de apertura
Las primeras horas de una sesión suelen ser las de más actividad. El rango de apertura es el precio máximo y mínimo de los primeros minutos tras la apertura, normalmente 30. Muchos operadores lo usan como referencia: si el precio sale del rango, el mercado está aceptando precios nuevos, y si vuelve a entrar, esa salida no se sostuvo. Una ruptura del rango no garantiza que el precio siga en esa dirección.
El rango
Máximo y mínimo de los primeros minutos de cada sesión, dibujados como dos líneas con el espacio entre ellas sombreado.
- Nueva York, Londres y Tokio, cada una activable por separado.
- Se mantiene unas horas tras la apertura.
- Horario propio de cada mercado, con ajuste automático al cambio de hora.
La primera ruptura
Un triángulo marca la primera vela que cierra fuera del rango, una vez por sesión y por día.
- Se basa en el cierre de la vela, no en la mecha.
- Triángulo hacia arriba si cierra por encima, hacia abajo si cierra por debajo.
- Alertas incluidas para cada sesión.
Niveles extra
Opcionales, para ver la altura del rango proyectada.
- Línea media del rango.
- Extensiones por encima y por debajo, a un múltiplo del rango que eliges.
- Sin stops ni objetivos: son referencias, no un plan.
Cómo se ve
Primero una captura real y debajo un esquema para ubicar cada elemento. Se muestra la sesión de Nueva York, que es la que viene activada.
Esquema ilustrativo del rango de apertura. No son datos de mercado.
Cómo conseguirlo y añadirlo a TradingView
Lo distribuimos desde aquí porque TradingView exige un plan de pago para publicar scripts. Es el mismo código y funciona en una cuenta gratuita.
- Copia el código. Usa el botón de abajo.
- Abre el Editor Pine. En TradingView, abre un gráfico y pulsa Editor Pine en el panel inferior. Elige Abrir y luego Nuevo indicador en blanco, y borra el texto de ejemplo.
- Pega el código y guárdalo. Pulsa Guardar y ponle un nombre. Después, Añadir al gráfico.
- Usa un marco temporal de minutos. Con el rango de 30 minutos, el marco del gráfico debe ser de 30 minutos o menos. Para empezar, prueba con 5 minutos.
- Crea una alerta, si la necesitas. Desde el botón de alertas, elige el indicador y la sesión.
Tu copia. El indicador queda guardado en tu cuenta, en Indicadores › Mis scripts. Si lo mejoramos, volverás a copiar el código desde esta página. Versión actual: 1.1 (3 de noviembre de 2026). Las cuentas gratuitas de TradingView limitan cuántos indicadores caben en un gráfico.
Código del indicador
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// Version 1.1 · 2026-11-03
// © TradingFondeo
//@version=6
indicator("Opening Range Breakout (ORB) [TradingFondeo]", shorttitle = "ORB", overlay = true)
// ─────────────────────────────────────────────────────────────────────────────
// Opening Range Breakout (ORB)
//
// Draws the opening range of the New York, London and Tokyo sessions: the high
// and low of the first N minutes after each session opens. After the range is
// complete, the lines stay on the chart for a set number of hours and the first
// candle that CLOSES outside the range is marked, once per session and day.
//
// Session times are defined in each market's own time zone, so daylight saving
// changes are handled automatically.
//
// It only draws levels and marks the first close outside the range. It does not
// open trades and does not place stops or targets.
// Educational tool. It does not give buy or sell signals.
// ─────────────────────────────────────────────────────────────────────────────
// ── Inputs ───────────────────────────────────────────────────────────────────
GRP_RNG = "Opening range"
rangeMin = input.int(30, "Range length (minutes)", options = [5, 10, 15, 30, 60], group = GRP_RNG, tooltip = "The chart timeframe must be equal to or shorter than this. For a 30-minute range, use 30 minutes or lower.")
extHours = input.float(6.5, "Keep the lines for (hours after the open)", minval = 1.0, maxval = 12.0, step = 0.5, group = GRP_RNG)
GRP_NY = "New York"
nyOn = input.bool(true, "Show New York", group = GRP_NY)
nyH = input.int(9, "Open hour", minval = 0, maxval = 23, group = GRP_NY)
nyM = input.int(30, "Open minute", minval = 0, maxval = 59, group = GRP_NY)
GRP_LON = "London"
lonOn = input.bool(false, "Show London", group = GRP_LON)
lonH = input.int(8, "Open hour", minval = 0, maxval = 23, group = GRP_LON)
lonM = input.int(0, "Open minute", minval = 0, maxval = 59, group = GRP_LON)
GRP_TKY = "Tokyo"
tkyOn = input.bool(false, "Show Tokyo", group = GRP_TKY)
tkyH = input.int(9, "Open hour", minval = 0, maxval = 23, group = GRP_TKY)
tkyM = input.int(0, "Open minute", minval = 0, maxval = 59, group = GRP_TKY)
GRP_LVL = "Extra levels"
showMid = input.bool(true, "Show the middle of the range", group = GRP_LVL)
showExt = input.bool(false, "Show extension levels", group = GRP_LVL)
extMult = input.float(1.0, "Extension (multiple of the range)", minval = 0.25, maxval = 5.0, step = 0.25, group = GRP_LVL, tooltip = "Draws one level above the high and one below the low, at this multiple of the range height.")
GRP_STY = "Style"
showFill = input.bool(true, "Fill the range", group = GRP_STY)
showMarks = input.bool(true, "Mark the first close outside the range", group = GRP_STY)
colNY = input.color(#34D399, "New York", group = GRP_STY)
colLON = input.color(#5B9BFF, "London", group = GRP_STY)
colTKY = input.color(#F5A623, "Tokyo", group = GRP_STY)
// ── One session ──────────────────────────────────────────────────────────────
// Returns: range high, range low, middle, upper extension, lower extension,
// "first close above" flag and "first close below" flag.
// Each call keeps its own state, so the three sessions are independent.
f_orb(string tz, int sh, int sm, bool enabled) =>
var int curStart = na
var float rHi = na
var float rLo = na
var bool done = false
var bool wasIn = false
int t0 = timestamp(tz, year(time, tz), month(time, tz), dayofmonth(time, tz), sh, sm, 0)
int tRangeEnd = t0 + rangeMin * 60000
int tLinesEnd = t0 + int(extHours * 3600000)
// New session day: forget the previous range.
if t0 != nz(curStart)
curStart := t0
rHi := na
rLo := na
done := false
bool inRange = enabled and timeframe.isintraday and time >= t0 and time < tRangeEnd
bool afterRange = enabled and timeframe.isintraday and time >= tRangeEnd and time < tLinesEnd
// The range always starts fresh on the first candle of the window.
if inRange
if wasIn
rHi := math.max(rHi, high)
rLo := math.min(rLo, low)
else
rHi := high
rLo := low
done := false
wasIn := inRange
bool active = (inRange or afterRange) and not na(rHi)
bool brkUp = false
bool brkDn = false
if afterRange and active and not done and barstate.isconfirmed
if close > rHi
brkUp := true
done := true
else if close < rLo
brkDn := true
done := true
float height = na(rHi) ? na : rHi - rLo
[active ? rHi : na, active ? rLo : na, active ? (rHi + rLo) / 2 : na, afterRange and active ? rHi + height * extMult : na, afterRange and active ? rLo - height * extMult : na, brkUp, brkDn]
[nyHi, nyLo, nyMid, nyXu, nyXd, nyUp, nyDn] = f_orb("America/New_York", nyH, nyM, nyOn)
[lonHi, lonLo, lonMid, lonXu, lonXd, lonUp, lonDn] = f_orb("Europe/London", lonH, lonM, lonOn)
[tkyHi, tkyLo, tkyMid, tkyXu, tkyXd, tkyUp, tkyDn] = f_orb("Asia/Tokyo", tkyH, tkyM, tkyOn)
// ── Plots ────────────────────────────────────────────────────────────────────
pNyHi = plot(nyHi, "NY range high", color = colNY, linewidth = 2, style = plot.style_linebr, display = display.pane)
pNyLo = plot(nyLo, "NY range low", color = colNY, linewidth = 2, style = plot.style_linebr, display = display.pane)
plot(showMid ? nyMid : na, "NY middle", color = color.new(colNY, 40), linewidth = 1, style = plot.style_linebr, display = display.pane)
plot(showExt ? nyXu : na, "NY extension up", color = color.new(colNY, 50), linewidth = 1, style = plot.style_linebr, display = display.pane)
plot(showExt ? nyXd : na, "NY extension down", color = color.new(colNY, 50), linewidth = 1, style = plot.style_linebr, display = display.pane)
fill(pNyHi, pNyLo, color = showFill ? color.new(colNY, 90) : na, title = "NY range")
pLonHi = plot(lonHi, "London range high", color = colLON, linewidth = 2, style = plot.style_linebr, display = display.pane)
pLonLo = plot(lonLo, "London range low", color = colLON, linewidth = 2, style = plot.style_linebr, display = display.pane)
plot(showMid ? lonMid : na, "London middle", color = color.new(colLON, 40), linewidth = 1, style = plot.style_linebr, display = display.pane)
plot(showExt ? lonXu : na, "London extension up", color = color.new(colLON, 50), linewidth = 1, style = plot.style_linebr, display = display.pane)
plot(showExt ? lonXd : na, "London extension down", color = color.new(colLON, 50), linewidth = 1, style = plot.style_linebr, display = display.pane)
fill(pLonHi, pLonLo, color = showFill ? color.new(colLON, 90) : na, title = "London range")
pTkyHi = plot(tkyHi, "Tokyo range high", color = colTKY, linewidth = 2, style = plot.style_linebr, display = display.pane)
pTkyLo = plot(tkyLo, "Tokyo range low", color = colTKY, linewidth = 2, style = plot.style_linebr, display = display.pane)
plot(showMid ? tkyMid : na, "Tokyo middle", color = color.new(colTKY, 40), linewidth = 1, style = plot.style_linebr, display = display.pane)
plot(showExt ? tkyXu : na, "Tokyo extension up", color = color.new(colTKY, 50), linewidth = 1, style = plot.style_linebr, display = display.pane)
plot(showExt ? tkyXd : na, "Tokyo extension down", color = color.new(colTKY, 50), linewidth = 1, style = plot.style_linebr, display = display.pane)
fill(pTkyHi, pTkyLo, color = showFill ? color.new(colTKY, 90) : na, title = "Tokyo range")
// First close outside the range (drawn when the candle closes).
plotshape(showMarks and nyUp, "NY close above", shape.triangleup, location.belowbar, color = colNY, size = size.small, text = "NY")
plotshape(showMarks and nyDn, "NY close below", shape.triangledown, location.abovebar, color = colNY, size = size.small, text = "NY")
plotshape(showMarks and lonUp, "London close above", shape.triangleup, location.belowbar, color = colLON, size = size.small, text = "LON")
plotshape(showMarks and lonDn, "London close below", shape.triangledown, location.abovebar, color = colLON, size = size.small, text = "LON")
plotshape(showMarks and tkyUp, "Tokyo close above", shape.triangleup, location.belowbar, color = colTKY, size = size.small, text = "TKY")
plotshape(showMarks and tkyDn, "Tokyo close below", shape.triangledown, location.abovebar, color = colTKY, size = size.small, text = "TKY")
// ── Timeframe warning ────────────────────────────────────────────────────────
var table warn = table.new(position.top_right, 1, 1)
if barstate.islast
bool tfOk = timeframe.isintraday and timeframe.in_seconds() <= rangeMin * 60
table.cell(warn, 0, 0, tfOk ? "" : "ORB: use an intraday timeframe of " + str.tostring(rangeMin) + " minutes or lower", text_color = color.white, bgcolor = tfOk ? na : color.new(#F16565, 20))
// ── Alerts (fire when the candle closes) ─────────────────────────────────────
alertcondition(nyUp, "NY: first close above the range", "NY opening range: first close above the range on {{ticker}} ({{interval}})")
alertcondition(nyDn, "NY: first close below the range", "NY opening range: first close below the range on {{ticker}} ({{interval}})")
alertcondition(lonUp, "London: first close above the range", "London opening range: first close above the range on {{ticker}} ({{interval}})")
alertcondition(lonDn, "London: first close below the range", "London opening range: first close below the range on {{ticker}} ({{interval}})")
alertcondition(tkyUp, "Tokyo: first close above the range", "Tokyo opening range: first close above the range on {{ticker}} ({{interval}})")
alertcondition(tkyDn, "Tokyo: first close below the range", "Tokyo opening range: first close below the range on {{ticker}} ({{interval}})")
alertcondition(nyUp or nyDn or lonUp or lonDn or tkyUp or tkyDn, "Any: first close outside the range", "Opening range: first close outside the range on {{ticker}} ({{interval}})")
Cómo leerlo
Ideas de uso con fines educativos. No son señales ni recomendaciones.
Contexto
- Las rupturas falsas son habituales. Un cierre fuera del rango no dice cuánto va a durar el movimiento.
- Fíjate en la altura del rango. Uno muy estrecho o muy ancho, comparado con los días anteriores, cambia lo que significa una ruptura.
- La media del rango sirve de referencia para ver si el precio vuelve hacia el centro después de salir.
Cuidado con las noticias
- La apertura de Nueva York llega pegada a datos económicos que salen a las 8:30 y a las 10:00 (hora de Nueva York). Compruébalos en el calendario económico.
- Muchas prop firms restringen operar durante noticias de alto impacto. Revisa las reglas de la tuya, por ejemplo en nuestras reseñas.
Importante. Un rango y un triángulo no son una señal. Define tu plan y tu riesgo antes de operar, y prueba cualquier idea en simulación.
Ajustes del indicador
Los valores que trae por defecto. Los nombres aparecen en inglés en TradingView.
Rango de apertura
Duración del rango tras la apertura: 5, 10, 15, 30 o 60 minutos. El marco temporal del gráfico debe ser igual o menor.
Cuántas horas se mantienen las líneas desde la apertura, entre 1 y 12.
Sesiones
Apertura de Nueva York a las 9:30, hora de Nueva York.
Apertura de Londres a las 8:00, hora de Londres.
Apertura de Tokio a las 9:00, hora de Tokio. Puedes cambiar la hora y el minuto de cada una.
Niveles extra
Línea punteada en el centro del rango.
Dibuja un nivel por encima del máximo y otro por debajo del mínimo, a ese múltiplo de la altura del rango.
Estilo
Sombrea el rango.
Triángulo en la primera vela que cierra fuera del rango, una vez por sesión y día.
Un color por sesión: Nueva York, Londres y Tokio.
Limitaciones
- Solo funciona en marcos temporales de minutos u horas, y el marco no puede ser mayor que la duración del rango.
- Marca únicamente el primer cierre fuera del rango de cada sesión y día. Las rupturas posteriores y los regresos al rango no se marcan.
- El triángulo aparece al cerrar la vela, así que llega con ese retraso.
- Londres y Tokio solo muestran datos si el mercado que miras opera a esas horas (futuros o forex, por ejemplo).
- Los datos de la sesión dependen de lo que tu proveedor cargue en el gráfico. Si falta historial de la apertura, el rango puede salir incompleto.
- No usa volumen, no filtra por tendencia ni por VWAP, y no incluye entradas, stops ni objetivos.
Preguntas frecuentes
¿Es una estrategia?
No. Es un indicador que dibuja el rango de apertura y marca la primera vela que cierra fuera de él. No abre operaciones, no coloca stops ni objetivos y no incluye backtest.
¿Da señales de compra o de venta?
No. El triángulo indica un hecho: la primera vela que cerró por encima o por debajo del rango. Si eso es una oportunidad o una trampa depende del contexto y de tu plan.
¿Por qué no veo nada en el gráfico?
Revisa tres cosas: que el marco temporal sea de minutos y no mayor que la duración del rango (con un rango de 30 minutos, usa 30 minutos o menos); que la sesión esté activada en los ajustes; y que el gráfico tenga datos en ese horario. Si el marco es demasiado grande, el indicador muestra un aviso en la esquina.
¿Funciona con el cambio de hora?
Sí. Cada sesión usa la zona horaria de su mercado (Nueva York, Londres o Tokio), así que se ajusta sola cuando cambia el horario de verano.
¿Repinta?
El rango se va formando en tiempo real durante los primeros minutos y, cuando termina, ya no cambia. Los triángulos se dibujan al cierre de la vela, así que no aparecen y desaparecen durante la vela.
¿Sirve para acciones?
Para la sesión de Nueva York, sí, con datos de horario regular. Londres y Tokio necesitan un mercado que opere a esas horas, como los futuros o el forex.
¿Puedo cambiar la hora de apertura?
Sí. Cada sesión tiene su hora y su minuto en los ajustes, por si quieres, por ejemplo, el rango desde las 8:30.
¿Por qué las etiquetas y los ajustes están en inglés?
Porque así los muestra el script en TradingView, con los nombres que lleva el código.
Créditos y licencia
El rango de apertura es un concepto muy conocido entre los operadores, y existen muchos indicadores que lo dibujan. Este código lo escribimos desde cero en TradingFondeo, sin copiar el de otros autores.
Licencia: Mozilla Public License 2.0. Puedes usarlo y modificarlo según sus términos, conservando los avisos de autoría y compartiendo el código modificado bajo la misma licencia.
Aviso de riesgo. Operar futuros conlleva un riesgo alto de pérdida y no es adecuado para todos. Este indicador es una herramienta educativa: no da señales de compra ni de venta, no es asesoría financiera y los resultados pasados no garantizan resultados futuros. Pruébalo primero en una cuenta de simulación.