THE METHOD · EVERY RULE, IN THE OPEN

How we test your indicators.

You pick up to four indicators. The engine then does something no one does by hand: it tries every role, every setting and every exit rule on ten assets, tunes on two thirds of the history and judges on the third it never saw, and hands you a score. This page is the full recipe, with the places where it can still be fooled.

ONE DATASET · WHAT A RUN IS1,200 BACKTESTS
4role combinations2 entries × subsets of filters
24setting sets3 settings per indicator
5exit rulesstop × target grid
10assetsper market
1,200backtestsabout 1 second in your browser

Every entry-capable indicator takes a turn as the entry; the others join as filters in every subset. Multiply by settings, exit rules and assets and you have the count of full backtests in one dataset. A run across all four markets, five timeframes and three windows does this 60 times.

01 / WHAT YOU HAND OVER

Up to four indicators, nothing else.

You choose one to four indicators from the library, or ask the builder to fetch one by name. You can pin a setting by typing numbers after the name (“rsi 7 20 80” fixes the length and the two levels); otherwise the engine tries the settings the library ships for that indicator. You can narrow the run to one market, one timeframe, one window of history, or let it run everything: four markets, five timeframes, three windows, 60 datasets.

Each library indicator comes with three to five settings chosen to span how people actually use it: the common default first, then a faster, a slower and a looser variant. The “settings per indicator” option tests the first two, three or five of them. Three is the default because it keeps a four-indicator run inside a minute and still shows whether a result depends on one lucky setting.

Two more switches matter. Exit rules: by default the engine tries five stop-and-target pairs; you can fix one. Partner suggestion: after the run, the engine tries every other filter in the library on your best system; you can switch that off to save time.

02 / ROLES: ENTRY, FILTER, EXIT

Every indicator takes every role it can.

Each indicator in the library declares what it can do. Most can give an entry signal on their own (an RSI leaving oversold, a Supertrend flip, a Hull turning up) and can also act as a filter (RSI above 50 allows longs only; Supertrend direction; Hull slope). A few are filters only: ADX, the EMA trend filter, the ATR regime, on-balance volume, the session clock. They cannot start a trade, so a selection that contains no entry-capable indicator is refused before anything runs.

The engine does not guess which of your picks should drive entries. It tries them all:

  1. Every entry-capable indicator takes a turn as the entry. With RSI and an EMA cross, RSI drives once and the EMA cross drives once.
  2. The others become filters, in every subset. A filter can also be left out, because a weak filter that only removes good trades should lose to no filter at all. Two other indicators give four subsets: none, A, B, A and B.
  3. Every setting set is crossed with every other. Three indicators at three settings each is 27 setting sets per role combination.
  4. Every exit rule is tried on each. Five by default, listed below.
  5. Every asset in the market. Ten per market, always the same ten.

A filter works on bits: at every bar it says whether longs are allowed, shorts are allowed, both or neither. An entry fires only if every chosen filter allows that direction on the same bar. That is the whole combination logic; there is no weighting, no voting, no neural net deciding roles. Simple on purpose, so you can reproduce any row by hand.

Exits are not an indicator’s job here. Stops and targets are measured in ATR, so the same rule means the same thing on gold and on Dogecoin.

03 / THE DATA

Free feeds, short windows, warm indicators.

MarketBarsTrading cost per round trip
ForexFXCM mid-price bars, Yahoo fills the holes0.015% of price (about a 1.5-pip spread on EUR/USD)
StocksAlpaca 15-minute bars, regular hours only0.03% of price
CryptoBinance (Coinbase as fallback)0.1% of price
FuturesYahoo continuous front-month contracts0.02% of price (a tick of slippage plus fees)

Every series starts 230 bars before the window you asked for, so a 200-period average is already warm on the first tested bar; those warm-up bars are never traded. The windows are three, six and twelve months and stop there by design (why we keep the history short). Fifteen-minute bars are limited to 60 days where the free feed stops; the result panel says so when a window is cut.

The cost is charged on every trade, in R: a trade with a 1 ATR stop on an asset where the cost is a fifth of an ATR loses 0.2R before it starts. That is why fast charts with small stops score badly: they pay the toll more often, and the toll is bigger relative to the risk.

04 / THE TRADE RULES

