Session Highs & Lows

Track the high and low of each trading session — Asian, London, and New York — and use them as dynamic support, resistance, and breakout levels.

The global trading day is divided into three major sessions: Asian, London, and New York. Each session has distinct characteristics, liquidity conditions, and participant types. The high and low produced during each session are not arbitrary price levels — they represent where the dominant institutional participants of that session were willing to buy and sell.

When the London session opens and immediately breaks above the Asian session high, it is not just a technical level being crossed. It is a statement: the European institutional participants arriving at their desks are willing to buy at prices higher than the overnight consensus. That conviction produces follow-through — and that follow-through is what traders look to capture.

Session levels are foundational to the ICT (Inner Circle Trader) methodology and widely used in professional FX and index trading. They are particularly powerful because they are generated by the market's own activity during specific time windows, not by a mathematical formula applied to arbitrary lookbacks.

The three sessions and their personalities

Asian session (17:00–00:00 NY time)

The Asian session is the quietest of the three for most instruments. Tokyo, Singapore, and Hong Kong are the dominant trading centres. For FX pairs, JPY, AUD, and NZD see their highest activity. For US equity indices, participation is thin and the overnight moves are often modest.

The significance of the Asian session is not what happens during it — it is what happens after it. The Asian range represents a period of reduced participation and often produces a relatively narrow high-low range. This compressed range becomes a reference zone for what follows.

When London opens, one of the most common patterns in FX and index trading is an initial sweep of the Asian session high or low — a liquidity grab that takes out stop orders clustered above and below the overnight range — before committing to the true daily direction. Knowing where the Asian high and low are makes this behaviour visible and tradeable.

London session (02:00–08:30 NY time)

London is the world's largest FX trading centre and handles a significant proportion of daily index futures volume. The London open frequently produces the first substantial directional move of the calendar day. Volatility expands sharply as European participants begin their day.

Two things make the London session high and low important:

  1. They often define the day's range — especially in FX pairs, the London session frequently produces the high or low for the entire 24-hour period
  2. They become the reference for the New York session — whether New York confirms the London direction or reverses it is one of the most important intraday questions a trader can ask

New York session (09:30–16:00 NY time)

New York is the equity market's primary session. For US indices, the 09:30 open is the most-watched moment of the trading day. Volatility surges at the open, often followed by a defined trend or range for the rest of the session.

The New York session's relationship to the London range is key. Common patterns:

Why session levels act as support and resistance

Session highs and lows are not just price levels on a chart — they represent accumulated institutional activity at a specific level during a specific time window.

When the London session closes at its high, that high represents the maximum price that London participants were willing to pay. Orders to buy above that level either weren't filled or weren't placed. When the NY session later approaches that level, two things happen:

  1. Resting orders cluster there — stop losses from short positions placed during London sit just above the high; buy limit orders from traders who missed the London move sit just below it
  2. Participant attention focuses there — traders at all levels watch these levels, which creates self-fulfilling reactions

A clean breakout above the London high during the NY session removes the sell-side stop orders, attracts new momentum buyers, and often produces a quick directional run. A failure at the London high and reversal gives the opposite signal — the level held, and short-sellers who faded it have their conviction confirmed.

Trading the London breakout of the Asian range

The cleanest application of session levels is the London breakout of the Asian range. The setup logic:

  1. Asian range is established — track the high and low during the 17:00–00:00 period (NY time)
  2. London opens (02:00 NY time) — begin watching for a break of the Asian range
  3. Breakout signal — when London price crosses above the Asian high or below the Asian low with a confirmed close beyond the level, enter in the breakout direction
  4. Stop: the Asian high (for shorts) or Asian low (for longs) — a return inside the range invalidates the setup
  5. Target: minimum = the size of the Asian range projected from the breakout level; common target = prior day's high/low

This setup works best on FX pairs with significant Asian session participation (AUDUSD, GBPJPY, EURUSD) and on the session of the currency pair's home market.

Trading the NY session and the London range

For US equity indices, the London range breakout during the NY session is the equivalent setup. The NY open at 09:30 often:

