The laboratory

Do trading indicators actually work?

Every classic indicator, on its published settings, over all the history we hold — with the real spread charged on every trade, the last 30% of each window scored separately, and a coin flip run through the identical engine so there is something to measure them against.

The answer in 30 seconds

0 of 55 indicators finished with a positive expectancy when pooled across every instrument and timeframe at once, with the spread charged. On five- and fifteen-minute charts they are statistically indistinguishable from random entries run through the same engine.

That is not the same as “indicators never work”, and the table below does not say so. Pooled across everything, the fast charts dominate and nothing clears its costs. Looked at one timeframe at a time, 32 of 55 finish above zero on daily candles. Both facts come from the same rows.

The gradient people usually attribute to indicators — results improving as the chart slows — turns out to be reproduced almost exactly by random entries. It is a fact about trading costs, not about indicators. Everything below is the working.

What we actually tested

55Indicators
15Instruments
6Timeframes
4,950Backtests
1,324,836Trades

Each indicator runs on its published settings against every instrument on every timeframe, over the longest history we hold for that timeframe — five years of daily candles down to six months of five-minute ones.

What is R? R is one unit of risk — whatever you decided to lose if the trade went against you. +1R means you made that amount; −1R means you lost it. Every number on this page is in R rather than pips because forty pips on gold and forty on EURUSD are not the same trade, and pooling them would let whichever instrument has the biggest pip count decide the ranking.

The random control

We did not only test indicators. We ran a coin flip through the identical engine — same candles, same stops, same spread, same rules — and put its result in the column next to every indicator.

This is the part we would ask you to look at first, because without it none of the other numbers mean anything. If an indicator returns −0.1287R per trade, that is only informative once you know what entering at random returns on the same charts. An apparent edge that a coin flip also produces is not an edge; it is the cost of trading, or noise, wearing the name of an indicator.

It is also the strongest check available that the simulation is not cheating. A signal with no information in it should lose approximately the spread and nothing else. If random came out profitable, the engine would be reading the future and every other figure here would be worthless.

The results

Every indicator, pooled by timeframe, against the control. Nothing else changes between these rows — same indicators, same instruments, same rules. Why random? If an indicator carries useful information it should beat an entry that carries none. The control is that entry.

Bar chart: pooled expectancy of all 55 indicators
  against a random-entry control across six timeframes. The two are almost
  identical on 5- and 15-minute charts and separate on 4-hour and daily.
Timeframe TradesAll 55 indicators Random entries DifferenceRuns profitable
5 min540,899-0.1287R-0.1074R-0.02137%
15 min194,681-0.0524R-0.0661R+0.013732%
30 min226,043-0.0408R-0.0323R-0.008530%
1 hour220,364-0.0318R-0.0076R-0.024232%
4 hour103,780-0.0101R-0.0187R+0.008645%
Daily39,069+0.0034R-0.0070R+0.010453%
The big finding

On five- and fifteen-minute charts, all 55 indicators collectively added nothing over entering at random — a difference of 213 and 137 ten-thousandths of R across 735,580 trades.

The detail: five-minute: −0.1287R against random’s −0.1074R. Fifteen-minute: −0.0524R against −0.0661R. Those gaps are 213 and 137 ten-thousandths of R across hundreds of thousands of trades. 55 indicators, collectively, add nothing you could not get by flipping a coin.

And the gradient is not about indicators at all. Random entries show the same curve — from −0.107R on five minutes to −0.0070R on daily. So the improvement as the bar slows is not indicators working better. It is that a slower bar carries less cost and less noise per trade, and a coin flip benefits from that exactly as much as an indicator does.

An earlier version of this page presented the gradient on its own and read it as evidence about indicators. The control shows that reading was wrong, and it is left here rather than quietly corrected because the mistake is the useful part: a number with no baseline beside it will be over-interpreted, including by the person who produced it.

Where it gets interesting

On four-hour and daily charts the indicators start beating the control — by +0.0086R and +0.0104R respectively. Counted one indicator at a time rather than pooled, the picture is sharper still:

Timeframe Positive expectancyBeat the random control
5 min0 of 556 of 55
15 min0 of 5538 of 55
30 min1 of 5517 of 55
1 hour5 of 559 of 55
4 hour18 of 5537 of 55
Daily32 of 5534 of 55

On five-minute charts 6 of 55 beat the control — about what chance alone produces from 55 coin flips. On four-hour charts 37 of 55 do, which chance does not produce easily.

But read the two columns together before getting excited. Beating the control is not the same as making money: on four-hour charts 37 of 55 still finish below zero. They lose less than a coin flip does, which is a real result and is not a profit. Daily is the strongest row in the table — 32 of 55 above zero — and it is also among the thinnest, with the fewest trades in the study.

Treat this as a hypothesis worth testing, not a conclusion. It is the most interesting result on the page and the least certain one, and those two things are related. The strategy tester runs the same engine if you want to push on it yourself.

What this means

How this was measured

Expectancy is the column that matters. A 70% win rate with a negative expectancy still loses money, and several indicators here manage exactly that. Profit factor and win rate are both easy to make look good by changing what counts as a trade; expectancy per trade is not.

