Research· 12 min read

We Ported the Most Popular ICT Strategy to Python. Its 17% Came From Fifteen Trades.

Almost no ICT material reports numbers, so a strategy that publishes its own backtest deserves to be taken seriously. ICT Master Suite is open source, ships five ICT models, and returned +17.36% in fourteen weeks at a 66.20% win rate on Nasdaq futures. We exported all 71 trades, rebuilt the strategy in Python, and matched 43 of its entries to the exact second. Then we asked the three questions the strategy tester cannot answer.

The short version

  • The reported result is real: 71 trades, 66.20% win rate, +$17,362 net on a $100,000 account, all long, 25 May to 2 September 2026.
  • All of the profit comes from one killzone. The 15 New York PM trades made +$27,087. The 54 London and New York AM trades lost $13,165 between them.
  • Commission took 49% of gross. $16,868 of fees against $34,230 gross — about 12 Nasdaq points per round turn at the default 0.02%.
  • We ported the model from the library source and validated it: 43 of 60 entries match to the exact second, and those matched trades agree on win-or-lose 40 times out of 43.
  • Run the same way — long only, same commission — over 1,807 trades and 8.5 years, it returns −0.393R per trade, profit factor 0.407, with every killzone and every one of nine years negative.
  • We found two bugs in the library. One forces every short trade onto a stop it was never configured to use — and onto the only code path in the file that reads future data.
  • The fourteen-week window is not a choice. The script caps itself at 20,000 bars.

Why this script was worth testing

We have written before about the problem with ICT education. It arrives as narrative — a teacher walks through a chart, points at a moment, explains why it mattered — and it is persuasive precisely because the chart has already resolved. Our audit of the Silver Bullet lecture found its most important choice had never been made mechanical at all. There was nothing to falsify.

ICT Master Suite by Trading IQ is different in three ways. It is published under the Mozilla Public License, so the code can be read. It is declared as a Pine strategy rather than an indicator, so it submits simulated orders and produces a real performance report instead of drawing boxes. And its author states plainly that the point is to let traders find out for themselves whether the models are worth trading.

It ships with five models — Model 2022, Unicorn, Silver Bullet, Liquidity Raid and Optimal Trade Entry — each switchable long or short independently. That is ten configurations. We ran all ten on NQ1! 5-minute, then took the best performer apart.

First, the trap that eats an hour

The strategy produces no trades at all until you change one setting. It ships with order size set to 5% of equity on $1,000 of initial capital. A Nasdaq E-mini contract carries roughly $599,000 of notional, so 5% of $1,000 asks for about 0.0000835 contracts. That rounds to zero, no order is submitted, and the report stays empty.

Set Order size to Contracts in the Properties tab. The author knows and prints a note on the chart saying so. It is a crypto-native default meeting a futures symbol, and it is worth understanding rather than clicking past — the same mismatch distorts position sizing after the trades appear.

Ten configurations, one chart

NQ1! Nasdaq 100 E-mini futures, 5-minute chart, $100,000 of capital, one model and one direction enabled per run, everything else at defaults.

ModelDirProfitWin ratePF
Silver BulletLong+17.78%66.67%1.312
Model 2022Long+5.01%50.00%1.308
Liquidity RaidShort+2.70%75.00%23.435
UnicornShort+1.64%50.00%2.305
UnicornLong−1.60%33.33%0.613
OTEShort−8.67%15.74%0.893
Model 2022Short−12.00%50.00%0.575
Liquidity RaidLong−12.28%57.14%0.164
OTELong−22.69%13.10%0.665
Silver BulletShort−61.96%69.05%0.469

Four of ten made money, and the dispersion is the first thing worth noticing. Same instrument, same fourteen weeks, same underlying theory of how markets work — and an 80-percentage-point spread between best and worst, with profit factors covering a 143-fold range.

Silver Bullet Long is the standout. So we exported its trade list.

Where the profit actually came from

The Silver Bullet model trades three one-hour killzones in New York time: London at 03:00, New York AM at 10:00, New York PM at 14:00. Sorting all 71 exported trades by the session they were entered in produces the single most important table in this article.

London03:00 – 04:00
n=3161.3%$5,508
NYAM10:00 – 11:00
n=2356.5%$7,657
NYPM14:00 – 15:00
n=1586.7%+$27,087

Two further trades entered exactly on a session boundary (04:00 and 11:00) and are excluded above; together they contributed +$3,440.

Fifteen trades in the New York PM killzone produced +$27,087. The 54 trades in London and New York AM lost $13,165 between them. Remove one session from a strategy that trades three and the remainder is comfortably negative.

An 86.7% win rate on 15 trades is 13 wins and 2 losses. That is not a statistic you can plan around. It is a fortnight’s worth of afternoons that happened to go well, and it is carrying the entire headline number.

The shape of the wins says something too. Profit factor is 1.299, but the average winner is $1,605 against an average loser of $2,419. The model wins often and small, then gives it back in larger pieces — the signature of stops placed at swing lows far from entry while targets sit at nearby swing highs.

What it cost to earn that

The export includes a commission column, and it is the second thing that reframes the result.

Gross profit$34,230
Commission−$16,868
Net profit+$17,362

Costs consumed 49% of gross profit. The default is 0.02% commission per side, which on roughly $599,000 of notional works out to about 12 Nasdaq points per round turn. That is a steep toll for a model whose median trade lasts 17 bars, and it is charged on every one of the 56 trades that lost money as well as the 15 that carried the result.