One rulebook for every system.

  • Entry at the close of the signal bar. No peeking: a signal confirmed at the close is filled at that close.
  • Stop at k × ATR(14), measured at entry. Risk per trade is one R by definition. Results are reported in R, so systems on different assets add up.
  • Target at a multiple of the risk, or none. With no target the trade runs until the stop or an opposite signal.
  • Stop before target inside a bar. If a bar touches both, the loss is taken. That is the pessimistic reading.
  • Gaps fill at the open. A gap through the stop costs the gap, not the stop.
  • An opposite signal closes the trade and, if the filters allow it, opens the other way.
  • One position per asset. A signal while in a trade in the same direction is ignored.
  • Futures only: a bar that opens a session more than three ATRs from the last close (a contract switch or a gap) closes any open trade at the previous close and starts nothing.
Exit ruleStopTarget
Tight, 1 to 11.5 × ATR1 R
Tight, 1 to 21.5 × ATR2 R
Wide, 1 to 12.5 × ATR1 R
Wide, 1 to 22.5 × ATR2 R
Signal exit2 × ATRnone: the opposite signal closes it

Position size is not modelled: every trade risks one R, and nothing compounds. Streaks and drawdowns are therefore in R too, which is what you want when comparing systems rather than accounts.

05 / TUNE, THEN JUDGE UNSEEN

Two thirds to tune, one third to judge.

WARM-UP
TUNING · FIRST TWO THIRDS
UNSEEN · LAST THIRD

Inside each window the tested bars are split once, in time order. Every backtest reports its trades twice: those that opened in the first two thirds (the tuning window) and those that opened in the last third (the unseen window). Nothing in the choice of settings or exits ever looks at the last third; the engine only reads it afterwards, to see whether what it picked still pays on bars it never used.

Ranking is then simple and deliberately strict:

rank = 100 × avgR(unseen) + 20 × avgR(tuning), and only if trades(tuning) ≥ 20 and trades(unseen) ≥ 8A result with too few trades in either window drops to the bottom no matter how good its average looks. Within one role combination, only the best setting set and exit survives; up to twelve combinations are shown.

Yes, the unseen third weighs more than the tuning window in that ranking. That is a choice, and section 09 explains the price of it. The alternative, ranking on tuning alone and reporting the unseen third purely as a check, is on our list.

Default versus tuned

For every combination the engine also keeps the same indicators at their default settings with the same exit. The result panel shows what tuning changed (“RSI: length 14 → 7”) and what the default would have made on the unseen third next to what the tuned version made. If tuning helps a lot on the tuning window and not at all on the unseen third, you are looking at a fit, not a find.

06 / THE SCORE

One number, built from four facts.

The score is for reading at a glance, so it has to compress. It starts from the average R per trade on the unseen third and bends it onto 0 to 100:

base = 50 + 45 × tanh(avgR(unseen) / 0.5)
score = base × (0.55 + 0.45 × share of assets positive unseen) × (0.75 + 0.25 × min(1, t / 2.5))
if trades(unseen) < 8: score = min(score, 40)
if avgR(tuning) ≤ 0: score = min(score, 59)
if not robust: score = min(score, 74)
if worst drawdown > half of total profit: score −= 10+0.5 R per trade unseen lands near 84 before the other factors, +0.25 R near 71, −0.25 R near 29. Every asset agreeing keeps the full score; half of them keeps about 78% of it. t is the unseen average divided by its standard error: a thin or noisy average loses up to a quarter. A system that lost on the tuning window but won unseen is capped at Weak, because that is what luck looks like; one that fails any robustness check cannot be called Strong.

Why a low win rate can still score high

The score measures money per trade, not how often you win. A system that wins 35% of the time but makes three R on a winner and loses one R on a loser earns +0.40 R per trade on average, which is excellent. That is the shape of every trend-following system: many small losses, a few large wins, long losing streaks between them. The result cards print the win rate, the worst dip, the longest losing run and how many times the wins paid for the losses, so you can see the shape before you decide whether you could sit through it.

LabelScoreWhat it means
Strong75 to 100Paid clearly on the unseen third, on most assets, steadily, and passed every check
Promising60 to 74Paid, but thinly, on fewer assets, or without passing every check
Weak45 to 59Around break-even once costs are paid, or a win unseen after a loss while tuning
No edge0 to 44Lost unseen, or too few trades to say anything

A separate robust badge needs three things at once: a positive average on the tuning window, a positive average on the unseen third, and at least 60% of the assets positive on the unseen third. The streak dots under each result are the last trades in time order across all ten assets, the way one account trading the whole market would have felt them, with the longest winning and losing runs counted the same way.

What the score is not: a forecast. It describes how a system behaved on a slice of the recent past it was not tuned on. The lab never estimates future returns, and a score of 80 does not mean an 80% chance of anything.