Trade count is the credibility of the row. A profit factor of 3 from forty trades is noise wearing a suit. That is why the default filter is 200 trades and why thin rows are greyed rather than deleted — hiding them would be its own kind of dishonesty.

Entries fill at the next bar’s open, never the bar that produced the signal, and the stop is four median bars wide for that timeframe with the target at twice the stop. Scaling the stop to the bar is what makes the timeframes comparable: a fixed 20-pip stop is eight five-minute bars and less than one four-hour bar, so holding it constant measures the stop rather than the indicator.

It is not a ranking of which indicator to trade. Every one runs on its textbook settings — RSI 14, MACD 12/26/9, Bollinger 20/2 — and nothing else. Tuning each to its best parameters would produce a prettier table describing nothing but the tuning.

The full table

All 55 indicators, sortable. Click any name for that indicator’s own page and its per-timeframe breakdown.

IndicatorFamily Trades Expectancy (R) Win rate PF PF out-of-sample Runs profitable 5 min15 min30 min1 hour4 hourDaily
Volume oscillatorvolume24,127-0.050437.0%0.971.0332%0.901.031.051.000.931.26
Bollinger reversionvolatility24,187-0.051436.8%0.990.9942%0.900.840.780.971.121.36
RSI 30/70 reversionmomentum17,629-0.052936.2%1.011.2648%0.840.940.981.031.182.67
Chande momentummomentum21,979-0.054736.3%0.991.1843%0.820.941.010.990.862.43
Ultimate oscillatormomentum15,066-0.054835.9%1.041.1041%0.831.011.101.090.881.73
Momentummomentum27,930-0.057036.8%0.991.0534%0.860.891.111.091.101.27
Heikin-Ashi flipprice action32,946-0.058636.4%0.951.0039%0.860.931.021.061.021.11
Williams %Rmomentum30,048-0.059336.2%0.940.9739%0.830.920.970.890.951.28
Ichimoku TK crosstrend23,185-0.060236.4%0.990.9938%0.880.891.110.831.171.08
Vortex crossovertrend25,307-0.060736.6%0.991.1141%0.850.871.091.131.311.39
DEMA crossovertrend25,588-0.061036.6%1.001.1636%0.860.951.171.041.111.83
Force indexvolume26,594-0.061236.5%0.981.0239%0.830.921.061.051.091.14
Relative vigour indexmomentum35,249-0.061736.1%0.961.0431%0.841.010.990.970.951.46
Accumulation/distributionvolume27,152-0.062636.1%0.960.9836%0.890.971.021.031.010.94
Fisher transformmomentum35,689-0.062836.1%0.950.9232%0.860.891.000.941.000.86
CCI 100momentum26,762-0.064036.3%0.930.9530%0.890.870.861.051.021.02
Rate of changemomentum26,930-0.064636.3%0.961.0333%0.830.901.020.981.051.37
RSI 50 momentummomentum23,489-0.065536.4%0.960.9836%0.850.911.100.931.180.92
Stochastic RSImomentum31,345-0.065935.9%0.941.0334%0.850.990.941.051.091.23
Ease of movementvolume25,176-0.066036.6%0.980.9933%0.820.891.151.041.140.94
Parabolic SARtrend28,595-0.067236.1%0.981.0538%0.820.950.961.041.111.43
VWMA vs SMAvolume24,899-0.068036.4%0.951.1443%0.820.981.320.941.071.73
Coppock curvemomentum23,241-0.068436.1%0.971.0639%0.840.931.081.061.111.34
Detrended pricemomentum21,698-0.069236.4%0.961.0234%0.800.971.210.961.101.11
True strength indexmomentum27,724-0.070036.1%0.961.1029%0.840.911.021.021.131.65
EMA crossovertrend18,298-0.072935.9%0.971.0437%0.821.001.040.871.271.23
MACD zero crossmomentum18,298-0.072935.9%0.971.0437%0.821.001.040.871.271.23
TEMA crossovertrend28,378-0.073335.9%0.940.9628%0.880.920.930.931.121.01
Aroon crossovertrend21,099-0.073336.1%0.971.2433%0.871.001.160.771.142.47
Awesome oscillatormomentum20,875-0.073536.1%0.971.2132%0.831.001.220.891.182.11
MACD signal crossmomentum27,580-0.074436.1%0.951.0330%0.860.941.040.991.201.18
KAMA crossovertrend26,563-0.074635.9%0.951.0130%0.870.890.980.971.021.33
TTM squeezevolatility18,261-0.076136.1%0.961.0038%0.861.020.980.961.181.01
Least-squares MAtrend32,065-0.076735.8%0.960.9932%0.830.880.940.911.031.33
Stochasticmomentum26,424-0.076935.9%0.951.1134%0.810.860.991.141.201.65
OBV vs its averagevolume27,814-0.080635.4%0.920.9427%0.830.970.960.841.100.91
TRIX zero crosstrend17,956-0.080835.6%0.981.1339%0.771.001.110.851.231.81
Hull MA crossovertrend27,762-0.080935.6%0.930.9931%0.870.870.990.881.211.15
Williams alligatortrend28,538-0.081535.3%0.910.9728%0.880.950.930.901.121.04
Money flow indexvolume8,572-0.081835.1%1.021.7033%0.990.940.850.854.981.51
Elder raymomentum26,791-0.084335.6%0.920.9332%0.851.010.940.841.050.88
Price vs SMA 200trend11,179-0.084434.9%1.001.3840%0.781.140.921.232.941.27
Donchian breakoutvolatility26,998-0.084935.2%0.910.9527%0.820.940.960.901.240.82
Inside-bar breakoutprice action26,835-0.085835.6%0.910.9224%0.870.970.880.950.900.92
ADX / DI crossovertrend10,839-0.087135.2%0.940.9731%0.850.901.211.021.340.40
Chaikin money flowvolume27,345-0.087635.2%0.921.0221%0.860.950.911.071.261.08
Engulfing candleprice action27,764-0.088035.2%0.920.9128%0.830.990.960.841.030.79
SuperTrendtrend18,661-0.088535.1%0.921.1433%0.770.951.000.991.092.04
Chaikin volatilityvolatility23,138-0.089135.4%0.941.0231%0.841.031.060.871.211.07
SMA crossovertrend7,509-0.089734.6%1.020.8336%0.770.860.800.990.910.60
Pin barprice action30,481-0.092635.1%0.890.9019%0.800.950.870.880.960.91
Bollinger breakoutvolatility25,403-0.093335.0%0.900.9623%0.840.981.010.851.090.97
Keltner breakoutvolatility22,143-0.103534.2%0.910.9328%0.780.990.930.831.070.99
Choppiness breakoutvolatility18,864-0.106834.3%0.880.9924%0.780.930.941.030.961.28
ATR breakoutvolatility19,868-0.124533.2%0.871.1718%0.780.870.910.831.012.60