None of this is hidden. It is in the export, in a column, in dollars. It simply is not in the summary figure anybody screenshots.

So we rebuilt it

Fourteen weeks cannot separate a strategy with an edge from one without. The script caps itself at calc_bars_count = 20000, which on a 5-minute chart of a nearly 23-hour futures session is about 72 trading days — so the date range in the tester is not a research decision, it is a performance ceiling in the source.

The entry logic lives in an imported library rather than the strategy file, and reading it gives the full rule set: three killzones in New York time; a directional bias from a zigzag that runs on chart bars using a 15-minute ATR threshold, latched once at session open and held; a fair value gap trigger requiring the high from two bars back to sit below the current low; a limit order at the gap edge; and take-profit and stop levels drawn from the nearest zigzag swing above and below.

We implemented that in Python against 2.6 million minutes of Nasdaq data and checked it against the export.

Agreement testMatch
Entries matching to the exact second43 / 60
Entries within five minutes45 / 60
Entries within one hour52 / 60
Shared trading days37 / 40
Win-or-lose agreement on the 43 matched trades40 / 43

That last row is the one that matters. On the trades where both implementations fire at the same second, they agree on the outcome 93% of the time— 25 shared wins, 15 shared losses, three disagreements. Win rates on that subset are 63% against 60%, and the median hold is 17 bars against 18. Same entries, same exits, same durations, on a different price series.

It is not perfect. The port fires 60 long signals in the window against the tester’s 56, and 17 of its entries do not land on a matching timestamp. Our series is a Nasdaq CFD rather than the futures contract — different prints, slightly different session edges — so some residual is expected. We would trust this port for statistics, not for reproducing an individual fill.

Eight and a half years at the same cost

3,224 trades from January 2018 to August 2026, priced in R — multiples of the risk taken on each trade, so results do not depend on position sizing.

Round-turn costWin rateAvg RTotal RPF
2 points55.92%−0.059−1900.876
6 points53.63%−0.206−6650.631
12 pointsas charged47.05%−0.427−1,3780.393

The model is mildly negative even at two points of friction. At the twelve points the tester actually charged it loses 0.427R per trade with a profit factor of 0.393 — and all three killzones are negative, New York PM included, at −307.8R across 948 trades.

That is the answer to the fourteen-week result. Not that it was fabricated, but that fourteen weeks of one instrument is a sample in which one good session can carry everything, and eight and a half years is a sample in which it cannot.

Nine years, long only, nine losing years

The table above covers both directions. The configuration that produced the headline result was long only, so the cleanest comparison is to run the port the same way — 1,807 long trades, January 2018 to August 2026, at the twelve points of commission the tester actually charged.

Win rate47.43%
Avg per trade−0.393R
Total−710.2R
Profit factor0.407

Every killzone is negative — London −393.5R, New York AM −133.2R, New York PM −183.5R. That includes New York PM, the session that produced the entire +$17,362 in the fourteen-week window.

YearTradesWin rateTotal R
201823029.1%-194.5
201923130.7%-191.5
202024947.4%-91.3
202111955.5%-22.5
202220854.8%-42.7
202319452.6%-51.4
202419555.9%-50.0
202522752.4%-43.4
202615459.1%-22.9

Nine for nine. Not one calendar year in the sample turns a profit.

The losses do shrink. 2018 and 2019 are the worst by a wide margin, and the win rate climbs steadily from 29.1% to 59.1% across the sample. It would be easy to present that as a strategy improving as the market matured.

We are flagging it as a caveat rather than a finding. The trend could be a genuine regime change, or it could be the quality of the CFD price series improving over eight years. We have not separated those two explanations, and we would not lean on the trend in either direction until we had. What the sample does support is the flat statement: at the cost actually charged, this model lost money in every year we can measure.

Two bugs in the library

Reading source has a second benefit. The short branch of the Silver Bullet function selects its stop loss by testing the long stop-loss input against a swing-high setting. Because the long input defaults to a swing low, the test is always false, and every short trade falls through to the alternative branch regardless of what the user selected.

That alternative stops shorts at the previous day’s high — an enormous risk leg on an intraday model. It explains the shape of Silver Bullet Short in the table above perfectly: a 69.05% win rate that still lost 61.96%, profit factor 0.469. Frequent small wins, occasional catastrophic losses, exactly as a stop that far away would produce.

And that same branch is the only place in the file that requests daily data with lookahead enabled. Configurations using swing-based exits avoid it. Shorts, because of the bug, cannot.

Is there at least a cycle?

A strategy without a constant edge can still be worth trading if the edge arrives on a schedule. We run seasonal hot-and-cold phase detection across thousands of instruments, so we pointed it at two independent trade lists: our own long-running Silver Bullet implementation, which is profitable, and the port above, which is not.

Trade listTradesMonth spreadp12-mo autocorr
Our implementation (profitable)1,5180.2790.991−0.038
This port (unprofitable)3,2240.2030.545−0.09

Neither shows calendar structure. Shuffling each list’s returns across its own month buckets five thousand times produces a wider best-to-worst spread than the real data does, and the twelve-month autocorrelation — where an annual cycle would have to appear — is flat in both.

Where our own version does make money, the gains cluster in 2020 and 2023 and go nowhere in 2019, 2021 and 2024. That is drift, not a season. It cannot be scheduled.

We test every claim against its base rate

Seasonal Edge screens thousands of securities for recurring patterns and reports each one with its sample size, win rate and control comparison attached. No screenshots, no cherry-picked windows.

Explore the screener →