OPEN-SOURCE SCRIPT
Actualizado

Sessions, Opening Levels and Day Separators

666
=====================================================================

⚠️⚠️ PLEASE READ BEFORE USING ⚠️⚠️

⚠️ This is an EDUCATIONAL AND ANALYTICAL tool. It is not financial
advice, it is not a trading system, and it is not a signal service.
It produces no buy or sell signals of any kind.

⚠️ Every number and level this script draws is a HISTORICAL
MEASUREMENT of where price has already been. None of it is a
probability, a forecast, a prediction, or an expectation. A line at
yesterday's high tells you where yesterday's high was. It tells you
nothing whatsoever about whether price will reach it, respect it, or
reverse at it.

⚠️ Past market behaviour does not guarantee, imply or suggest future
market behaviour. Levels that held ten times can fail on the eleventh.

⚠️ You are solely responsible for every trading decision you make and
for every loss you incur. Trading leveraged instruments carries a real
risk of losing more than your deposit. If you are unsure, seek advice
from a licensed professional. Nothing here is a recommendation to buy
or sell anything.

---------------------------------------------------------------------

WHAT THIS IS

Most intraday traders end up running four or five separate indicators
just to answer four simple questions: where does today start, which
session are we in, where was yesterday's high and low, and where did
this week open? Each of those scripts adds its own indicator slot, its
own settings panel, and its own idea of when a "day" begins.

This is those four tools in one script. It draws vertical lines where
each trading day and week begins, shades the four major trading
sessions, marks the high and low of previous days, weeks and months,
and draws horizontal lines at reference opening prices. It does not
interpret any of that for you. It draws context and stops.

It is open source. Every calculation below is in the code, and you are
encouraged to read it.

---------------------------------------------------------------------

WHAT IT DRAWS

1. DAY AND WEEK VERTICAL LINES
A thin vertical line where each trading day begins and a thicker one
where each trading week begins. Where a week line is drawn, the day
line for that same moment is left out, so the two never sit on top of
each other. The weekday name is written at the TOP of the pane,
positioned midway between two consecutive day lines rather than beside
one, so it labels the day rather than the boundary. There is an
alternative "Background" mode that tints the whole bar instead of
drawing a line.
imagen


2. SESSIONS
Four shaded boxes: Asia, London, New York AM and New York PM. Each box
opens when its session opens and then grows, bar by bar, to contain
every high and low the session has made so far. The box you see is the
literal price range of that session up to that point. A large letter
is written faintly inside each box so you can tell them apart at a
glance. Default times, in New York time, are Asia 20:00-02:00, London
02:00-08:30, NY AM 08:30-11:30, NY PM 13:30-16:00. All four are fully
editable.
imagen

3. PREVIOUS HIGHS AND LOWS
Two horizontal lines per period, at the highest and lowest price
reached during a previous COMPLETED day, week or month. The line is
anchored at the start of the period it measures and extends to the
right. You can show more than one previous period, and older ones can
be faded so the most recent stands out.
imagen

4. OPENING LEVELS
Horizontal lines at reference opening prices, each with a short text
label written at the right-hand end: the 00:00 open, the 10:00 open,
today's open, this week's open, this month's open, this year's open,
and the all-time high. When two or more of these land on exactly the
same price, their labels merge into one line of text instead of
printing on top of each other.
imagen

5. WARNING BANNER
A small amber note in the bottom-right corner when something is
switched on but not being drawn. It exists because this script has
twelve independent timeframe filters, and "why is my chart empty?" is
by far the most likely thing to go wrong. Each note names the cause and
what to change. It can be switched off under General once you no longer
need it. Nothing is drawn at all when there is nothing to report.

---------------------------------------------------------------------

HOW IT IS CALCULATED

Nothing here is hidden. This is the actual method.

DAY BOUNDARY — five modes

A "trading day" is not midnight for most instruments. CME futures roll
over at 17:00 Chicago. Stocks start at the opening bell. Crypto starts
at midnight UTC. Rather than guess this from the asset type, which
gets stocks, Euronext, CBOT grains, ICE, VIX and CFD indices wrong,
the script reads it from TradingView's own session data for the
symbol.

Auto (exchange session)
timeframe.change("D") — fires exactly where TradingView starts a
new daily bar for this symbol.