07 / FROM R TO POSITION SIZE

Winning a third of the time and still making money.

Every number the lab prints is in R, and one R is the money you lose when the stop is hit. You choose it, before anything else: most people use between half a percent and one percent of the account. From there, position size is arithmetic, not judgement:

position size = (account × risk per trade) ÷ (stop distance × value of one point)$10,000 account, 1% risk, $100 per R. EUR/USD with a 1.5 × ATR stop of 30 pips: 100 ÷ 0.0030 = 33,000 units, a third of a standard lot. Micro E-mini S&P with a 25-point stop at $5 a point: $125 per contract, so one contract and you are risking 1.25%. The full-size ES at $50 a point would need a $12,500 risk budget: that trade is not for this account.

The size is set by the stop distance at the moment of entry and nothing else. The same R every trade. Not bigger when you feel sure, not “order size at the right time”: the timing is the signal’s job, the size is the stop’s job. The exported strategy does exactly this: qty = equity × risk% ÷ (stop × ATR).

Why the win rate alone tells you nothing

What you make per trade is the win rate times the average win, minus the loss rate times the average loss. With a target of T R and a stop of 1 R, the break-even win rate is 1 ÷ (1 + T):

Reward to riskBreak-even win rateWhat +0.4 R per trade needs
1 to 150%70% wins
2 to 133%47% wins
3 to 125%35% wins
No target, signal exitdepends on the average wina few large winners carrying many 1 R losses

So yes: a system that wins one trade in three but makes three R on each winner earns +0.33 R per trade, which is a very good system. You do not need to set the reward-to-risk yourself; the exit rule the lab picked is the reward-to-risk, and the “per trade, unseen” number already has the costs and the losses in it. What you decide is only how much money one R is.

Sizing does not change the edge, it changes the pain

Risking 2% instead of 1% doubles every number in money: the gains, the worst dip, the losing streaks. Take the worst dip the lab shows, multiply by one and a half because the future is worse than the backtest, and ask whether you could sit through it:

Risk per tradeA 17 R worst dip becomes12 losses in a row cost
0.5%about 8% of the accountabout 6%
1%about 16%about 11%
2%about 29%about 21%

The textbook answer is the Kelly fraction, f = W − (1 − W) ÷ B, where W is the win rate and B the average win divided by the average loss. For a system that wins 35% of the time with winners three times the losers, that is 0.35 − 0.65 ÷ 3, about 13% of the account per trade. Nobody sane trades full Kelly; a quarter of it, around 3%, is already aggressive, and 1% is where most professionals live. The lab prints the win rate, the worst dip, the longest losing run and how many times the wins paid for the losses so you can do this sum for any result.

The signal decides when. The stop decides how much. You only decide what one R is worth to you.

08 / PARTNER FILTERS

The engine tries what you did not pick.

Once the leader is known, the engine takes it as fixed, entry, settings and exit, and adds every other filter-capable indicator in the library as one more filter, at that indicator’s default setting. Each candidate is backtested on all ten assets. The ones shown are the five that moved the unseen average the most, with a small weight on the tuning window as a tiebreak:

gain = ΔavgR(unseen) + 0.3 × ΔavgR(tuning), shown only if the new system still has ≥ 8 unseen trades

The improvement next to each suggestion is measured, not estimated: it is the difference the extra filter actually made on the unseen third, per trade. It also shows how many trades the filter removed, because a filter that doubles the average by deleting nine trades out of ten has not found much. Click a suggestion and the lab runs the full test with it, settings and all, so the number you then see is the honest one.

09 / THE REPAINT CHECK

Signals that never move.

A repainting indicator reads bars to the right of the one it marks: centred smoothing, pivots marked before they are confirmed, anything normalised over the whole series. Its backtest looks wonderful and its live signals are different. So every indicator in the library, and every one the builder finds, is run on a full series and again on the same series cut 40 bars short, and the two runs are compared bar by bar on the stretch they share. One differing signal or filter bit and the indicator is rejected. The badge at the top of the library shows the count checked at load.

10 / THE EXPORT: YOUR STRATEGY AS CODE

The winner leaves as a TradingView script.

