Strategies we backtested ICT Silver Bullet

Tested by BacktestingMax

ICT Silver Bullet backtest on NQ and ES futures

Does the ICT Silver Bullet strategy work on NQ and ES?

No. In our backtest, the ICT Silver Bullet with our standard rules lost money in all 10 tests, after trading costs. The Silver Bullet is an ICT (The Inner Circle Trader) day-trading setup for three one-hour windows a day, New York time. After price goes just past a recent high or low and turns back (a sweep), the trader enters at a fair value gap, a price gap left by a fast candle. We tested it from 2020 to 2025 on 1-minute and 5-minute charts of NQ and ES (as the micros MNQ and MES), the Dow (YM), the Russell 2000 (RTY) and gold (MGC). Each trade risked 1% of the account, which started at $50,000. On 1-minute charts, the MNQ and MES trades made money before costs, but their costs, mostly commission (the broker's fee), were bigger. On 5-minute charts, 4 of the 5 markets lost money even before costs. We also tried four common changes. Only one of those tests made money in both 2020–2023 and 2024–2025 with at least 100 trades: gold on 5-minute charts. The change behind it, an entry in the middle of the gap, lost money in the other 9 tests.

10 backtests 2020–2025 Trading costs included Tested 19 October 2026

Where it worked 10 backtests
Made money
0
of 10 tests, with the standard rules
Made money in both periods
0
2020–2023 and again 2024–2025
Best backtest
−2%
MGC (Micro Gold), 5-minute chart: account growth 2020–2025
With the 1-hour trend
0
tests made money in both periods, compared with 0 with the standard rules

Lost money on every market

  • 1-minute charts
  • 5-minute charts

The results

Results on every market

Each box shows one backtest of the ICT Silver Bullet with the standard rules, from 2020 to 2025, after trading costs: the % result, and a small chart of the account balance. The solid line is the account balance and the dashed line is the starting balance. Green results made money; red results lost money. Under each result: whether it made money in both 2020–2023 and 2024–2025, or passed all four of our checks (see "How a test passes" further down).

Market 1-minute 5-minute
MNQ (Micro Nasdaq 100) −32% Lost money −26% Lost money
MES (Micro S&P 500) −56% Lost money −18% Lost money
YM (Dow futures) −60% Lost money −17% Lost money
RTY (Russell 2000 futures) −71% Lost money −18% Lost money
MGC (Micro Gold) −86% Lost money −2% Lost money
All the numbers, test by test
Market Chart Trades Win rate Profit factor Result Max drawdown 2020–2023 2024–2025 Monte Carlo drawdown Trading costs
MNQ (Micro Nasdaq 100) 1-minute 1,323 25.4% 0.96 −32.1% −59.2% −12.3% −22.6% −73.1% $33,397
MNQ (Micro Nasdaq 100) 5-minute 206 31.6% 0.74 −26.2% −34.4% −23.0% −4.1% −38.7% $2,761
MES (Micro S&P 500) 1-minute 1,176 25.2% 0.91 −56.0% −60.5% −36.6% −30.6% −79.5% $44,775
MES (Micro S&P 500) 5-minute 187 35.8% 0.82 −18.1% −24.4% −15.1% −3.6% −32.7% $6,197
YM (Dow futures) 1-minute 1,188 23.7% 0.88 −59.5% −67.8% −54.7% −10.7% −76.9% $22,970
YM (Dow futures) 5-minute 196 37.2% 0.80 −17.1% −28.9% −20.2% +3.9% −29.1% $3,185
RTY (Russell 2000 futures) 1-minute 1,154 22.5% 0.84 −70.5% −72.9% −59.7% −27.0% −82.4% $23,530
RTY (Russell 2000 futures) 5-minute 192 33.3% 0.79 −17.7% −27.4% −24.8% +9.4% −29.7% $3,183
MGC (Micro Gold) 1-minute 1,024 26.3% 0.81 −85.5% −87.6% −61.2% −62.6% −89.5% $36,697
MGC (Micro Gold) 5-minute 184 40.8% 0.98 −1.6% −23.2% −11.1% +10.7% −24.3% $6,783

Profit factor is the money won divided by the money lost. Above 1 means the test made money. Max drawdown is the biggest fall from the highest balance. 2020–2023 and 2024–2025 show the result in each period on its own. Monte Carlo drawdown: we shuffled the trades into a random order 1,000 times; in 95% of those runs, the worst drawdown was this number or less. Result is the change in the account, with the risk of each trade set to 1% of the account at that time.

The account balance

The best test and the middle test

Best test MGC (Micro Gold), 5-minute chart −1.6% from 2020 to 2025
Middle test (median): half of the 10 did better, half did worse MNQ (Micro Nasdaq 100), 5-minute chart −26.2% from 2020 to 2025

What we found

What the 10 backtests show

  1. All 10 tests lost money from 2020 to 2025, after trading costs. The 1-minute tests lost 32.1% to 85.5% of the $50,000 starting account, and the 5-minute tests lost 1.6% to 26.2%. We also check the older years (2020–2023) and the newer years (2024–2025) on their own: none of the 10 tests made money in 2020–2023. In 2024–2025 alone, 3 tests made money, all on 5-minute charts: gold (+10.7% of the account in those two years), the Russell 2000 (+9.4%) and the Dow (+3.9%). So the losses did not come from one bad year: with the trades of all 10 tests added together, every year from 2020 to 2025 lost money.

  2. On 1-minute charts, the commission on each contract added up. The stop-loss was small, so each contract risked little money, and on the micro contracts a typical 1% risk took 14 to 18 of them. Every contract paid commission when the trade opened and again when it closed ($0.62 each time on the micros). On MNQ, the typical stop-loss (the median: half were smaller, half were bigger) was 14 index points, and a typical trade used 14 micro contracts. On MES, it was 3.5 points and 18 contracts. On gold, it was a $1.50 move in the gold price and 17 contracts. So trading costs took 6.1% of the money each 1-minute trade risked on MNQ, 11.4% on MES and 12.1% on gold, on average. The 1-minute MNQ trades made $17,332 before costs from 2020 to 2025 but paid $33,397 in trading costs, so the MNQ account lost 32.1%. The 1-minute MES trades made $16,772 but paid $44,775, so the MES account lost 56.0% (see the table below).

  3. On 5-minute charts, costs were not the main problem: the trades lost money even before costs on 4 of the 5 markets. Only gold made money before costs ($5,998), and its trading costs ($6,783) were a little more, so the gold test still lost 1.6%. The 5-minute tests also had far fewer trades: 31 to 34 a year on each market, about 1 window in 24, compared with 171 to 220 a year (about 1 window in 4) on 1-minute charts. With fewer trades, the 5-minute results are also less certain.

  4. Most trades hit the stop-loss: 4,841 out of 6,830 trades in the 10 tests (70.9%). 60% of these trades hit the stop-loss within 15 minutes of the entry. R is what one trade risks: the distance from the entry to the stop-loss, which is about 1% of the account in money. The take-profit, the next recent high or low, was usually far away: a median of 5.7R from the entry on 1-minute charts and 3.2R on 5-minute charts. Only 597 trades (8.7%) reached it. The others were still open at the time exit, 1 hour after the window ended, and closed then (see 'How the trades ended' below).

  5. We also ran each of the three windows on its own, on the same 5 markets, each on 1-minute and 5-minute charts (see the table below). Many traders trade only the morning window, 10:00 to 11:00 New York time, but it lost the most per trade. With only the morning window, 1 of the 10 tests made money from 2020 to 2025, and the average trade lost 0.099R. With only the afternoon window, 14:00 to 15:00, the average trade lost 0.024R, the smallest loss of the three, and 2 tests made money. With only the London window, 03:00 to 04:00, the average trade lost 0.078R, but 3 tests made money, the most of the three.

Trading costs

On 1-minute charts, no market made enough before costs to pay its trading costs

Each row is one backtest with our standard rules, from 2020 to 2025, on a $50,000 account. MNQ and MES are the micro Nasdaq 100 and S&P 500 contracts, YM and RTY are the standard Dow and Russell 2000 contracts, and MGC is micro gold. 'Costs per trade' is the trading costs of one trade as a % of the money that trade risked, on average. Trading costs are commission, plus half a tick of spread on exits at the stop-loss or at the time exit (a trade still open 1 hour after its window ends is closed). 'Made before costs' is what the trades made before those costs.

Market Chart Trades Costs per trade Made before costs Trading costs Account result after costs
MNQ 1-minute 1,323 6.1% $17,332 $33,397 −32.1%
MNQ 5-minute 206 3.3% −$10,324 $2,761 −26.2%
MES 1-minute 1,176 11.4% $16,772 $44,775 −56.0%
MES 5-minute 187 7.5% −$2,860 $6,197 −18.1%
YM 1-minute 1,188 6.0% −$6,805 $22,970 −59.5%
YM 5-minute 196 3.7% −$5,380 $3,185 −17.1%
RTY 1-minute 1,154 7.3% −$11,740 $23,530 −70.5%
RTY 5-minute 192 3.9% −$5,685 $3,182 −17.7%
MGC 1-minute 1,024 12.1% −$6,047 $36,697 −85.5%
MGC 5-minute 184 7.7% $5,998 $6,783 −1.6%

Every trade risked about 1% of the account at that time, so the dollar amounts grow and shrink with the account. A negative 'made before costs' means the trades lost money even before costs.

The three windows

The morning window lost the most per trade, and the afternoon window lost the least

We also ran the Silver Bullet in one window at a time, with our standard rules, on the same 5 markets, each on 1-minute and 5-minute charts, from 2020 to 2025. Each row adds up the 10 tests of one window. Win rate is the share of trades that made money. R is the money one trade risks, about 1% of the account. The average trade is after trading costs.

Window (New York time) Tests that made money, 2020–2025 Tests that made money in 2020–2023 and in 2024–2025 Trades Win rate Average trade
03:00 to 04:00 (London) 3 of 10 0 2,471 27.1% −0.078R
10:00 to 11:00 (morning) 1 of 10 0 2,566 26.2% −0.099R
14:00 to 15:00 (afternoon) 2 of 10 1 1,967 25.7% −0.024R

With only the afternoon window, one test made money in both 2020–2023 and 2024–2025: MNQ on 1-minute charts, +2.1% of the account in 2020–2023 and +7.5% in 2024–2025, so +9.7% over the whole test (the 2024–2025 gain was made on a bigger balance). On MNQ 1-minute charts, the London window made 15.3% of the account over the whole test, but it lost 3.6% in 2020–2023, and the morning window lost 46.9%. On 5-minute charts, each window had only 47 to 79 trades per test, so those results are less certain. On YM, RTY and gold, a trade is skipped when even 1 contract would risk more than 1% of the account. That happened more often in the standard tests, whose accounts had fallen further, so the three windows run on their own have 174 more trades in total (7,004) than the standard tests (6,830).

How the trades ended

7 trades in 10 hit the stop-loss, and fewer than 1 in 10 reached the take-profit

These are all 6,830 trades of the 10 tests with our standard rules, from 2020 to 2025. R is the money one trade risks, about 1% of the account. The results are after trading costs.

Hit the stop-loss
70.9%
4,841 trades. On average they lost 0.97R, costs included: sizes are rounded down to whole contracts, so many trades risked a little less than 1%. 60% of these trades closed within 15 minutes of the entry.
Reached the take-profit
8.7%
597 trades. On average they made +3.60R.
Still open at the time exit
20.4%
1,392 trades, closed 1 hour after the window ended. On average they made +1.45R, and 85.4% of them were in profit.

The take-profit is the next recent high or low that price has not gone past yet. With a fixed 2R take-profit instead (see 'Can the ICT Silver Bullet be improved?' below), 30.1% of the trades reached it.

The strategy

What the ICT Silver Bullet is

The Silver Bullet is a day-trading setup from ICT (The Inner Circle Trader, the online name of the trading teacher Michael Huddleston). Traders use it only in three one-hour windows, New York time: 03:00 to 04:00 (the London window), 10:00 to 11:00 (the morning window) and 14:00 to 15:00 (the afternoon window). Inside a window, the trader waits for two things. The first is a liquidity sweep. ICT teaches that many traders keep their stop-loss orders just above a recent high or just below a recent low, and he calls these orders liquidity. In a sweep, price goes just past such a high or low and then turns back. The second is a fair value gap in the opposite direction to the sweep: three candles in a row where the third candle's price range does not overlap the first candle's, because the middle candle moved fast. The trade is a limit order (an order that waits at a set price) at the gap. The stop-loss goes just beyond the sweep, and the take-profit at the next recent high or low. Traders use the Silver Bullet mostly on index futures such as NQ (Nasdaq 100 futures) and ES (S&P 500 futures), on 1-minute to 5-minute charts. ICT traders describe these steps in slightly different ways. Our version is strict: the sweep and the gap must both happen inside the window, and the sweep candle must close back past the high or low. Any high that was the highest price of the hour before it counts, not only bigger highs such as the previous day's high. 'The rules we tested' lists our exact rules.

Windows
03:00 to 04:00, 10:00 to 11:00 and 14:00 to 15:00, New York time
Recent high or low
A candle's high with no higher high in the hour before it or the 15 minutes after it (for a low: no lower low)
Entry
Limit order at the near edge of the first fair value gap after the sweep
Stop-loss
1 tick (the smallest price step) beyond the highest or lowest price since the sweep
Take-profit
The next recent high or low, only if it is at least 2R away
Time exit
1 hour after the window ends: 05:00, 12:00 or 16:00 New York time
Account and risk
$50,000, a common size for a prop firm evaluation (the trading test a firm sets before it lets you trade its money). Each trade risks 1% of the account, in whole contracts
Contracts
MNQ, MES and MGC are the micro contracts of NQ, ES and gold futures. YM and RTY are the standard (not micro) Dow and Russell 2000 contracts, because our data has no micro contracts for those two markets
Trading costs
Commission (the broker's fee) on every contract, when the trade opens and again when it closes: $0.62 on MNQ, MES and MGC, and $2.50 on YM and RTY. Exits at the stop-loss or the time exit also pay half a tick of spread (the gap between the buy and the sell price)
Data
BacktestingMax futures data. It is built from CFD prices (broker prices that follow the market), not exchange data, and adjusted to trade like the real futures contract: the same trading hours, the same tick size, and the switch to the next contract when one expires (backtestingmax.com/futures-backtesting)

The rules we tested

  1. Trade only in three one-hour windows: 03:00 to 04:00, 10:00 to 11:00 and 14:00 to 15:00, New York time. The windows stay at New York clock time when New York changes its clocks for summer.
  2. A recent high is a candle's high when no candle in the hour before it went higher, and no candle in the 15 minutes after it went higher. So a high only counts once those 15 minutes have passed. A recent low is a candle's low when no candle in the hour before it went lower, and no candle in the 15 minutes after it went lower. A high or low stops counting once price goes past it.
  3. Inside a window, wait for a sweep: a candle goes at least 1 tick above a recent high and closes back below it, or at least 1 tick below a recent low and closes back above it. A tick is the smallest price step of a contract, for example 0.25 points on NQ and ES.
  4. After a sweep of a high, wait for the first downward fair value gap: three candles where the third candle's high is below the first candle's low. After a sweep of a low, wait for the first upward fair value gap: the third candle's low is above the first candle's high. The gap must form after the sweep, inside the same window. If price sweeps another high or low before the gap forms, wait for a gap after that newer sweep instead.
  5. Place a limit order at the near edge of the gap: sell at the bottom of a downward gap, buy at the top of an upward gap. The order fills as soon as price touches it. Cancel the order if price has not reached it by the end of the window, or if price reaches the take-profit first.
  6. Put the stop-loss 1 tick beyond the highest price (for a sell) or the lowest price (for a buy) since the sweep, the sweep candle included.
  7. The take-profit is the nearest recent low below the entry (for a sell) or the nearest recent high above it (for a buy). Skip the trade if there is none, or if it is less than 2R from the entry. R is the distance from the entry to the stop-loss, so 2R is twice that distance.
  8. Take at most one trade per window. If a trade is still open 1 hour after its window ends (at 05:00, 12:00 or 16:00 New York time), close it.
  9. Size every trade so that, if the stop-loss is hit, the trade loses about 1% of the account. Round down to whole contracts. If even 1 contract would risk more than 1%, skip the trade.

The method

How we tested it

The test

Markets
MNQ (Micro Nasdaq 100), MES (Micro S&P 500), YM (Dow futures), RTY (Russell 2000 futures) and MGC (Micro Gold)
Charts
1-minute and 5-minute candles
Dates
January 2020 to December 2025
Account
$50,000, risking 1% of the account on each trade
Trading costs
Included. Every trade pays that market's normal trading cost: the spread, which is the gap between the buy price and the sell price.

How a test passes

We call a test passed only if it meets all four checks. A strategy can make money in one backtest and still fail one of these checks.

  • At least 100 trades. With fewer trades, a good result could be luck.
  • It made money from 2020 to 2023 and again from 2024 to 2025. This shows whether the strategy kept working in the newer years, not only in the older ones.
  • A profit factor (the money won divided by the money lost) of at least 1.2 from 2024 to 2025, after trading costs.
  • In 95% of 1,000 random shuffles of the trades, the account must not fall more than 30% from its highest point.

Improvements

Can the ICT Silver Bullet be improved?

We tried four changes that traders often make to the Silver Bullet, one at a time, on the same 10 tests: trading only the 10:00 to 11:00 window, trading only with the 1-hour trend, a fixed 2R take-profit, and an entry in the middle of the gap. The table below explains each one. If you pick the best change and then judge it on the same years you used to pick it, it almost always looks better than it really is. So we picked the best change using 2020–2023 only: the change that made money in the most tests, and in a tie, the one with the better middle test. Then we checked it on 2024–2025, the years we did not use to pick it.

Version Made money 2020–2023years used to pick the best version Made money 2024–2025years not used to pick it Made money in both periods Passed all four checks
Standard rules, all three windows The rules under 'The rules we tested': all three windows, a limit order at the near edge of the gap, and the take-profit at the next recent high or low. 0 of 10middle test −23.9% 3 of 10middle test −7.4% 0 0
Only the 10:00 to 11:00 window The standard rules, but only in the morning window, 10:00 to 11:00 New York time. Many traders trade only this window. 0 of 10middle test −9.6% 4 of 10middle test −3.6% 0 0
With the 1-hour trendBest on 2020–2023 Only buy when the 1-hour trend is up, and only sell when it is down. A swing high here is a 1-hour high with no higher high in the 4 hours before it and the 5 hours after it, so it only counts once those 5 hours have passed. A swing low is a 1-hour low with no lower low in the 4 hours before it and the 5 hours after it. The 1-hour trend turns up when a 1-hour candle closes above the last swing high, and turns down when a 1-hour candle closes below the last swing low. 2 of 10middle test −9.2% 3 of 10middle test −4.8% 0 0
Take-profit at 2R Close the trade at 2R (twice the distance from the entry to the stop-loss) instead of at the next recent high or low. The setups are the same: a setup is still skipped when the next recent high or low is less than 2R away. 1 of 10middle test −23.2% 4 of 10middle test −14.5% 0 0
Entry in the middle of the gap Put the limit order in the middle of the fair value gap instead of at its near edge. ICT calls the middle of the gap consequent encroachment. The stop-loss and the take-profit stay at the same prices, so the stop-loss is closer to the entry. But price does not always come back that far. 1 of 10middle test −26.8% 4 of 10middle test −3.8% 1 1

None of the four changes made the Silver Bullet work in our tests. In 2020–2023, the years we used to pick, the 1-hour trend rule did best: 2 of 10 tests made money with it, compared with 0 with the standard rules. In 2024–2025, the years we kept for the check, it made money in 3 of 10 tests, the same as the standard rules. R is the money one trade risks. The trend rule took about half as many trades (3,405 instead of 6,830 in the 10 tests), so 9 of the 10 tests lost less money. But its average trade lost a little more: −0.081R, compared with −0.075R with the standard rules. So the trend rule did not pick better trades. It only took fewer of them. With the trend rule, MNQ on 5-minute charts made a little money in both periods (+0.1% and +2.8%), but with only 87 trades, so it does not count in the table. Of the four changes, only the entry in the middle of the gap gave a test that made money in both periods with at least 100 trades: gold on 5-minute charts, +1.1% of the account in 2020–2023 and +18.0% in 2024–2025. That test also passed all four of our checks. But the entry in the middle of the gap lost money in the other 9 tests from 2020 to 2025, so this one test could be luck. The 2R take-profit raised the win rate (the share of trades that made money) from 26.1% to 35.4%, but 9 of its 10 tests still lost money from 2020 to 2025. Trading only the 10:00 to 11:00 window lost the most per trade: −0.099R on average.

Questions

Questions traders ask

Does the ICT Silver Bullet strategy work?

Not in our backtest. With our standard rules, the Silver Bullet lost money in all 10 tests from 2020 to 2025, after trading costs: 5 futures markets (MNQ, MES, YM, RTY and micro gold, MGC), each on 1-minute and 5-minute charts. Most trades hit the stop-loss, and fewer than 1 in 10 reached the take-profit. The win rate (the share of trades that made money) was 22.5% to 26.3% on 1-minute charts and 31.6% to 40.8% on 5-minute charts. We also tried four common changes: only the 10:00 to 11:00 window (New York time), only trades with the 1-hour trend, a take-profit at 2 times the risk (2R), and an entry in the middle of the fair value gap. Only one of those tests made money in both 2020–2023 and 2024–2025 with at least 100 trades: gold on 5-minute charts, with the entry in the middle of the gap. That change lost money in the other 9 tests, so this result could be luck.

Does the ICT Silver Bullet work on NQ and ES?

Not in our backtest. We tested MNQ and MES, the micro contracts of NQ (Nasdaq 100 futures) and ES (S&P 500 futures). They have the same prices at one tenth of the size, so each trade can risk close to 1% of the account with whole contracts. On 1-minute charts, the MNQ test lost 32.1% of the $50,000 account from 2020 to 2025, after trading costs, and the MES test lost 56.0%. Both made money before costs ($17,332 and $16,772), but they paid more than that in trading costs ($33,397 and $44,775). On 5-minute charts, the MNQ test lost 26.2% and the MES test lost 18.1%, and both lost money even before costs.

What is the best time to trade the ICT Silver Bullet?

In our backtest, each of the three windows lost money on most markets. The afternoon window, 14:00 to 15:00 New York time, lost the least per trade. We ran each window on its own, on 5 futures markets, each on 1-minute and 5-minute charts, from 2020 to 2025. R is the money one trade risks, about 1% of the account. After trading costs, the average trade lost 0.024R in the afternoon window, 0.078R in the London window (03:00 to 04:00) and 0.099R in the morning window (10:00 to 11:00). Many traders trade only the morning window, but it made money in only 1 of the 10 tests.

Is the Silver Bullet better on the 1-minute or the 5-minute chart?

In our backtest, 5-minute charts lost less, but they did not make money either. The 5 tests on 5-minute charts lost 1.6% to 26.2% of the account from 2020 to 2025, and the 5 tests on 1-minute charts lost 32.1% to 85.5%. The 1-minute tests had 171 to 220 trades a year on each market, compared with 31 to 34 on 5-minute charts, and their trading costs took a bigger share of what each trade risked: 8.4% on average, compared with 5.2%. Even on 5-minute charts, 4 of the 5 markets lost money before costs.

Keep exploring

Related strategies we tested

ICT & smart money Fair value gap (FVG) retest strategy backtest Made money in 5 of 24 tests, 2 of them in both periods. Best: S&P 500, 15-minute, +124% ICT & smart money ICT Power of 3 (AMD) backtest on NQ, ES and gold futures Made money in 4 of 10 tests, 2 of them in both periods. Best: YM (Dow futures), 15-minute, +46% ICT & smart money Change of character (CHoCH) and market structure shift (MSS) backtest Made money in 7 of 40 tests, 5 of them in both periods. Best: USD/JPY, 1-hour, +66%
The strategy code we ran

This is the exact code from the BacktestingMax strategy engine. Paste it into the strategy editor in the app to run it on any market.

class IctSilverBullet(Strategy):
    """ICT Silver Bullet: a liquidity sweep, then the first fair value gap the other way,
    inside three one-hour windows on the New York clock (daylight saving included).
    Windows: 03:00-04:00 (London), 10:00-11:00 (New York morning), 14:00-15:00 (New York
    afternoon).
    Liquidity (builtin:liquidity): a level is a high with no higher high in the hour before
    it and none in the 15 minutes after it (lows mirror). A sweep: a candle trades at least
    one tick beyond a level and closes back on the other side of it.
    Fair value gap (builtin:fair_value_gaps): three candles where the third one's low is
    above the first one's high (a gap up), or its high below the first one's low (a gap down).
    Standard (all switches off):
      1. Inside a window, a candle sweeps a level.
      2. The setup is the first gap that forms after that sweep in the other direction,
         inside the same window: a gap up after a sweep of a low, a gap down after a sweep
         of a high.
      3. Buy limit at the top of a gap up; sell limit at the bottom of a gap down.
      4. Stop 1 tick beyond the lowest low (for a buy) or highest high (for a sell) since
         the sweep.
      5. Target: the nearest untaken liquidity level beyond the entry. Skip the setup if
         there is none, or if it is less than 2R away (R = entry to stop).
      6. The limit order waits until the window ends. It is cancelled then, or when price
         reaches the target first; after that, the next sweep can set up a new entry.
      7. One trade per window. A trade still open closes at 05:00 (London window), 12:00
         (morning window) or 16:00 (afternoon window), New York time.
      8. Size every trade so the stop costs 1% of the account.
    The changes, one at a time:
      window  = 2   only the 10:00-11:00 window (1: only London, 3: only the afternoon)
      trend   = 1   only buy when the 1-hour market structure is bullish (its last break
                    was upward), only sell when it is bearish
      exit_2r = 1   take profit at 2R instead of at the liquidity level (the same setups)
      ce      = 1   put the limit order at the middle of the gap instead of its near edge
    """
    params = {"window": Param(type=int, default=0, min=0, max=3),
              "trend": Param(type=int, default=0, min=0, max=1),
              "exit_2r": Param(type=int, default=0, min=0, max=1),
              "ce": Param(type=int, default=0, min=0, max=1),
              "min_rr": Param(type=float, default=2.0, min=0.5, max=10.0),
              "pool_hours": Param(type=int, default=1, min=1, max=48)}
    lookback = 5
    # (window start, window end, time exit), in minutes after midnight New York
    windows = ((180, 240, 300), (600, 660, 720), (840, 900, 960))
    def init(self, ctx):
        tf = ctx.timeframe_minutes or 1
        # The same clock time on every chart: 15 minutes to confirm a level, levels kept 5 days.
        # A touch is not a sweep: the wick must trade beyond the level (0.001 ATR is less than
        # one tick on every market tested, so one tick beyond is enough).
        self.lq = ctx.indicator("builtin:liquidity", lookback=ctx.params.pool_hours, lookback_unit="hours",
                                confirm_bars=max(1, round(15 / tf)), max_levels=50,
                                max_age=min(9990, int(5 * 1440 / tf)), min_penetration=0.001)
        # Only gaps that form on the current candle are used, so old gaps need not be tracked.
        self.fvg = ctx.indicator("builtin:fair_value_gaps", max_age=100)
        self.ny = ctx.clock("America/New_York")
        self.ms = ctx.tf("H1").indicator("builtin:market_structure") if ctx.params.trend == 1 else None
        self.key = None        # (date, window) being traded
        self.traded = False    # a trade has opened in this window
        self.side = 0          # +1 after a sweep of a low (look to buy), -1 after a sweep of a high
        self.sweep_bar = None  # bar of the sweep being followed
        self.extreme = None    # lowest low (buy) / highest high (sell) since that sweep
        self.order = None      # the resting limit order
        self.target = None
        self.exit_min = None
        self.exit_date = None
    def on_bar(self, ctx):
        start = self.ny.minute_of_day
        end = start + ctx.timeframe_minutes  # this candle's close, New York time
        date = self.ny.date
        win = None
        for i, w in enumerate(self.windows):
            if w[0] <= start < w[1]:
                win = i
        if win is not None and (date, win) != self.key:
            self.key = (date, win)
            self.traded = False
            self.sweep_bar = None
        if self.order is not None and self.order.filled_at_bar is not None:
            self.order = None
            self.traded = True
        if ctx.position is not None:
            if date != self.exit_date or end >= self.exit_min:
                ctx.close_position()  # the time exit
            return
        if self.order is not None:
            reached = ctx.high[0] >= self.target if self.side > 0 else ctx.low[0] <= self.target
            if win is None or end >= self.windows[win][1] or reached:
                ctx.cancel_order(self.order.order_id)  # the window is over, or price got there without us
                self.order = None
                self.sweep_bar = None
            return
        if not ctx.gate("in_window", win is not None and not self.traded):
            return
        if not ctx.gate("window_chosen", ctx.params.window == 0 or win == ctx.params.window - 1):
            return
        # Follow the newest sweep; a new one replaces the old one.
        high_swept = len(self.lq.now("sweep_high")) > 0
        low_swept = len(self.lq.now("sweep_low")) > 0
        if high_swept and low_swept:
            self.sweep_bar = None  # one candle took both sides: no direction
        elif high_swept or low_swept:
            self.side = -1 if high_swept else 1
            self.sweep_bar = ctx.bar_index
            self.extreme = ctx.high[0] if high_swept else ctx.low[0]
        elif self.sweep_bar is not None:
            self.extreme = max(self.extreme, ctx.high[0]) if self.side < 0 else min(self.extreme, ctx.low[0])
        if not ctx.gate("sweep", self.sweep_bar is not None):
            return
        gaps = [g for g in self.fvg.now("fvg_bull" if self.side > 0 else "fvg_bear") if g.formed_bar > self.sweep_bar]
        if not ctx.gate("gap_after_sweep", len(gaps) > 0):
            return
        gap = gaps[0]
        self.sweep_bar = None  # the first gap after the sweep is the setup, taken or skipped
        if not ctx.gate("window_left", end < self.windows[win][1]):
            return  # the gap closed the window: no candle left to fill the order
        if ctx.params.ce == 1:
            entry = gap.mid
        else:
            entry = gap.top if self.side > 0 else gap.bottom
        tick = ctx.pip_size
        stop = self.extreme - tick if self.side > 0 else self.extreme + tick
        risk = entry - stop if self.side > 0 else stop - entry
        if risk <= 0:
            return
        if self.side > 0:
            level = self.lq.nearest(side="buyside", above=entry)
        else:
            level = self.lq.nearest(side="sellside", below=entry)
        if not ctx.gate("liquidity_target", level is not None):
            return
        room = abs(level.price - entry)
        if not ctx.gate("target_2r_away", room >= ctx.params.min_rr * risk):
            return
        if self.ms is not None:
            trend = self.ms.trend[0]
            if not ctx.gate("hour_trend", trend is not None and trend == self.side):
                return
        if ctx.params.exit_2r == 1:
            tp = entry + 2 * risk if self.side > 0 else entry - 2 * risk
        else:
            tp = level.price
        size = ctx.size_by_risk_pct(0.01, stop=stop, entry=entry)
        if self.side > 0:
            self.order = ctx.buy(size=size, limit=entry, sl=stop, tp=tp, tag="silver_bullet_long")
        else:
            self.order = ctx.sell(size=size, limit=entry, sl=stop, tp=tp, tag="silver_bullet_short")
        self.target = level.price
        self.exit_min = self.windows[win][2]
        self.exit_date = date

Your turn

Test the ICT Silver Bullet yourself

Change the settings, the market or the stop-loss and see the result in seconds. Ask the BacktestingMax AI: Backtest the ICT Silver Bullet on MNQ 1-minute charts, 14:00 to 15:00 New York time only, with a 2R take-profit.

Try it free in BacktestingMax

Free account. No credit card needed.

See every strategy we tested Browse strategies shared by traders

Backtest on historical data with trading costs, run by BacktestingMax. Past results do not guarantee future results, and nothing here is financial advice. Updated 19 October 2026.