//@version=6 indicator("Mentor — Auto Levels v1.3", overlay = true, max_lines_count = 20, max_labels_count = 30) // Own-chart levels only. MNQ/MES/MYM/MGC stay on the micro ticker. // ES/NQ/YM/GC stay on the mini ticker. BTCUSDT.P uses the perp ticker. // Mini levels are never painted onto a micro chart, and vice versa. const string GRP_SOURCE = "1. Contract and sessions" const string GRP_LEVELS = "2. Level groups" const string GRP_DISPLAY = "3. Display" string sessionTz = input.string("America/New_York", "Session timezone", group = GRP_SOURCE, tooltip = "IANA timezone so US daylight-saving changes are automatic.") string overnightSession = input.session("1800-0930", "Overnight session", group = GRP_SOURCE, tooltip = "NY time. CME Globex through US cash open. BTC: same window as NY overnight vs US cash.") bool showOvernight = input.bool(true, "Overnight high / low", group = GRP_LEVELS) bool showPriorDay = input.bool(true, "Prior-day high / low", group = GRP_LEVELS) bool showPriorWeek = input.bool(true, "Prior-week high / low", group = GRP_LEVELS) bool showMidpoints = input.bool(true, "Session midpoints", group = GRP_LEVELS) bool showOpenClose = input.bool(true, "Overnight open and prior closes", group = GRP_LEVELS) bool showLabels = input.bool(true, "Show right-side labels", group = GRP_DISPLAY) bool showDashboard = input.bool(true, "Show compact level table", group = GRP_DISPLAY) bool shadeOvernight = input.bool(false, "Shade active overnight session", group = GRP_DISPLAY) int lineTransparency = input.int(15, "Line transparency", minval = 0, maxval = 90, group = GRP_DISPLAY) string root = str.upper(syminfo.root) string tick = str.upper(syminfo.ticker) bool isNq = root == "NQ" or root == "MNQ" bool isEs = root == "ES" or root == "MES" bool isYm = root == "YM" or root == "MYM" bool isGc = root == "GC" or root == "MGC" bool isBtc = str.contains(tick, "BTC") bool supported = isNq or isEs or isYm or isGc or isBtc string family = isNq ? "NQ family" : isEs ? "ES family" : isYm ? "YM family" : isGc ? "GC family" : isBtc ? "BTC" : "unsupported" f_roundToTick(float value) => na(value) ? na : math.round(value / syminfo.mintick) * syminfo.mintick f_fmt(float value) => na(value) ? "—" : str.tostring(value, format.mintick) [pdhRaw, pdlRaw, pdcRaw] = request.security(syminfo.tickerid, "D", [high[1], low[1], close[1]], gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on) [pwhRaw, pwlRaw, pwcRaw] = request.security(syminfo.tickerid, "W", [high[1], low[1], close[1]], gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on) float pdh = f_roundToTick(pdhRaw) float pdl = f_roundToTick(pdlRaw) float pdc = f_roundToTick(pdcRaw) float pdm = f_roundToTick((pdhRaw + pdlRaw) * 0.5) float pwh = f_roundToTick(pwhRaw) float pwl = f_roundToTick(pwlRaw) float pwc = f_roundToTick(pwcRaw) float pwm = f_roundToTick((pwhRaw + pwlRaw) * 0.5) bool inOvernight = timeframe.isintraday and not na(time(timeframe.period, overnightSession, sessionTz)) bool overnightStart = inOvernight and not inOvernight[1] var float overnightOpenRaw = na var float overnightHighRaw = na var float overnightLowRaw = na if overnightStart overnightOpenRaw := open overnightHighRaw := high overnightLowRaw := low else if inOvernight overnightHighRaw := math.max(nz(overnightHighRaw, high), high) overnightLowRaw := math.min(nz(overnightLowRaw, low), low) float ono = f_roundToTick(overnightOpenRaw) float onh = f_roundToTick(overnightHighRaw) float onl = f_roundToTick(overnightLowRaw) float onm = f_roundToTick((overnightHighRaw + overnightLowRaw) * 0.5) bgcolor(shadeOvernight and inOvernight ? color.new(color.blue, 93) : na, title = "Active overnight session") color overnightColor = color.rgb(54, 162, 235) color priorDayColor = color.rgb(255, 159, 64) color priorWeekColor = color.rgb(153, 102, 255) array levelPrices = array.from(onh, onm, ono, onl, pdh, pdm, pdc, pdl, pwh, pwm, pwc, pwl) array levelNames = array.from("ONH", "ON MID", "ON OPEN", "ONL", "PDH", "PD MID", "PDC", "PDL", "PWH", "PW MID", "PWC", "PWL") array levelColors = array.from(overnightColor, overnightColor, overnightColor, overnightColor, priorDayColor, priorDayColor, priorDayColor, priorDayColor, priorWeekColor, priorWeekColor, priorWeekColor, priorWeekColor) array levelVisible = array.from( supported and timeframe.isintraday and showOvernight, supported and timeframe.isintraday and showOvernight and showMidpoints, supported and timeframe.isintraday and showOvernight and showOpenClose, supported and timeframe.isintraday and showOvernight, supported and showPriorDay, supported and showPriorDay and showMidpoints, supported and showPriorDay and showOpenClose, supported and showPriorDay, supported and showPriorWeek, supported and showPriorWeek and showMidpoints, supported and showPriorWeek and showOpenClose, supported and showPriorWeek) array levelDashed = array.from(false, true, false, false, false, true, false, false, false, true, false, false) array levelDotted = array.from(false, false, true, false, false, false, true, false, false, false, true, false) array labelOffsets = array.from(4, 4, 4, 4, 12, 12, 12, 12, 20, 20, 20, 20) var array levelLines = array.new_line(12) var array