Do stop-losses help? 8,810 paired crypto backtests
We paired 8,810 backtests that differ in one way only: one trades the plain signal, the other adds a stop or a profit target. The exit rule raised the yearly return in about 7 pairs out of 100.
How this was made: the analysis code and the first draft of this text were produced by an AI assistant working under the operator's direction, using only the public datasets on this site. Nothing here is investment advice.
The question
Almost every trading guide says to use a stop-loss. It sounds like free insurance: lose less on the bad trades and keep the good ones. But a stop also sells some trades that would have recovered, and getting back in pays the fee again. The SpreadAtlas backtest dataset happens to hold what is needed to test this: the same signal run with and without an exit rule.
How the pairs were built
Each setup in the dataset is an entry rule (an indicator with its settings, sometimes with filters) and an exit. We took every entry rule that was tested both with no added exit rule (signal only) and with one of 13 added exits: a stop-loss of 1%, 2% or 3%; a trailing stop of 2%, 3% or 5%; a take-profit of 1%, 2% or 3%; a 2% stop with a 3% take-profit; a 2% stop with a 3% trailing stop; and leaving after 12 or 48 bars. Each such combination is one pair. Costs are the same on both sides: the exchange fee plus one tick of slippage per trade.
We used bar lengths from 5 minutes to 4 hours. The 1-minute and 3-minute data cover only six months, so they are left out. Pairs in which either version never traded are dropped. That leaves 8,810 pairs on six bar lengths. The yearly return, the worst fall and the two-period test are the values published in the dataset; a setup passes the two-period test with at least +10% a year in both periods and a second period at least half as good as the first. The details are in the methodology and the data pages.
The result: a lower yearly return in nine pairs out of ten
| 8,810 pairs | |
|---|---|
| Yearly return higher with the exit rule | 597 pairs (6.8%) |
| Unchanged | 304 pairs (3.5%) |
| Lower | 7,909 pairs (89.8%) |
| Median change in yearly return | −7.7 points |
| Range of the middle half of pairs | −16.0 to −2.0 points |
| Best pair / worst pair | +10.4 points / −59.2 points |
| Second period only: pairs with a higher return | 13.7% |
| Second period only: median change | −4.4 points |
A median change of −7.7 points is the middle result, not the worst case. Only 31 pairs gained 5 points or more. 1,606 lost 20 points or more, and 584 lost 30 or more.
Which exits did the least damage
| Exit rule added | Pairs | Yearly return higher | Median change in yearly return (points) | Median change in win rate (points) | Worst fall shallower |
|---|---|---|---|---|---|
| Stop-loss (1%, 2%, 3%) | 2,171 | 13.0% | −4.4 | −4.0 | 49.5% |
| Trailing stop (2%, 3%, 5%) | 2,171 | 3.4% | −10.1 | 0.0 | 49.3% |
| Take-profit (1%, 2%, 3%) | 2,171 | 7.3% | −7.0 | +7.0 | 36.9% |
| 2% stop + 3% take-profit | 126 | 0.8% | −19.3 | +2.0 | 35.7% |
| 2% stop + 3% trailing stop | 1,919 | 3.8% | −11.0 | −1.0 | 51.2% |
| Exit after 12 or 48 bars | 252 | 4.4% | −7.2 | 0.0 | 36.1% |
| All 13 exit rules | 8,810 | 6.8% | −7.7 | 0.0 | 46.1% |
Stop-losses were the gentlest, and they still raised the yearly return in only 13.0% of pairs. Trailing stops did worst among the single exits (3.4%), and putting a stop on top of a trailing stop did not rescue them (3.8%). Take-profits moved a different number: they raised the median win rate by 7.0 points while lowering the yearly return by 7.0 points. That is how a better-looking win rate can come with worse money. Win rate against expectancy.
Tighter rules cost more
| Exit rule | Pairs | Yearly return higher | Median change in yearly return (points) | Median change in win rate (points) |
|---|---|---|---|---|
| Stop-loss 1% | 126 | 2.4% | −8.2 | −10.0 |
| Stop-loss 2% | 1,919 | 13.6% | −4.2 | −3.0 |
| Stop-loss 3% | 126 | 14.3% | −3.4 | −1.0 |
| Trailing stop 2% | 126 | 0.8% | −17.5 | −1.0 |
| Trailing stop 3% | 1,919 | 3.8% | −9.9 | 0.0 |
| Trailing stop 5% | 126 | 0.0% | −7.2 | 0.0 |
| Take-profit 1% | 126 | 0.8% | −12.4 | +20.5 |
| Take-profit 2% | 126 | 1.6% | −10.7 | +12.0 |
| Take-profit 3% | 1,919 | 8.1% | −6.6 | +6.0 |
| 2% stop + 3% take-profit | 126 | 0.8% | −19.3 | +2.0 |
| 2% stop + 3% trailing stop | 1,919 | 3.8% | −11.0 | −1.0 |
| Exit after 12 bars | 126 | 2.4% | −13.4 | +2.0 |
| Exit after 48 bars | 126 | 6.3% | −2.5 | 0.0 |
Within each kind, the tighter the rule, the more it cost. A 1% stop raised the yearly return in 2.4% of its pairs and a 3% stop in 14.3%. A 2% trailing stop did it in 0.8% and a 5% trailing stop in none of its 126 pairs. A 1% take-profit lifted the median win rate by 20.5 points and cut the yearly return by 12.4 points. Rows with the same number of pairs were tested on the same setups, so compare them with each other; rows with 126 pairs and rows with 1,919 pairs are different sets of setups.
Bar length decides what a stop is for
| Bar length | Plain setups: median yearly return | Yearly return higher | Median change (points) | Worst fall shallower / deeper | Two-period passes: plain / with exit |
|---|---|---|---|---|---|
| 5 minutes | −52.7% | 8.2% | −2.2 | 13.4% / 69.3% | 0 / 0 |
| 10 minutes | −37.2% | 9.4% | −3.7 | 21.7% / 71.8% | 0 / 0 |
| 15 minutes | −3.9% | 1.3% | −11.4 | 25.1% / 69.9% | 0 / 0 |
| 30 minutes | 7.2% | 3.1% | −12.1 | 59.2% / 37.9% | 191 / 24 |
| 1 hour | 15.6% | 4.9% | −13.0 | 79.2% / 19.3% | 446 / 110 |
| 4 hours | 40.6% | 14.1% | −11.6 | 79.9% / 19.1% | 609 / 496 |
On 1-hour and 4-hour bars, where most plain setups made money (95% and 89% of them), an exit rule made the worst fall shallower in about four pairs out of five (79.2% and 79.9%). It cost a median of 13.0 and 11.6 points of yearly return. On 5-, 10- and 15-minute bars most plain setups lost money after costs (median −52.7%, −37.2% and −3.9% a year), and adding an exit rule made the worst fall deeper in about 70% of the pairs. We did not test why.
The stop-loss on its own was most useful on 4-hour bars: it raised the yearly return in 28.4% of 345 pairs, with a median change of −2.6 points.
The two-period test: exits halved the passes
In 1,246 of the 8,810 pairs the plain version passed the two-period test. In 630 the version with an exit rule did. All of the passes were on 30-minute, 1-hour and 4-hour bars (191 against 24, 446 against 110 and 609 against 496). Take-profits did the most damage (307 against 28); stop-losses kept most of the passes (307 against 241).
What this does not show
- Stops, trailing stops and take-profits were checked at bar closes. A real stop triggers inside the bar. This study cannot say how much better or worse that would be, or what happens in a gap or a fast crash.
- The exit rules here are fixed percentages or bar counts. Stops sized to volatility are not part of this comparison.
- These are medians across setups on one market, Upbit's won market, for the rules in this dataset. A different market or rule could behave differently.
- A stop-loss is risk control more than a profit tool. In these data it did what risk control does: it cost return and, on slower bars, usually made the worst fall shallower. We did not measure the risk of a single trade without a stop wiping out an account. That depends on position size: position size calculator.
- A backtest is not a live result.
What to take from it
- Do not add an exit rule to raise profit. In nine pairs out of ten it did not.
- If you want a shallower worst fall on 1-hour or 4-hour bars, a stop usually delivered it, for a median 12 to 13 points of yearly return. Put a price on it before you decide. A shallower fall also needs a smaller gain to recover: drawdown recovery calculator.
- A higher win rate from a take-profit is not a better strategy. Break-even win rate calculator.
Check it yourself
The pairing uses only the public files on the data page. Take the rows of backtests-m5.json, backtests-m10.json, backtests-m15.json, backtests-m30.json, backtests-m60.json and backtests-m240.json, group them by fam, trig and filt, treat the row whose exit is none as the plain version and every other row in the group as its pair. The columns compared are cagr, win, mdd, test and pass. The data is CC BY 4.0.