Market open only
session.ismarket and (not session.ismarket[1] or timeframe.change("D"))
then kept only on the FIRST such bar of each calendar day.
That is the transition out of the pre-market where the chart
carries one, and the trading day's own boundary where it does not.
The once-per-day rule matters: on an extended-hours chart the two
halves of that test do not always land on the same bar, and it also
stops a lunch-break reopen counting as a second trading day.
See limitation 2 below — on most symbols this mode legitimately
produces the same lines as Auto.

Midnight (exchange time) / Midnight (New York) / Custom time
For each bar, build the target instant for THAT BAR'S OWN
calendar date:
timestamp(tz, year(time,tz), month(time,tz),
dayofmonth(time,tz), HH, MM)
and fire when all three of these are true:
time >= that instant
time[1] < that instant
time - that instant < (chart timeframe in seconds x 1000)

timestamp() is timezone- and daylight-saving-aware, so the
boundary does not slide by an hour on the two DST changeover
days each year. The third condition — the boundary must fall
INSIDE the bar that just opened — is what stops the Sunday
evening double-line: CME reopens Sunday 18:00 New York, and the
weekend gap technically straddles Sunday midnight, so without it
you would get both an 18:00 line and a midnight line the same
night.

WEEK BOUNDARY — three modes

Exchange Week timeframe.change("W")
Specific Day a day boundary whose session weekday matches the
day you choose
Follow Day Start the script watches for timeframe.change("W"),
records WHICH weekday the exchange's week opens
on, then fires on the day boundary that lands on
that weekday

The session weekday is taken from the MIDPOINT of the daily bar:
mid = time("D") + (time_close("D") - time("D")) / 2
dow = dayofweek(mid, exchange timezone)
The midpoint always falls inside the session, so a CME Wednesday
session that opens on Tuesday evening correctly counts as Wednesday.

All three modes are then de-duplicated against time("W"), so you get
at most one week line per exchange week even when a day boundary and a
daily-bar boundary disagree.

DAY NAME POSITION

The name goes midway between the separator that opens its day and the
one that closes it. The closing separator has not happened yet when the
name must be plotted, so the midpoint is predicted, and the prediction
differs by mode.

Auto mode — the separators ARE the daily-bar edges, so the daily bar
hands over both ends:

sessionMid = time("D") + (time_close("D") - time("D")) / 2
name drawn on the first bar of the day where
time + chart timeframe > sessionMid

Both values come from the session schedule, carry no lookahead, and read
the same on every bar inside the day. Written as one comparison rather
than a pair so that a midpoint landing in a gap — a lunch break, or the
hours a holiday session sits closed — is claimed by the first bar after
the gap instead of by no bar at all; a latch, reset at each day boundary,
keeps the rest of the day from claiming it too.

Every other mode — the boundary is a clock time or the opening bell, not
a daily-bar edge, so there is no end to read and the day is measured:

barsPerDay = bar_index(this separator) - bar_index(previous one)
name drawn where bar_index - lastSeparator == floor(barsPerDay / 2)

floor() rather than a plain division: an odd bar count would land on x.5
and match no bar at all, silently dropping that day's name. This estimate
still mis-centres the day after an unusually long or short one, but those
modes are immune to the merged-session case that motivated the Auto-mode
anchor, because a clock boundary falls inside a merged session and splits
it into two named days anyway.

On an ordinary day the two anchors pick the SAME bar — a 23-hour CME
session at 1 hour puts both on bar 11, a 6.5-hour equity session at 15
minutes puts both on bar 13 — so the change is visible only on the
irregular days it exists for.

SESSIONS

inSession = not na(time(chart timeframe, "HHMM-HHMM", timezone))
isNew = inSession and not inSession[1]

On isNew, create a box with top = high, bottom = low. On every later
bar in the session:
top = max(top, high)
bottom = min(bottom, low)
right = current bar

PREVIOUS HIGHS AND LOWS

[t, h, l] = request.security(symbol, "D" / "W" / "M",
[time, high, low],
lookahead = barmerge.lookahead_on)
periodChanged = t != t[1]

When a period changes, the line pair belonging to the period that just
ENDED is given its length and its final price, taken from h[1] and
l[1] — the settled values of the period that has now closed. The new
period's own line pair is created zero-length, which makes it
invisible, and stays that way until that period in turn closes.

