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
What we found
What the 10 backtests show
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.
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).
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.
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).
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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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
.
Free account. No credit card needed.
See every strategy we tested Browse strategies shared by tradersBacktest 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.