When a result is worth keeping, the lab writes it out as Pine Script version 6, in two forms. The strategy trades it, so TradingView’s own tester can re-run it on your chart. The indicator only marks the signals and comes with alert conditions, so your phone can buzz when the live chart fires. Both are built from the same pieces, and yes: the winning settings become the script’s defaults.

  1. Every tuned setting is an input with the winning value as its default. If the lab picked RSI length 7 with levels 20 and 80, the script opens with those numbers, and you can still change them in the settings panel.
  2. The winning exit becomes two inputs. Stop as a multiple of ATR(14), target as an R multiple (0 means no target), prefilled with the pair that won.
  3. The entry condition is the winning entry indicator’s signal, combined with every chosen filter’s allow condition. Long fires only when the entry says long and every filter allows longs on that bar; shorts mirror it.
  4. The trade rules are the lab’s rules. Orders fill at the close of the signal bar, the stop sits at the ATR distance from entry, the limit at the target, an opposite signal closes and reverses, no pyramiding, and position size is the account times the risk percentage divided by the stop distance, so every trade risks one R here too.
  5. The commission is the lab’s cost for that market, split across the two sides of a trade.

Expect TradingView’s numbers to differ from the lab’s. Your chart’s data feed is a different broker or exchange, its ATR warms up from the left edge of the chart rather than 230 bars before the window, its fills follow its own rules, and the lab’s tuning and unseen split does not exist there. Same system, different sample. If the two disagree wildly, that is information.

When the indicator is new

Type a name the library does not know and the builder goes to find it: an agent searches the published formula or the open-source script, decides whether it can be used (closed and paid scripts cannot), and rewrites it in the lab’s format: a small JavaScript function for the engine, three to five settings to try, and a Pine template for the export. The lab then runs that code on real bars to see that it works, runs the repaint test on it, and only then adds it to your library, which lives in your browser. The four machine-learning indicators that ship with the lab went through the same path and are our own implementations of the published methods, not copies of anyone’s code. For those, the Pine template is a compact port of the same logic, so the exported script trades what the lab tested.

11 / WHERE TO POKE HOLES

What the method cannot see.

If you want to argue with the lab, these are the real arguments, in the order we would make them ourselves.

  • The unseen third ranks the winner. Hundreds of settings and exits are compared on the same unseen slice, so the top row has had some luck on it. The verify number of a winner picked this way is optimistic; the second and third rows are usually closer to the truth, which is why they are shown.
  • One split, one history. A single two-thirds split on three to twelve months is a thin test. A system that paid in the last third of a trending twelve months may be a trend-following accident.
  • Costs are flat. One spread per market, no slippage model, no swaps or funding, no session-dependent spreads. Overnight forex and thin crypto hours are cheaper here than in life.
  • Free data has holes and seams. Forex weeks missing from the archive are filled from another feed; futures switch contracts; stocks trade regular hours only. Each is noted on the result, none is perfect.
  • Ten assets are merged by adding trades. Portfolio effects, correlation and capital are not modelled; ten positions at once count as ten R at risk.
  • Settings come from a short menu. Three to five per indicator. A great setting outside the menu is never found, and the menu itself reflects what people tend to use, not what is optimal.
  • Partners are tried at defaults only. The suggestion may improve further when tuned, or evaporate.
  • Exits are a grid of five. Trailing stops, time stops and partial exits are not tested.

A high score is a reason to look closer. It is never a reason to trade.

12 / WHAT WE WANT TO IMPROVE

Next on the bench.

In rough order of how much we think each one matters

  • Rank on the tuning window, report the unseen third as a pure check. Removes the winner’s luck from the headline number. We would show both rankings side by side so you can see the gap.
  • Several folds, not one. Tune on months one to four, judge on five; then two to five, judge on six; and so on. A system that passes three folds has earned more than one that passes one.
  • A multiple-testing penalty. The more settings and exits a run tries, the more a lucky winner should be discounted. A simple correction for the number of candidates is cheap to add.
  • Neighbourhood stability. Show how the adjacent settings did. A winner whose neighbours also pay is a plateau; one whose neighbours lose is a spike.
  • Slippage by session. Wider costs outside the main hours of each market, and funding for crypto perpetuals.
  • Trade-order shuffles. Re-run the trade sequence in random orders to show the range of drawdowns that same system could have produced.
  • Tuned partners. Let the partner search try the candidate’s settings, not only its default.

If you see a hole that is not listed here, write to us. The point of putting the method in the open is that someone cleverer than us reads it.

Nothing on this page is investment advice. Backtests are hypothetical, prepared with hindsight, on free data, without slippage or funding. A combination that tested well can stop working.

Now watch it do all of this.

Pick up to four indicators. The engine shows every step as it works, then hands you the score, the streaks and the TradingView strategy.