ON LOOKAHEAD, STATED PLAINLY: this script does use
barmerge.lookahead_on with a plain high and low. On historical bars
that returns the containing period's FINISHED value, which is
information from that period's own future. Nothing is ever drawn
from it. Every visible line takes its price from the [1] offset
above, which is settled history by the time it is read, and no line
becomes visible before its period has closed. The Data Window values
use the same settled offsets. If you would rather verify this than
take my word for it, the code is open — look for the block commented
"LOOKAHEAD, stated plainly".

The consequence you WILL see: because a period's line is anchored at
the START of the period it measures, on historical bars the line
runs back across the period it summarises. That is intentional and
is how period range lines are conventionally drawn. It is not a
prediction, and the line did not exist on your chart while that
period was still forming.

FADE

color.from_gradient(i, 0, n-1, fully transparent, fully opaque)
where i is the line's position in the history, so the oldest is the
faintest.

OPENING LEVELS

00:00 level time("1", "0000-0001", timezone) becomes non-na
-> level = that bar's open
10:00 level time("1", "1000-1001", timezone) becomes non-na
-> level = that bar's open
Daily timeframe.change("D") -> open
Weekly timeframe.change("W") -> open
Monthly timeframe.change("M") -> open
Yearly timeframe.change("12M") -> open

ALL-TIME HIGH

Tracked incrementally as a running maximum of the chart's own highs,
never by scanning backwards through history. One additional request
(with lookahead OFF) runs the same running maximum on the daily
timeframe, purely to catch a peak that occurred before the chart's
loaded history begins. If that beats the chart-native high, the peak
is off screen to the left and the line simply starts as far left as
TradingView allows a drawing to anchor.

LABEL MERGE

Levels are held in a fixed array whose ORDER is the merge priority.
Every level compares its price against every lower-priority level; on
an exact match the higher-priority label absorbs the lower one's text
("00:00 + W.O") and the lower one renders an empty label. Its line is
still there, at the identical price.

---------------------------------------------------------------------

HOW IT COMPARES TO THE CLOSEST ALTERNATIVE

The closest well-known free alternative is ICT Killzones + Pivots,
which covers the same broad ground: session boxes, previous
day/week/month levels, opening prices and separators. TradingView also
ships a built-in "Session breaks" option in Chart Settings that draws
vertical session dividers for free, without using an indicator slot.

WHERE THIS SCRIPT GOES FURTHER

1. THE DAY BOUNDARY IS A REAL SETTING, NOT AN ASSUMPTION.
Five modes: the exchange's own session, the market open only,
midnight in exchange time, midnight in New York, or any clock time
in any of eleven timezones. Most session tools fix the separator to
the exchange session or to a single hardcoded hour.

2. THE WEEK LINE CAN FOLLOW THE DAY LINE.
If you set your day to start at midnight New York on a CME symbol,
most tools still put the week line at the Sunday 18:00 exchange
open, leaving it stranded between two of your day lines. "Follow
Day Start" learns which weekday opens the exchange's week and puts
the week line on the day boundary that lands on it.

3. TWELVE INDEPENDENT TIMEFRAME FILTERS, NOT ONE.
Each element has its own "Apply Below" cutoff. You can have week
lines on the 4-hour, previous-day levels down to the 12-hour,
session boxes only at 15 minutes and below, and the 00:00 level
only at 45 minutes and below — all in one saved profile, with no
switching. Comparable tools use a single global cutoff that hides
everything at once.

4. DAY NAMES ARE CENTRED ON THE DAY, NOT PINNED TO A CLOCK.
In Auto mode the position comes from the session's own midpoint, so
it is right on a half day, and right on a holiday that TradingView
folds into the neighbouring session and prints as one trading day —
the 47-hour block gets its name in the middle of 47 hours, and the
day after it is unaffected. The other modes measure the previous
day's width in bars, which is what spacing on screen actually is.

5. IT TELLS YOU WHY YOUR CHART IS EMPTY.
With twelve filters, an empty chart is the most likely failure. A
note appears bottom-right naming the cause.

6. IT HAS AN ALL-TIME HIGH LEVEL, tracked without a backward scan.

7. IT REPORTS NO STATISTICS, DELIBERATELY.
See the next section — this is a genuine trade-off, not only a
feature.

