Pin: Hybrid Scalper HUD (Pine) + Inputs
Posted: Sat Sep 05, 2026 1:00 pm
This is a **Heads-Up Display**, not an auto-entry bot. It keeps regime + risk context on the chart so you stop guessing under stress.
Hybrid scalper, as I mean it: discretionary trigger + mechanical filters (VWAP side, opening range, ATR stop distance, session clock). The script doesn't click for you. It nags you with structure. I like nagging. Nagging has saved me more money than clever entries.
### What the HUD shows
- Session VWAP side (`ABOVE` / `BELOW` / `NEAR`)
- Opening range high/low (first N minutes)
- ATR-based stop distance suggestion (shares still discretionary)
- Volatility proxy via range expansion
- "TRADE WINDOW" vs "NO NEW ENTRIES" clock flags
atrStopMult = input.float(1.0, "ATR stop multiple", step=0.1)
nearVwapAtr = input.float(0.15, "NEAR VWAP if within ATR×", step=0.05)
noNewEntriesMin = input.int(5, "No new entries first N minutes", minval=0)
lunchStart = input.int(1200, "Lunch start HHMM ET-ish exchange", tooltip="Uses exchange timezone")
lunchEnd = input.int(1300, "Lunch end HHMM")
showOrBox = input.bool(true, "Show OR box")
showTable = input.bool(true, "Show HUD table")
// --- Session helpers ---
sesOK = not na(time(timeframe.period, "0930-1600"))
minuteNow = hour(time, "America/New_York") * 60 + minute(time, "America/New_York")
openMinute = 9 * 60 + 30
minsFromOpen = minuteNow - openMinute
// Opening range
inOR = sesOK and minsFromOpen >= 0 and minsFromOpen < orMinutes
var float orHigh = na
var float orLow = na
// Clocks
inNoNew = sesOK and minsFromOpen >= 0 and minsFromOpen < noNewEntriesMin
hhmm = hour(time, "America/New_York") * 100 + minute(time, "America/New_York")
inLunch = hhmm >= lunchStart and hhmm < lunchEnd
tradeWindow = sesOK and not inNoNew and not inLunch and not na(orHigh)
// Suggested stop distance (price units)
stopDist = atrStopMult * atrV
// Visuals
plot(vwapV, "VWAP", color=color.new(color.orange, 0), linewidth=2)
plot(showOrBox ? orHigh : na, "OR High", color=color.new(color.teal, 0))
plot(showOrBox ? orLow : na, "OR Low", color=color.new(color.teal, 0))
bgcolor(inNoNew ? color.new(color.red, 92) : inLunch ? color.new(color.gray, 94) : na)
// HUD table
table.cell(hud, 0, 5, "Mins from open")
table.cell(hud, 1, 5, str.tostring(minsFromOpen))
table.cell(hud, 0, 6, "Regime hint")
table.cell(hud, 1, 6, close > vwapV and close > orHigh ? "BREAK↑" : close < vwapV and close < orLow ? "BREAK↓" : "INSIDE/NA")
// Optional markers: OR complete
plotshape(sesOK and minsFromOpen == orMinutes, title="OR locked", style=shape.diamond, location=location.abovebar, size=size.tiny, color=color.teal)
[/code]
### Suggested inputs for stock scalpers
| Input | Starter | Notes |
|-------|---------|-------|
| OR minutes | 15 | Some use 5 — don't mix stats |
| ATR mult | 1.0 | Cap risk $ separately |
| No new entries | 5 | Aligns with first-15 doctrine |
| Lunch block | 12:00–13:00 ET | Optional |
### Non-goals
Does **not** place orders. `BREAK↑/↓` is a hint, not a signal service. Validate timezone on the symbol you trade.
Pin it. Fork it. Post forks with a changelog — not equity curves.
What OR length do you actually run — 5 or 15 — and do you keep stats separate?
Anyone add a spread warning input that didn't turn into lag soup?
Lunch block on or off for your style?
Forked this already? What did you change first?
var table hud = table.new(position.top_right, 2, 7, border_width=1)
if showTable and barstate.islast
table.cell(hud, 0, 0, "Hybrid HUD", text_color=color.white)
table.cell(hud, 1, 0, syminfo.ticker, text_color=color.white)
table.cell(hud, 0, 1, "VWAP")
table.cell(hud, 1, 1, vwapSide)
table.cell(hud, 0, 2, "OR H/L")
table.cell(hud, 1, 2, (na(orHigh) ? "-" : str.tostring(orHigh, format.mintick)) + " / " + (na(orLow) ? "-" : str.tostring(orLow, format.mintick)))
table.cell(hud, 0, 3, "ATR stop Δ")
table.cell(hud, 1, 3, str.tostring(stopDist, format.mintick))
table.cell(hud, 0, 4, "Window")
table.cell(hud, 1, 4, tradeWindow ? "OPEN" : "BLOCKED", text_color=tradeWindow ? color.green : color.red)
if ta.change(time("D"))
orHigh := na
orLow := na
if inOR
orHigh := na(orHigh) ? high : math.max(orHigh, high)
orLow := na(orLow) ? low : math.min(orLow, low)
// VWAP
vwapV = ta.vwap(hlc3)
atrV = ta.atr(atrLen)
distVwap = math.abs(close - vwapV)
vwapSide = distVwap <= nearVwapAtr * atrV ? "NEAR" : (close > vwapV ? "ABOVE" : "BELOW")
### Pine Script v5 — Hybrid Scalper HUD
Hybrid scalper, as I mean it: discretionary trigger + mechanical filters (VWAP side, opening range, ATR stop distance, session clock). The script doesn't click for you. It nags you with structure. I like nagging. Nagging has saved me more money than clever entries.
### What the HUD shows
- Session VWAP side (`ABOVE` / `BELOW` / `NEAR`)
- Opening range high/low (first N minutes)
- ATR-based stop distance suggestion (shares still discretionary)
- Volatility proxy via range expansion
- "TRADE WINDOW" vs "NO NEW ENTRIES" clock flags
atrStopMult = input.float(1.0, "ATR stop multiple", step=0.1)
nearVwapAtr = input.float(0.15, "NEAR VWAP if within ATR×", step=0.05)
noNewEntriesMin = input.int(5, "No new entries first N minutes", minval=0)
lunchStart = input.int(1200, "Lunch start HHMM ET-ish exchange", tooltip="Uses exchange timezone")
lunchEnd = input.int(1300, "Lunch end HHMM")
showOrBox = input.bool(true, "Show OR box")
showTable = input.bool(true, "Show HUD table")
// --- Session helpers ---
sesOK = not na(time(timeframe.period, "0930-1600"))
minuteNow = hour(time, "America/New_York") * 60 + minute(time, "America/New_York")
openMinute = 9 * 60 + 30
minsFromOpen = minuteNow - openMinute
// Opening range
inOR = sesOK and minsFromOpen >= 0 and minsFromOpen < orMinutes
var float orHigh = na
var float orLow = na
// Clocks
inNoNew = sesOK and minsFromOpen >= 0 and minsFromOpen < noNewEntriesMin
hhmm = hour(time, "America/New_York") * 100 + minute(time, "America/New_York")
inLunch = hhmm >= lunchStart and hhmm < lunchEnd
tradeWindow = sesOK and not inNoNew and not inLunch and not na(orHigh)
// Suggested stop distance (price units)
stopDist = atrStopMult * atrV
// Visuals
plot(vwapV, "VWAP", color=color.new(color.orange, 0), linewidth=2)
plot(showOrBox ? orHigh : na, "OR High", color=color.new(color.teal, 0))
plot(showOrBox ? orLow : na, "OR Low", color=color.new(color.teal, 0))
bgcolor(inNoNew ? color.new(color.red, 92) : inLunch ? color.new(color.gray, 94) : na)
// HUD table
table.cell(hud, 0, 5, "Mins from open")
table.cell(hud, 1, 5, str.tostring(minsFromOpen))
table.cell(hud, 0, 6, "Regime hint")
table.cell(hud, 1, 6, close > vwapV and close > orHigh ? "BREAK↑" : close < vwapV and close < orLow ? "BREAK↓" : "INSIDE/NA")
// Optional markers: OR complete
plotshape(sesOK and minsFromOpen == orMinutes, title="OR locked", style=shape.diamond, location=location.abovebar, size=size.tiny, color=color.teal)
[/code]
### Suggested inputs for stock scalpers
| Input | Starter | Notes |
|-------|---------|-------|
| OR minutes | 15 | Some use 5 — don't mix stats |
| ATR mult | 1.0 | Cap risk $ separately |
| No new entries | 5 | Aligns with first-15 doctrine |
| Lunch block | 12:00–13:00 ET | Optional |
### Non-goals
Does **not** place orders. `BREAK↑/↓` is a hint, not a signal service. Validate timezone on the symbol you trade.
Pin it. Fork it. Post forks with a changelog — not equity curves.
What OR length do you actually run — 5 or 15 — and do you keep stats separate?
Anyone add a spread warning input that didn't turn into lag soup?
Lunch block on or off for your style?
Forked this already? What did you change first?
var table hud = table.new(position.top_right, 2, 7, border_width=1)
if showTable and barstate.islast
table.cell(hud, 0, 0, "Hybrid HUD", text_color=color.white)
table.cell(hud, 1, 0, syminfo.ticker, text_color=color.white)
table.cell(hud, 0, 1, "VWAP")
table.cell(hud, 1, 1, vwapSide)
table.cell(hud, 0, 2, "OR H/L")
table.cell(hud, 1, 2, (na(orHigh) ? "-" : str.tostring(orHigh, format.mintick)) + " / " + (na(orLow) ? "-" : str.tostring(orLow, format.mintick)))
table.cell(hud, 0, 3, "ATR stop Δ")
table.cell(hud, 1, 3, str.tostring(stopDist, format.mintick))
table.cell(hud, 0, 4, "Window")
table.cell(hud, 1, 4, tradeWindow ? "OPEN" : "BLOCKED", text_color=tradeWindow ? color.green : color.red)
if ta.change(time("D"))
orHigh := na
orLow := na
if inOR
orHigh := na(orHigh) ? high : math.max(orHigh, high)
orLow := na(orLow) ? low : math.min(orLow, low)
// VWAP
vwapV = ta.vwap(hlc3)
atrV = ta.atr(atrLen)
distVwap = math.abs(close - vwapV)
vwapSide = distVwap <= nearVwapAtr * atrV ? "NEAR" : (close > vwapV ? "ABOVE" : "BELOW")
### Pine Script v5 — Hybrid Scalper HUD
Code: Select all
//@version=5
indicator("Hybrid Scalper HUD", overlay=true, max_labels_count=50)
// --- Inputs ---
orMinutes = input.int(15, "Opening range minutes", minval=1, maxval=60)
atrLen = input.int(14, "ATR length")