The rules at a glance
- Market: EURUSD on the 5-minute chart
- Liquidity: the high and low from 8 to 10 a.m. New York time
- Window: 10 to 11 a.m. New York time (19:30 to 20:30 IST in summer, 20:30 to 21:30 in winter)
- Setup: the price sweeps one side of that range, then leaves a fair value gap in the other direction (a short after a sweep of the high, a long after a sweep of the low)
- Entry: a limit order at the gap's near edge; cancelled at 11 a.m. if it hasn't filled
- Stop loss: 0.1 ATR beyond the sweep's extreme; skip the trade if that's more than 4 ATR from the entry
- Target: twice the risk (2R); one trade a day, closed by noon New York time
What the Silver Bullet is
The Silver Bullet was popularised by Michael J. Huddleston, who teaches as ICT. It's built on three ideas covered elsewhere on this site: liquidity sweeps (stops resting above a high or below a low get taken out), fair value gaps (a fast move leaves a three-candle gap) and kill zones (specific hours when these moves happen more often). The Silver Bullet combines them inside a single hour.
| Silver Bullet window | New York time | IST, US summer time | IST, US winter time |
|---|---|---|---|
| London | 03:00–04:00 | 12:30–13:30 | 13:30–14:30 |
| New York morning (used here) | 10:00–11:00 | 19:30–20:30 | 20:30–21:30 |
| New York afternoon | 14:00–15:00 | 23:30–00:30 | 00:30–01:30 |
The windows follow New York's clock. US clocks go back on 1 November 2026; from then on, use the winter column. To use another window in the script, change four settings together: the liquidity range, the window, the window-end hour and the close hour. For London that's 01:00–03:00, 03:00–04:00, 4 and 5; for the afternoon, 12:00–14:00, 14:00–15:00, 15 and 16.
How this page turns it into rules
ICT teaching leaves a lot to judgement: which liquidity, how big a gap, where to aim. A script can't use judgement, so these rules pick one simple version:
- The liquidity is the high and low of the two hours before the window, 8 to 10 a.m. New York time.
- The sweep is any trade above that high (or below that low) inside the window.
- The gap must form after the sweep, point the other way, and be at least 0.2 × ATR tall.
- The entry is a limit order at the gap's near edge, so you only get in if the price comes back into it.
Other versions use the previous day's high and low or the overnight range as the liquidity, or aim for the opposite liquidity rather than a fixed 2R. Those are worth testing as variations.
The rules, step by step
1. Mark the morning range
On a 5-minute EURUSD chart, mark the high and low from 8 to 10 a.m. New York time.
2. Wait for the sweep in the window
Between 10 and 11 a.m., wait for the price to trade above the high (or below the low).
3. Look for the gap the other way
After a sweep of the high, look for a bearish fair value gap: the third candle's high below the first candle's low, with a bearish middle candle. Place a sell limit at the gap's lower edge.
4. Stop above the sweep, target 2R
The stop goes a tenth of an ATR above the highest price of the sweep; if that's more than 4 ATR from the entry, skip the trade. The target is twice the risk. If the order hasn't filled by 11 a.m., cancel it. Anything open at noon is closed.
Worked example: EURUSD, 5-minute chart
From 8 to 10 a.m. EURUSD trades between 1.1671 and 1.1702. Just after 10 o'clock it pushes up to 1.1706, through the morning high, and then drops hard. The candle that opens at 10:25 completes a bearish gap from 1.1693 to 1.1699. The sell limit goes at 1.1693, and the stop just above the sweep, at 1.17066.
| EURUSD short | |
|---|---|
| Entry (sell limit at the gap's lower edge) | 1.1693 |
| Stop loss | 1.17066, 13.6 pips away |
| Target (2R) | 1.16658, 27.2 pips away |
| Lot size at 1% of $10,000 | $100 ÷ (13.6 pips × $10) = 0.735, rounded down to 0.73 lots |
| Loss if the stop is hit | $99.28 |
| Profit at the target | $198.56 |
The price bounces back into the gap and fills the order at 10:35, then falls through the morning low to the target by 11:15. The target sits just below the morning low, which ICT traders would call the opposite liquidity. On many days no gap forms after the sweep, or the order never fills; then there's no trade.
Risk management
- Size from the stop. Silver Bullet stops on EURUSD are usually 8 to 20 pips.
- One window, one trade. If it fails, don't hunt for a second setup in the same hour.
- 10 a.m. data. Some US releases come out at the start of the window and can create the sweep and the gap in one candle. Check the calendar and decide in advance whether you trade those days.
Common mistakes
- Taking any gap in the window. The gap has to come after a sweep and point the other way.
- Chasing the move. The entry is the limit at the gap; if the price never comes back, there's no trade.
- Using the wrong clock. The window is New York time. In India it shifts by an hour on 1 November 2026.
- Assuming the name means it works. Test the rules on your pair, with your costs, before trusting them.
Backtest it yourself on TradingView
This page doesn't quote a win rate or a profit figure, and you should be wary of anyone who does without showing the test. Results change with the market, the dates, the data feed and the costs you put in. The honest way is to run the test yourself, and the free script below does the work in a couple of minutes.
- Open the chart. On TradingView, open EURUSD on the 5-minute chart.
- Add the script. Open the Pine Editor from the Pine icon in the panel on the right of the chart (older layouts have it as a tab under the chart), delete the code that's already there, paste this strategy's code and click "Add to chart".
- Put in your costs. Open the strategy's settings and go to Properties. Enter your broker's commission and a little slippage. A test without costs flatters every strategy, and short-term ones most of all.
- Read the Strategy Tester. The panel under the chart shows the net profit, the maximum drawdown, the profit factor, the number of trades and a list of every trade. Click a few trades and check on the chart that each one follows the rules. Trade sizes are shown in units rather than lots: 100,000 units is one lot of a forex pair, and 100 ounces is one lot of gold.
- Change one setting at a time. Compare the three windows, the liquidity range (8 to 10 a.m. against the previous day's high and low), the minimum gap size, the entry at the gap's edge against its middle, and the 2R target against 1.5R and 3R.
As a rough guide, don't trust a result with fewer than 100 trades, a profit factor under 1 once costs are in, or a drawdown you couldn't sit through with real money. Settings tuned to look good on one stretch of history often fail on the next, so check the same settings on dates you didn't tune them on, then demo trade the strategy for a few weeks. How much history you can test depends on your TradingView plan: the free plan loads 5,000 candles, which is a few months of 15-minute candles but years of daily ones.
The script sizes each trade from the stop loss and your risk percentage, starts with $10,000 and assumes 1:100 leverage (a 1% margin setting), so the tester doesn't flag margin calls on normal forex trade sizes. Change these under Properties to match your account. By default TradingView fills orders at the open of the candle after the signal, so the fill can differ a little from the signal candle's close.
Download the free Pine Script and PDF
The script is written in Pine Script version 6 for this guide and follows the rules above. It can't read the economic calendar, so skipping news days is up to you. It's free to use, change and share. The PDF is a one-page cheat sheet with the three windows in IST, the rules, a worked example and a checklist, to keep next to your chart.
Show the code (Pine Script v6, 99 lines)
//@version=6
// ICT Silver Bullet strategy by PipLedger (https://pipledgerfx.com/ict-silver-bullet-strategy)
// Marks the high and low from 8 to 10 a.m. New York time. In the 10 to 11 a.m. window, waits for the price to sweep one side, then for a fair value gap in the other direction, and places a limit order at the gap's near edge.
// Free to use and change. For education and backtesting only; not financial advice.
strategy("PipLedger: ICT Silver Bullet", shorttitle="Silver Bullet", overlay=true, initial_capital=10000, pyramiding=0, default_qty_type=strategy.fixed, default_qty_value=1, margin_long=1, margin_short=1, currency=currency.USD)
// ---------- Inputs
tz = input.string("America/New_York", "Session time zone")
liqSess = input.session("0800-1000", "Liquidity range: highs and lows to be swept (New York time)")
window = input.session("1000-1100", "Silver Bullet window (New York time)")
winEndH = input.int(11, "Window ends at (hour, New York time): unfilled orders are cancelled", minval=0, maxval=23)
closeHour = input.int(12, "Close any open trade at (hour, New York time)", minval=1, maxval=23)
minGap = input.float(0.2, "Minimum gap size (x ATR 14)", minval=0.0, step=0.05)
stopBuf = input.float(0.1, "Stop buffer beyond the sweep (x ATR)", minval=0.0, step=0.05)
maxStopAtr = input.float(4.0, "Skip if the stop is further than (x ATR)", minval=0.5, step=0.25)
rr = input.float(2.0, "Target (R multiple)", minval=0.5, step=0.25)
riskPct = input.float(1.0, "Risk per trade (% of equity)", minval=0.1, maxval=5.0, step=0.1)
// ---------- Helpers
fx = strategy.convert_to_account(1.0) // one unit of the chart's quote currency in account currency (1 on USD-quoted charts)
calcQty(float entry, float stop) =>
float dist = math.abs(entry - stop)
dist > 0 and not na(fx) ? strategy.equity * riskPct / 100 / (dist * syminfo.pointvalue * fx) : 0.0
atr = ta.atr(14)
inLiq = not na(time(timeframe.period, liqSess, tz))
inWin = not na(time(timeframe.period, window, tz))
winEndT = timestamp(tz, year(time, tz), month(time, tz), dayofmonth(time, tz), winEndH, 0)
cutoff = timestamp(tz, year(time, tz), month(time, tz), dayofmonth(time, tz), closeHour, 0)
bullGap = low > high[2] and close[1] > open[1] and low - high[2] >= minGap * atr
bearGap = high < low[2] and close[1] < open[1] and low[2] - high >= minGap * atr
// ---------- Liquidity range, sweeps and the waiting order
var float lHi = na
var float lLo = na
var float sweepH = na // highest price reached above the range high in the window
var float sweepL = na // lowest price reached below the range low in the window
var bool done = false
var int pend = 0 // 1 = a buy limit waits, -1 = a sell limit waits
if inLiq and not inLiq[1]
lHi := high
lLo := low
sweepH := na
sweepL := na
done := false
else if inLiq
lHi := math.max(lHi, high)
lLo := math.min(lLo, low)
if inWin and not na(lHi)
if high > lHi
sweepH := na(sweepH) ? high : math.max(sweepH, high)
if low < lLo
sweepL := na(sweepL) ? low : math.min(sweepL, low)
flat = strategy.position_size == 0
if not flat
pend := 0
// the window has ended without a fill: cancel the order (the candle that closes at the window end sends the cancel)
if pend != 0 and time_close >= winEndT
strategy.cancel("Long")
strategy.cancel("Short")
pend := 0
// a sweep of the high, then a bearish gap: sell at the gap's lower edge, stop above the sweep
newShort = inWin and flat and not done and not na(sweepH) and bearGap and time_close < winEndT and time_close < cutoff
newLong = inWin and flat and not done and not na(sweepL) and bullGap and not newShort and time_close < winEndT and time_close < cutoff
if newShort
float px = high // near edge of the bearish gap (the third candle's high)
float sl = sweepH + stopBuf * atr
float q = calcQty(px, sl)
if q > 0 and sl - px <= maxStopAtr * atr
strategy.entry("Short", strategy.short, qty=q, limit=px)
strategy.exit("Short exit", "Short", stop=sl, limit=px - (sl - px) * rr)
pend := -1
done := true
if newLong
float px = low // near edge of the bullish gap (the third candle's low)
float sl = sweepL - stopBuf * atr
float q = calcQty(px, sl)
if q > 0 and px - sl <= maxStopAtr * atr
strategy.entry("Long", strategy.long, qty=q, limit=px)
strategy.exit("Long exit", "Long", stop=sl, limit=px + (px - sl) * rr)
pend := 1
done := true
// the candle that closes at the cut-off sends the order, so it fills at the cut-off time
if strategy.position_size != 0 and time_close >= cutoff
strategy.close_all(comment="New York cut-off")
// ---------- Chart
plot(lHi, "Liquidity high", color=color.new(color.red, 30), style=plot.style_linebr)
plot(lLo, "Liquidity low", color=color.new(color.teal, 30), style=plot.style_linebr)
bgcolor(inWin ? color.new(color.blue, 92) : na, title="Silver Bullet window")
plotshape(newShort, "Sweep of the high + bearish gap", shape.triangledown, location.abovebar, color.red, size=size.small)
plotshape(newLong, "Sweep of the low + bullish gap", shape.triangleup, location.belowbar, color.teal, size=size.small)Trading this from India
Residents can trade EURUSD, GBPUSD and USDJPY futures and options on NSE and BSE through a SEBI-registered broker. The contracts are quoted the same way as the spot pair, one lot is 1,000 units of the base currency, and they're cash-settled in rupees. They trade only from 9 a.m. to 7:30 p.m. IST, volumes are thin and not every broker offers them, so check the hours and the spread first. The 10 a.m. window starts at 7:30 p.m. IST in US summer, just as the NSE and BSE contracts close, and at 8:30 p.m. in winter, so it can't be traded on an Indian exchange. The 3 to 4 a.m. London window, 12:30 to 13:30 IST in summer and 13:30 to 14:30 in winter, does fall inside exchange hours, though volumes there are thin. Trading forex or CFDs with offshore online platforms isn't allowed for residents under FEMA, even if the app is easy to download. Details are in is forex trading legal in India.
Related strategies: liquidity sweep, fair value gap, order block, BOS and CHoCH, ICT kill zones, XAUUSD FVG + order block, Turtle Soup. All 40 strategies are compared on one page in forex trading strategies.