WHERE THE ALTERNATIVE IS BETTER, OR THIS ONE IS WEAKER

Read this section as carefully as the one above. If any of these
matter to you, use the other tool.

1. NO SESSION HIGH AND LOW LEVELS. ICT Killzones + Pivots stores each
session's high and low as horizontal lines and extends them
forward until price trades through them. That is the single most
used feature of that script and this one has no equivalent at all.
Here the box is the whole record, and it stops at the session end.

2. NO ALERTS. None. The alternative can alert you on session highs and
lows and on daily, weekly and monthly levels. If you need to be
notified rather than to watch, this script cannot do it.

3. ONLY TWO FIXED CLOCK LEVELS. You get 00:00 and 10:00 and you cannot
move them or add a third. The alternative lets you type in eight or
more opening times at any hour you like, with your own labels and
colours.

4. ONLY FOUR SESSIONS. Asia, London, NY AM, NY PM, and you cannot add
a fifth. The alternative has five or six configurable slots
including London Close and a regular-trading-hours slot.

5. NO STANDARD DEVIATION OR RANGE PROJECTION LEVELS. The alternative
can plot levels at multiples of a session's average, median or
standard deviation range. This script has nothing comparable.

6. NO STATISTICS TABLE AND NO HIT RATES. The alternative shows how
often each level was reached, with sample sizes. That is
information this script deliberately does not give you. I left it
out because a hit rate presented on a chart reads as a probability
and it is not one — but if you specifically want measured
historical frequencies, this script cannot provide them and the
alternative can.

7. NO SESSION MIDPOINTS.

8. CAPPED HISTORY. Previous-level counts are limited to 50 each, and
day and week separators are capped at 250 with the oldest dropped.
The alternative offers an unlimited history mode.

9. IF ALL YOU WANT IS SEPARATORS, YOU DO NOT NEED THIS SCRIPT.
TradingView's built-in "Session breaks" setting is free, uses no
indicator slot, and costs no computation. This script is only worth
a slot if you want two or more of its four modules.

---------------------------------------------------------------------

HOW TO USE IT

None of the following are recommendations, and none of them are
strategies. They are simply the ways context tools of this kind are
commonly read. Test anything you take from here yourself.

TREND AND CONTINUATION
The previous day's high and low, and the week's opening price, are the
levels most often referenced when describing whether a market is
extending or retracing. A market trading and holding above the prior
day's high is described differently from one that reached it and fell
back. Watch what happens AT the level, not the fact that price arrived
there. Suggested setup: previous day and week levels on, sessions off,
day and week lines on, on the 1-hour or 4-hour.

RANGE AND MEAN REVERSION
The session boxes give you a visible container. When the London box
and the NY AM box overlap heavily in price, the market has not gone
anywhere, and the box edges are the boundaries other participants can
see too. The 00:00 open and the daily open are frequently used as the
"middle" that a rangebound day oscillates around. Suggested setup:
all four sessions on, 00:00 and daily open on, previous-day levels on,
on the 15-minute.

SCALPING
Use the session boxes as a filter on WHEN rather than as a signal on
what. The boundary between one session box ending and the next
beginning is where participation changes hands, and thin periods
between boxes are visibly thin. Turn the day and week vertical lines
off — at 1 to 5 minutes they add clutter without adding information.
Suggested setup: sessions on, previous day on, everything else off,
on the 1-, 2- or 5-minute.

SWING
Switch to the weekly and monthly side. Previous week and previous
month highs and lows, plus the monthly and yearly opens and the
all-time high, give you the small set of levels that a multi-week
position is measured against. Set Previous Week and Previous Month
counts to 3 or 4 and turn on "Fade Older Lines" so the most recent
reads clearly. Suggested setup: previous week and month on, weekly,
monthly and yearly opens on, sessions off, on the 4-hour or daily.

MULTI-TIMEFRAME WORKFLOW
Because every element has its own "Apply Below" cutoff, you can set
this up once so that scrolling from a daily chart down to a 1-minute
chart progressively reveals more detail without you touching a
setting. That is what the twelve filters are for.

---------------------------------------------------------------------

KNOWN BEHAVIOURS AND LIMITATIONS

These are expected. They are listed so they do not look like bugs.

