OPEN-SOURCE SCRIPT
15 min orb

//version=5
strategy("15min ORB Retest Strategy", overlay=true, default_qty_type=strategy.fixed, default_qty_value=2, initial_capital=50000, commission_type=strategy.commission.cash_per_contract, commission_value=2.50)
// ========== INPUTS ==========
entryLevel = input.string("Top/Bottom", "Entry Level", options=["Top/Bottom", "Midpoint"])
stopPoints = input.float(5.0, "Stop Loss (Points)", minval=0.1)
tpPoints = input.float(10.0, "Take Profit (Points)", minval=0.1)
// ========== TIME SETTINGS (Mountain Time = UTC-7 or UTC-6 depending on DST) ==========
// TradingView uses UTC, so adjust based on your MT offset
// For simplicity, using session strings. Adjust if needed for DST.
orbSession = "0600-0615:1234567" // 6:00-6:15 AM MT (adjust UTC offset as needed)
tradeSession = "0700-0730:1234567" // 7:00-7:30 AM MT
// ========== ORB BOX CALCULATION ==========
var float boxHigh = na
var float boxLow = na
var float boxMid = na
var bool boxSet = false
var bool tradeToday = false
var bool breakoutUp = false
var bool breakoutDown = false
// Detect ORB session (6:00-6:15 AM MT)
inOrbSession = not na(time(timeframe.period, orbSession, "America/Denver"))
if inOrbSession and not boxSet
boxHigh := high
boxLow := low
boxSet := true
else if inOrbSession and boxSet
boxHigh := math.max(boxHigh, high)
boxLow := math.min(boxLow, low)
// Calculate midpoint
if not na(boxHigh) and not na(boxLow)
boxMid := (boxHigh + boxLow) / 2
// Reset daily
if ta.change(time('D'))
boxSet := false
tradeToday := false
breakoutUp := false
breakoutDown := false
boxHigh := na
boxLow := na
boxMid := na
// ========== DRAW BOX ==========
var line topLine = na
var line bottomLine = na
var line midLine = na
if boxSet and not na(boxHigh)
if na(topLine)
topLine := line.new(bar_index, boxHigh, bar_index + 1, boxHigh, color=color.green, width=2)
bottomLine := line.new(bar_index, boxLow, bar_index + 1, boxLow, color=color.red, width=2)
midLine := line.new(bar_index, boxMid, bar_index + 1, boxMid, color=color.gray, width=1, style=line.style_dashed)
else
line.set_x2(topLine, bar_index)
line.set_x2(bottomLine, bar_index)
line.set_x2(midLine, bar_index)
// ========== BREAKOUT DETECTION ==========
inTradeSession = not na(time(timeframe.period, tradeSession, "America/Denver"))
// Breakout = 1m close outside box
if boxSet and not na(boxHigh) and not breakoutUp and not breakoutDown
if close > boxHigh
breakoutUp := true
if close < boxLow
breakoutDown := true
// ========== MIDPOINT INVALIDATION (with re-setup) ==========
if breakoutUp and close < boxMid
breakoutUp := false // Allow re-setup
if breakoutDown and close > boxMid
breakoutDown := false // Allow re-setup
// ========== RETEST & ENTRY LOGIC ==========
longCondition = false
shortCondition = false
if boxSet and inTradeSession and not tradeToday
// LONG: breakout up, retest top or midpoint
if breakoutUp
if entryLevel == "Top/Bottom" and close <= boxHigh and close >= boxHigh - 0.25
longCondition := true
if entryLevel == "Midpoint" and close <= boxMid and close >= boxMid - 0.25
longCondition := true
// SHORT: breakout down, retest bottom or midpoint
if breakoutDown
if entryLevel == "Top/Bottom" and close >= boxLow and close <= boxLow + 0.25
shortCondition := true
if entryLevel == "Midpoint" and close >= boxMid and close <= boxMid + 0.25
shortCondition := true
// ========== EXECUTE TRADES ==========
if longCondition
strategy.entry("Long", strategy.long)
strategy.exit("TP/SL", "Long", stop=close - stopPoints, limit=close + tpPoints)
tradeToday := true
if shortCondition
strategy.entry("Short", strategy.short)
strategy.exit("TP/SL", "Short", stop=close + stopPoints, limit=close - tpPoints)
tradeToday := true
// ========== PLOT SIGNALS ==========
plotshape(longCondition, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, title="Long Entry")
plotshape(shortCondition, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, title="Short Entry")
strategy("15min ORB Retest Strategy", overlay=true, default_qty_type=strategy.fixed, default_qty_value=2, initial_capital=50000, commission_type=strategy.commission.cash_per_contract, commission_value=2.50)
// ========== INPUTS ==========
entryLevel = input.string("Top/Bottom", "Entry Level", options=["Top/Bottom", "Midpoint"])
stopPoints = input.float(5.0, "Stop Loss (Points)", minval=0.1)
tpPoints = input.float(10.0, "Take Profit (Points)", minval=0.1)
// ========== TIME SETTINGS (Mountain Time = UTC-7 or UTC-6 depending on DST) ==========
// TradingView uses UTC, so adjust based on your MT offset
// For simplicity, using session strings. Adjust if needed for DST.
orbSession = "0600-0615:1234567" // 6:00-6:15 AM MT (adjust UTC offset as needed)
tradeSession = "0700-0730:1234567" // 7:00-7:30 AM MT
// ========== ORB BOX CALCULATION ==========
var float boxHigh = na
var float boxLow = na
var float boxMid = na
var bool boxSet = false
var bool tradeToday = false
var bool breakoutUp = false
var bool breakoutDown = false
// Detect ORB session (6:00-6:15 AM MT)
inOrbSession = not na(time(timeframe.period, orbSession, "America/Denver"))
if inOrbSession and not boxSet
boxHigh := high
boxLow := low
boxSet := true
else if inOrbSession and boxSet
boxHigh := math.max(boxHigh, high)
boxLow := math.min(boxLow, low)
// Calculate midpoint
if not na(boxHigh) and not na(boxLow)
boxMid := (boxHigh + boxLow) / 2
// Reset daily
if ta.change(time('D'))
boxSet := false
tradeToday := false
breakoutUp := false
breakoutDown := false
boxHigh := na
boxLow := na
boxMid := na
// ========== DRAW BOX ==========
var line topLine = na
var line bottomLine = na
var line midLine = na
if boxSet and not na(boxHigh)
if na(topLine)
topLine := line.new(bar_index, boxHigh, bar_index + 1, boxHigh, color=color.green, width=2)
bottomLine := line.new(bar_index, boxLow, bar_index + 1, boxLow, color=color.red, width=2)
midLine := line.new(bar_index, boxMid, bar_index + 1, boxMid, color=color.gray, width=1, style=line.style_dashed)
else
line.set_x2(topLine, bar_index)
line.set_x2(bottomLine, bar_index)
line.set_x2(midLine, bar_index)
// ========== BREAKOUT DETECTION ==========
inTradeSession = not na(time(timeframe.period, tradeSession, "America/Denver"))
// Breakout = 1m close outside box
if boxSet and not na(boxHigh) and not breakoutUp and not breakoutDown
if close > boxHigh
breakoutUp := true
if close < boxLow
breakoutDown := true
// ========== MIDPOINT INVALIDATION (with re-setup) ==========
if breakoutUp and close < boxMid
breakoutUp := false // Allow re-setup
if breakoutDown and close > boxMid
breakoutDown := false // Allow re-setup
// ========== RETEST & ENTRY LOGIC ==========
longCondition = false
shortCondition = false
if boxSet and inTradeSession and not tradeToday
// LONG: breakout up, retest top or midpoint
if breakoutUp
if entryLevel == "Top/Bottom" and close <= boxHigh and close >= boxHigh - 0.25
longCondition := true
if entryLevel == "Midpoint" and close <= boxMid and close >= boxMid - 0.25
longCondition := true
// SHORT: breakout down, retest bottom or midpoint
if breakoutDown
if entryLevel == "Top/Bottom" and close >= boxLow and close <= boxLow + 0.25
shortCondition := true
if entryLevel == "Midpoint" and close >= boxMid and close <= boxMid + 0.25
shortCondition := true
// ========== EXECUTE TRADES ==========
if longCondition
strategy.entry("Long", strategy.long)
strategy.exit("TP/SL", "Long", stop=close - stopPoints, limit=close + tpPoints)
tradeToday := true
if shortCondition
strategy.entry("Short", strategy.short)
strategy.exit("TP/SL", "Short", stop=close + stopPoints, limit=close - tpPoints)
tradeToday := true
// ========== PLOT SIGNALS ==========
plotshape(longCondition, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small, title="Long Entry")
plotshape(shortCondition, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small, title="Short Entry")
Script de código aberto
Em verdadeiro espírito do TradingView, o criador deste script o tornou de código aberto, para que os traders possam revisar e verificar sua funcionalidade. Parabéns ao autor! Embora você possa usá-lo gratuitamente, lembre-se de que a republicação do código está sujeita às nossas Regras da Casa.
Aviso legal
As informações e publicações não se destinam a ser, e não constituem, conselhos ou recomendações financeiras, de investimento, comerciais ou de outro tipo fornecidos ou endossados pela TradingView. Leia mais nos Termos de Uso.
Script de código aberto
Em verdadeiro espírito do TradingView, o criador deste script o tornou de código aberto, para que os traders possam revisar e verificar sua funcionalidade. Parabéns ao autor! Embora você possa usá-lo gratuitamente, lembre-se de que a republicação do código está sujeita às nossas Regras da Casa.
Aviso legal
As informações e publicações não se destinam a ser, e não constituem, conselhos ou recomendações financeiras, de investimento, comerciais ou de outro tipo fornecidos ou endossados pela TradingView. Leia mais nos Termos de Uso.