◆ New — Strategy Validator, Code Fixer & Prop Compliance Checker are live. Try one free →
Home / Indicators / ICT Killzones
Session & Time indicator

ICT Killzones

Fixed time-of-day windows from the ICT methodology, plotted as chart highlights — defined precisely, endorsed by evidence nowhere.

Illustrative diagram — not live market data.

What it is

ICT killzones are fixed time-of-day windows popularized by the Inner Circle Trader (ICT) methodology, marking periods when forex and index-futures activity has historically clustered around major session opens. The commonly cited windows, stated in New York time, are: the Asian killzone (roughly 8:00 p.m.–12:00 a.m.), the London killzone (2:00–5:00 a.m.), the New York AM killzone (roughly 8:30–11:00 a.m., with some sources using 7:00–10:00 a.m.), and the London close killzone (10:00 a.m.–12:00 p.m.). Definitions vary between sources and even between different ICT materials, so any implementation should state its exact times. Plotting them is a pure session-handling exercise: define each window as a session string in an IANA time zone and shade the bars that fall inside it. Two honest points frame this page. First, it is true and well documented that trading volume and volatility are not uniform across the day — activity does concentrate around session opens. Second, there is no published, peer-reviewed evidence that the specific killzone windows carry a tradeable edge; the claim rests on the methodology's own materials. We document the times because people search for them, not because we endorse them. Educational content only, not financial advice; trading involves risk of loss.

How it works

Mechanically, a killzone indicator is a set of session-membership tests. Each window is expressed as a session string (for example "0830-1100") evaluated against a named time zone with time(timeframe.period, session, timezone); a bar is 'inside the killzone' when that call returns a non-na value. The implementation detail that separates correct scripts from silently wrong ones is the time zone: killzones are defined in New York local time, which observes daylight saving. A script anchored to "America/New_York" tracks the intended windows year-round, while one hardcoded to a fixed UTC offset drifts an hour off every time DST changes — and because London and New York change DST on different dates, a UTC-anchored London killzone is wrong for several weeks each year even relative to a UTC-anchored New York one. There is no calculation beyond membership testing: killzones do not transform price at all. They are annotation, not measurement. Any analytical claims attached to them (that liquidity is 'engineered' during these windows, or that specific setups occur there) are separate assertions from the windows themselves and should be evaluated on evidence, which the public record currently does not supply. What the plotted windows genuinely give you is a consistent visual partition of the day for studying how your instrument behaves at different times.

How traders read it

Common settings

Windows stated in New York time ("America/New_York"): Asian 20:00–00:00, London 02:00–05:00, New York AM 08:30–11:00 (some sources 07:00–10:00), London close 10:00–12:00. Because sources disagree, expose every window as an input.session parameter rather than hardcoding it. Killzones are intraday annotations, typically used on charts of 15 minutes and below; on higher timeframes the windows cover too few bars to display meaningfully.

Strengths

Pitfalls to watch

Pine v6 example

//@version=6
indicator("ICT Killzones", overlay = true)

tz     = input.string("America/New_York", "Timezone (IANA)")
asian  = input.session("2000-0000", "Asian Killzone")
london = input.session("0200-0500", "London Killzone")
nyAm   = input.session("0830-1100", "New York AM Killzone")
ldnCls = input.session("1000-1200", "London Close Killzone")

// IANA zone handles US daylight saving; fixed UTC offsets do not
inAsian  = not na(time(timeframe.period, asian,  tz))
inLondon = not na(time(timeframe.period, london, tz))
inNyAm   = not na(time(timeframe.period, nyAm,   tz))
inLdnCls = not na(time(timeframe.period, ldnCls, tz))

bgcolor(inAsian  ? color.new(color.purple, 88) : na, title = "Asian")
bgcolor(inLondon ? color.new(color.teal,   88) : na, title = "London")
bgcolor(inNyAm   ? color.new(color.orange, 88) : na, title = "NY AM")
bgcolor(inLdnCls ? color.new(color.gray,   88) : na, title = "London Close")

Pro tip: If you want to know whether killzones matter for your instrument, measure instead of believing: log, over several hundred sessions, how often the daily high or low forms inside each window and compare that to the share of the day the window covers. A window covering 12% of the day that contains the daily extreme 12% of the time is doing nothing. Keep the time zone set to "America/New_York" so DST cannot silently shift your windows mid-study. This is educational material only, not financial advice or an endorsement of any methodology — trading involves risk of loss.

Built an indicator from this? Run it through the Validator to catch look-ahead bias and repainting, or convert a strategy to Pine Script.

Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.

Catch the bug that compiles.Run auditGet Pro