1. "MARKET OPEN ONLY" MATCHES "AUTO" ON MOST SYMBOLS. This mode exists to
skip the pre-market and post-market. All futures, all forex and all
crypto trade one continuous session and have neither, and a stock
chart has neither unless you switch Extended Hours on. Where there is
nothing to skip, the mode falls back to the trading day's own boundary
— which on a regular-hours stock chart is the opening bell anyway —
and a note bottom-right tells you that is what happened. To see the
mode do something different from Auto, put it on a US stock with
Extended Hours enabled: the line lands on the 09:30 open rather than
the 04:00 pre-market start.

2. THE 00:00 AND 10:00 LEVELS DO NOT APPEAR ON STOCKS. They need a
candle that OPENS at exactly that clock time, and that fails for
two separate reasons. First, the market may be shut then — every
stock is closed at midnight, so the 00:00 level can never be drawn
on one, whatever timeframe you use. These two levels are built for
markets that trade around the clock: futures, forex and crypto.
Second, the market may be open but the timeframe's bar grid steps
over the exact minute, which happens on 45-minute and 3-hour charts.
The bottom-right note distinguishes the two, because only the second
one is fixed by changing timeframe.

3. PREVIOUS-PERIOD LINES RUN BACK ACROSS THEIR OWN PERIOD. A line is
anchored at the start of the day, week or month whose high or low
it marks. On historical bars this means the line crosses the period
it summarises. It is not a prediction: the line was invisible while
that period was still forming, and only gained its length and its
final price when the period closed.

4. THE CURRENT PERIOD HAS NO LINE. Today's high and low are not drawn
until today ends. That is the point of the tool.

5. LOOKAHEAD IS USED. See the calculation section above. It is used
for period detection and for reading settled values; nothing
visible is derived from unsettled future data.

6. SATURDAY AND SUNDAY NAMES APPEAR ONLY ON CRYPTO SYMBOLS. On
weekday markets a Sunday evening reopen belongs to Monday's trading
session, so labelling it "Sunday" would be wrong. On crypto every
day is a real day and all seven names appear.

7. THE FIRST DAY ON THE CHART GETS NO NAME. Both anchors only speak for
a day whose opening separator was actually seen, and the chart's
first day is usually a partial one that began before the data did.

8. A LARGE GAP CAN SWALLOW A DAY BOUNDARY. If a holiday or weekend gap
contains the boundary instant entirely, no day line is drawn for
that day. This is deliberate: the alternative is a line at an
arbitrary point inside the gap.

9. BACKGROUND MODE IGNORES YOUR TRANSPARENCY. In "Background" draw
mode the colour swatch supplies the hue but the transparency is
forced to a fixed value. A swatch tuned to look right on a
1-pixel line renders almost opaque when it fills a whole bar.

10. DRAWINGS ARE CAPPED. TradingView allows a script 500 lines, 500
boxes and 500 labels. Day and week separators are capped at 250,
oldest dropped first, so they cannot starve the level lines. If you
request more previous levels than the remaining budget allows, a
note appears and the oldest are dropped.

11. VERY DEEP HISTORY IS TRIMMED. A drawing anchored to a bar index
can only reach about 10,000 bars back. A month is roughly 28,000
bars on a 1-minute chart, so the oldest levels are clamped rather
than allowed to throw an error, and a note says so.

12. SESSION BOXES DISAPPEAR ON VERY LONG CHARTS. TradingView deletes
the oldest box once 500 exist. On a 1-minute chart with four
sessions that is about 125 days.

13. NON-TIME-BASED CHARTS. On Renko, Range, Kagi, Point and Figure or
Line Break charts the "Apply Below" filters cannot work reliably,
because those chart types have no fixed bar duration. A note
appears. The script does not stop you.

14. DELAYED DATA. The script reads only bar data, so on a delayed feed
everything is drawn correctly but arrives late by the length of
the delay. Nothing recalculates differently and nothing breaks.
The only visible effect is that the currently-forming session box
lags real time.

15. THE SETTINGS PANEL USES INVISIBLE SPACING CHARACTERS to line the
dropdowns up into columns. This is purely cosmetic and affects
nothing the script calculates.

16. SOME LABELS USE NON-ASCII CHARACTERS by default: the yen, pound
and dollar signs on the session boxes, and bold letters on the
opening-level labels (D.O = daily open, W.O = weekly open, M.O =
monthly open, Y.O = yearly open, A.T.H = all-time high). If any
render as empty boxes on your system, type over them — every one
of those is a free-text field.