Take the data: download all 4,950 rows as CSV — free to reuse under CC BY 4.0, which asks only that you say where it came from.

The six right-hand columns are the out-of-sample profit factor on each timeframe — green above 1.00, red below. Rows greyed out have fewer than 200 trades and are shown but never ranked on.

Glossary

R
One unit of risk. +1R is a win the size of what you were risking; −1R is a full loss.
Expectancy
Average result per trade, in R. The number that decides whether a strategy makes money.
Profit factor
Gross profit divided by gross loss. Above 1.00 is profitable before costs of being wrong about it.
Out-of-sample
The last 30% of each window, scored separately. No setting was chosen against it.
Random control
Entries placed at random, run through the same engine, as a baseline for what no information looks like.
Spread
The dealing cost charged on every trade here, at the real per-instrument rate.

Then how does the signal service work?

A fair question, and the obvious one: if the laboratory says classic indicators do not clear their costs, why does the published record show what it shows?

Because this page tests something different. Every row above is a single indicator, alone, on its published settings, entering on every signal it gives, with a stop of four median bars and a target of twice that — in all market conditions, on all 15 instruments, forever. That is not how anybody trades, and it is not how our signals are produced. Ours combine several factors that must agree, decline far more setups than they take, and manage the trade after entry. Nothing on this page is a backtest of our signal engine, and it should not be read as one.

The one number that compares directly is expectancy, because it is in R either way:

Measured overExpectancySample
Our published signals+0.4240R1,031 trades, 5 months
Best single indicator here (Volume oscillator)-0.0504R24,127 trades, up to 5 years
Random entries, same engine-0.0076Rcoin flip control

The same standard, applied to us. Our record is 1,031 trades over about five months. The laboratory is 1,324,836 trades over up to five years — roughly 1285 times the sample. Every argument this page makes about small samples, out-of-sample testing and over-interpretation applies to our own results too, and the honest position is that five months is one market regime, not proof of an edge.

What we can say is narrower and checkable: every one of those trades was published before its outcome was known, the losses are still on the record, and the spread is deducted from the figure above exactly as it is from every row in this table. Judge it on that, and on how it looks in another year.

Citing this study

4,950 backtests of 55 indicators across 15 instruments and 6 timeframes, 1,324,836 trades, with the spread charged and a coin-flip control run through the same engine. The full dataset is downloadable and free to reuse under CC BY 4.0 — which asks only that you say where it came from.

Suggested citation
TeachTrades. “The indicator laboratory: 55 indicators tested against a random-entry control.” Updated 18 October 2026. https://teachtrades.com/lab
Data: https://teachtrades.com/data/lab.csv (CSV) · Licence: CC BY 4.0 · Method: https://teachtrades.com/lab

Check it yourself

The strategy tester uses the same engine, the same candles and the same spread model. Pick any row that interests you, change one number, and watch what the out-of-sample column does — that is the fastest lesson in curve fitting available for free. The live record is where our own trades are published before their outcome is known, with the losses left in.

Want the setups, not just the maths?

Research is one thing and execution is another. The same discipline runs our published signals: entries filled at real prices, spread deducted, and every loss left on the record.

See today’s signals →