What it does
Kill zones are short time windows when a session's heaviest activity tends to begin. Traders who use smart money concepts often focus on them. This indicator shades up to four configurable windows on the chart, all written in New York time, and can draw each window's high and low. Those lines keep running to the right until price trades through them, so you can see which levels are still untouched.
How it works
- Every window is a session string in the America/New_York time zone, so the shading follows daylight-saving changes on its own. The defaults are Asia 20:00 to 00:00, London open 02:00 to 05:00, New York open 07:00 to 10:00 and London close 10:00 to 12:00 (off by default).
- A candle is inside a window when its opening time falls in that window. Those candles get a background color.
- On the first candle of a window, two lines start at its high and low. They update while the window runs, so they always mark the window's highest high and lowest low.
- After the window ends, each line keeps extending to the right. Once a later candle trades beyond it, the line stops and turns dotted, showing that the level has been taken.
- Each window keeps a set number of past line pairs; older lines are deleted.
How to use it
- Use the windows to decide when to pay attention, not what to do. Many traders only look for setups inside the London and New York windows and stay flat outside them.
- The Asia window's high and low are popular reference levels for the London session. A run above or below them early in London is something to watch, not a signal by itself.
- Untouched (solid) lines show levels price has not revisited yet. Dotted lines have already been traded through.
- Works best on M1 to M15. Higher timeframes are too coarse for windows that last only a few hours. For the wider session picture see forex sessions.
Alerts fire at the start of each window.
Settings
| Input | Default | What it changes |
|---|---|---|
| Asia | On, 2000-0000 | Asia window and color |
| London open | On, 0200-0500 | London window and color |
| New York open | On, 0700-1000 | New York window and color |
| London close | Off, 1000-1200 | Optional fourth window |
| Background transparency | 88 | Shading strength |
| Draw kill-zone high / low | On | Range lines |
| Extend high / low until traded through | On | Line extension |
| Kill zones kept per window | 10 | Number of past line pairs |
Limitations
The windows are a teaching convention, not market rules, and different educators use slightly different times, so adjust them to your own approach. Candles are assigned to a window by their open time, so on M30 or H1 the shading is approximate. A window being active does not mean price will move. Quiet days, holidays and news outside the windows all happen often.
Pine Script source
In TradingView open Pine Editor, paste the code, click Save and then Add to chart.
FXP_Killzones.pine
93 lines
// © FXPIPS ONLINE — https://fxpips.online/tradingview-indicators/ict-killzones/
// License: MIT. Educational tool — not financial advice. Trading involves substantial risk.
//@version=6
// Shades configurable "kill-zone" windows defined in New York time (daylight saving is
// handled automatically) and optionally draws each window's high and low, extending the
// lines until price trades through them.
indicator("FXP Killzones", shorttitle = "FXP Killzones", overlay = true, max_lines_count = 500)
NY_TZ = "America/New_York"
// ── Inputs ─────────────────────────────────────────────────────────────
grpZ = "Kill zones (New York time)"
showA = input.bool(true, "Asia", inline = "a", group = grpZ)
sessA = input.session("2000-0000", "", inline = "a", group = grpZ)
colA = input.color(#f9a825, "", inline = "a", group = grpZ)
showL = input.bool(true, "London open", inline = "l", group = grpZ)
sessL = input.session("0200-0500", "", inline = "l", group = grpZ)
colL = input.color(#2962ff, "", inline = "l", group = grpZ)
showN = input.bool(true, "New York open", inline = "n", group = grpZ)
sessN = input.session("0700-1000", "", inline = "n", group = grpZ)
colN = input.color(#e91e63, "", inline = "n", group = grpZ)
showC = input.bool(false, "London close", inline = "c", group = grpZ)
sessC = input.session("1000-1200", "", inline = "c", group = grpZ)
colC = input.color(#7e57c2, "", inline = "c", group = grpZ)
grpD = "Display"
bgTransp = input.int(88, "Background transparency", minval = 0, maxval = 100, group = grpD)
showLines = input.bool(true, "Draw kill-zone high / low", group = grpD)
extendLn = input.bool(true, "Extend high / low until traded through", group = grpD)
keepCount = input.int(10, "Kill zones kept per window", minval = 1, maxval = 100, group = grpD)
// ── Kill-zone engine ───────────────────────────────────────────────────
killzone(string sess, color col, bool show) =>
bool inZone = show and timeframe.isintraday and not na(time(timeframe.period, sess, NY_TZ))
bool started = inZone and not inZone[1]
var float hi = na
var float lo = na
var line hiLn = na
var line loLn = na
var bool hiLive = false
var bool loLive = false
var array<line> hist = array.new<line>()
if started
hi := high
lo := low
hiLive := true
loLive := true
if showLines
hiLn := line.new(bar_index, high, bar_index, high, color = col, width = 1)
loLn := line.new(bar_index, low, bar_index, low, color = col, width = 1)
hist.push(hiLn)
hist.push(loLn)
while hist.size() > keepCount * 2
line.delete(hist.shift())
else if inZone
hi := math.max(hi, high)
lo := math.min(lo, low)
if showLines and not na(hiLn)
hiLn.set_y1(hi)
hiLn.set_y2(hi)
hiLn.set_x2(bar_index)
loLn.set_y1(lo)
loLn.set_y2(lo)
loLn.set_x2(bar_index)
else if showLines and extendLn and not na(hiLn)
if hiLive
hiLn.set_x2(bar_index)
if high > hi
hiLive := false
hiLn.set_style(line.style_dotted)
if loLive
loLn.set_x2(bar_index)
if low < lo
loLive := false
loLn.set_style(line.style_dotted)
[inZone, started]
[inA, startA] = killzone(sessA, colA, showA)
[inL, startL] = killzone(sessL, colL, showL)
[inN, startN] = killzone(sessN, colN, showN)
[inC, startC] = killzone(sessC, colC, showC)
bgcolor(inA ? color.new(colA, bgTransp) : na, title = "Asia kill zone")
bgcolor(inL ? color.new(colL, bgTransp) : na, title = "London open kill zone")
bgcolor(inN ? color.new(colN, bgTransp) : na, title = "New York open kill zone")
bgcolor(inC ? color.new(colC, bgTransp) : na, title = "London close kill zone")
// ── Alerts ─────────────────────────────────────────────────────────────
alertcondition(startA, "Asia kill zone start", "{{ticker}}: Asia kill zone started")
alertcondition(startL, "London open kill zone start", "{{ticker}}: London open kill zone started")
alertcondition(startN, "New York open kill zone start", "{{ticker}}: New York open kill zone started")
alertcondition(startC, "London close kill zone start", "{{ticker}}: London close kill zone started")