---------------------------------------------------------------------

SETTINGS REFERENCE

GENERAL
Timezone Used by the session times and the 00:00 and
10:00 levels. Handles daylight saving
automatically. Day and week lines read their own
timing from the market instead.
Show Warning The amber notes in the bottom-right corner. On by
Messages default. Turn them off once the behaviour is
familiar; turn them back on first if the chart
ever looks wrong.

DAY AND WEEK VERTICAL LINES
Enable Master switch for this section.
Apply Below Highest chart timeframe this section appears on.
Day Line On/off, plus line style, thickness and colour.
Week Line Same, for the week line. Where a week line is
drawn, that moment's day line is omitted.
Day Starts At Auto (exchange session) / Market open only /
Midnight - exchange time / Midnight - New York /
Custom time. Market open only skips the pre-market
and post-market; on markets that have neither it
matches Auto and says so on the chart.
Custom Time Hour and minute, used only in Custom time mode.
Custom Zone Which timezone that clock time is read in.
Week Starts Follow Day Start / Exchange Week / Specific Day,
plus the weekday for Specific Day.
Day Names Off / Short (Mon) / Full (Monday), plus text
colour and a manual horizontal nudge.
Draw As Lines, or Background tint of the whole bar.

SESSIONS
Enable Master switch.
Apply Below Highest chart timeframe this section appears on.
Asia / London / Each row: on/off, session times as HHMM-HHMM,
NY AM / NY PM box colour, and the letter written inside it.
Label Size Text size, and opacity of the letter (higher is
more visible).

PREVIOUS HIGHS & LOWS
Enable Master switch.
Extend Lines Right On/off, plus how many bars past the last bar.
Previous Day / Each row: on/off, colour, and how many previous
Week / Month periods to show (1 to 50).
Apply Below One per period type - three independent filters.
Line Style Style and thickness for every level here.
Fade Older Lines Older levels fade so the newest stands out.

OPENING LEVELS
Enable Master switch.
00:00 AM / 10:00 AM Each row: on/off, colour, the text written on
Daily / Weekly / the chart, and its own "apply below" timeframe.
Monthly / Yearly /
All-Time High
Line Style Style and thickness for every level here.
Text Colour Colour and size of all the labels.
Line Length How far past the last bar the lines and their
labels sit.

---------------------------------------------------------------------

ALERTS

This version has NO built-in alerts. That is a deliberate scope
decision, not an oversight: everything this script draws is context,
and context is not an event. An alert saying "a session started" fires
at a time you already knew in advance.

If you want to be notified when price reaches one of these levels, the
practical method today is a manual TradingView price alert:

1. Read the price off the level you care about - hover the line, or
open the Data Window (the icon on the right toolbar, or Alt+D on
Windows / Option+D on Mac) and read DH, DL, WH, WL, MH or ML.
2. Press Alt+A (Windows) or Option+A (Mac) to open the alert dialog.
3. In the first Condition dropdown, choose the SYMBOL, not the
indicator.
4. Set the second dropdown to Crossing.
5. Type the price you read in step 1.
6. Set Trigger to Only Once, choose your notification method, and
click Create.

This alert is on the price, not on the script, so it will not move
when the level moves. Re-create it each session.

Built-in alerts are the most requested thing this script does not
have, and they are the most likely addition to a future version.

---------------------------------------------------------------------

⚠️ FINAL REMINDER: this tool measures the past. It does not forecast
the future. Nothing it draws is a signal, a recommendation, or a
statement about what price will do next. Every trading decision, and
every consequence of it, is yours alone.

=====================================================================
Notas de prensa
The day name (Mon, Tues…) now sits properly in the middle of its day. It could drift off-centre after a holiday, when TradingView shows two weekdays as a single trading day, and it could end up sitting right on top of a day or week line on stocks that barely traded that session. Nothing else changed and there are no new settings.

Exención de responsabilidad

La información y las publicaciones no constituyen, ni deben considerarse como, asesoramiento o recomendaciones financieras, de inversión, de trading u otro tipo, proporcionadas o respaldadas por TradingView. Obtenga más información en Condiciones de uso.