An important refinement: compare the NY open price to the London range. If NY opens above the London high, the range has already been broken and the setup is different from an NY open that is still within the London range.

Using session levels with the code

The indicator uses `not na(time(timeframe.period, sessionString))` to detect whether each bar falls within a session. The `var` keyword persists the high and low values across bars so they continue plotting after the session ends.

The orange triangle markers at the bottom of the code represent one specific signal: NY breaking the London high or low. To adapt this to the Asian range breakout, change `londonHigh`/`londonLow` references to `asiaHigh`/`asiaLow` and update the `inNY` condition to `inLondon`.

Session highs and lows are most effective when used alongside other tools — VWAP for intraday bias, ATR for stop calibration, and the Opening Range Breakout for timing the entry precisely.

//@version=6
indicator("Session Highs & Lows", overlay=true)

// ── Session definitions (times in exchange/NY timezone) ───────────────
asiaTime   = input.session("1700-0000", "Asian Session")
londonTime = input.session("0200-0830", "London Session")
nyTime     = input.session("0930-1600", "New York Session")

showAsia   = input.bool(true,  "Show Asian Levels")
showLondon = input.bool(true,  "Show London Levels")
showNY     = input.bool(true,  "Show New York Levels")

// ── Session membership ─────────────────────────────────────────────────
inAsia   = not na(time(timeframe.period, asiaTime))
inLondon = not na(time(timeframe.period, londonTime))
inNY     = not na(time(timeframe.period, nyTime))

// ── Track each session's high and low ─────────────────────────────────
var float asiaHigh   = na
var float asiaLow    = na
var float londonHigh = na
var float londonLow  = na
var float nyHigh     = na
var float nyLow      = na

if inAsia and not inAsia[1]
    asiaHigh := high
    asiaLow  := low
else if inAsia
    asiaHigh := math.max(asiaHigh, high)
    asiaLow  := math.min(asiaLow,  low)

if inLondon and not inLondon[1]
    londonHigh := high
    londonLow  := low
else if inLondon
    londonHigh := math.max(londonHigh, high)
    londonLow  := math.min(londonLow,  low)

if inNY and not inNY[1]
    nyHigh := high
    nyLow  := low
else if inNY
    nyHigh := math.max(nyHigh, high)
    nyLow  := math.min(nyLow,  low)

// ── Plot persistent session levels ────────────────────────────────────
plot(showAsia   ? asiaHigh   : na, "Asia High",
     color=color.new(color.blue,   20), linewidth=1, style=plot.style_linebr)
plot(showAsia   ? asiaLow    : na, "Asia Low",
     color=color.new(color.blue,   20), linewidth=1, style=plot.style_linebr)
plot(showLondon ? londonHigh : na, "London High",
     color=color.new(color.purple, 20), linewidth=1, style=plot.style_linebr)
plot(showLondon ? londonLow  : na, "London Low",
     color=color.new(color.purple, 20), linewidth=1, style=plot.style_linebr)
plot(showNY     ? nyHigh     : na, "NY High",
     color=color.new(color.orange, 20), linewidth=1, style=plot.style_linebr)
plot(showNY     ? nyLow      : na, "NY Low",
     color=color.new(color.orange, 20), linewidth=1, style=plot.style_linebr)

// ── Session background shading ────────────────────────────────────────
bgcolor(inAsia   ? color.new(color.blue,   95) : na, title="Asian Session")
bgcolor(inLondon ? color.new(color.purple, 95) : na, title="London Session")
bgcolor(inNY     ? color.new(color.orange, 95) : na, title="New York Session")

// ── NY session breakout of London range (example signal) ─────────────
nyBreaksLondonHigh = inNY and ta.crossover(close, londonHigh)
nyBreaksLondonLow  = inNY and ta.crossunder(close, londonLow)

plotshape(nyBreaksLondonHigh, style=shape.triangleup,
          location=location.belowbar, color=color.orange,
          size=size.tiny, title="NY Breaks London High")
plotshape(nyBreaksLondonLow,  style=shape.triangledown,
          location=location.abovebar, color=color.orange,
          size=size.tiny, title="NY Breaks London Low")