Skip to content

Hammers and shooting stars: the classic reversal candles lose money before costs

Three falling candles, then a hammer at a new low. It is one of the most taught reversal setups. On 26,965 trades across every NIFTY 50 stock since 2016 it loses 1.6 bps per trade before costs, and no filter rescues it.

Hammer / shooting star after 3 candles, 15-min, 2R
26,965 trades · 2016–2026−₹1.09 Cr
Verdict

26,965 trades, −₹1.09 Cr. The pattern does worse than a random stock at the same minute.

Candlestick reversals are the first thing most chart courses teach. The textbook version: after three falling red candles, a hammer (a small body with a long lower wick) that makes a new low means sellers are exhausted, so buy. The mirror is a shooting star after three rising green candles: sell.

We coded the definitions exactly and ran them on every NIFTY 50 stock from January 2016 to August 2026:

  • Run: three candles of one colour, each closing beyond the last.
  • Hammer: range at least half the candle ATR, lower wick at least 2× the body and 55% of the range, upper wick at most 20% of the range, making a new low. The shooting star is the mirror image.
  • Trade: enter at the next candle’s open, stop beyond the signal candle, target 2× the risk, close at 15:15. Trades risking more than 3% are skipped. ₹5 lakh per trade.
26,965
trades
15-minute candles
34.3%
win rate
with a 2R target
−1.6 bps
gross edge per trade
before any costs
−₹1.09 Cr
net after costs
every year negative
Cumulative P&L, hammer / shooting star on 15-minute candlesNet of costsWith +3 bps slippage
−₹2Cr−₹1.5Cr−₹1Cr−₹50L₹0₹50L201620182020202220242026

Worse than picking a stock at random

Most setups we test have a small edge that costs eat. This one has none to eat: before any costs the average trade loses 1.6 bps. We also re-ran every trade 200 times on a random NIFTY 50 stock at the same minute and in the same direction. The random picks averaged +0.4 bps, and the hammer beat them in none of the 200 runs.

So the pattern isn’t neutral. After three falling candles, a stock that prints a hammer at a new low tends to keep falling more often than a random stock bought at that moment. In this test, at a 15-minute horizon, these short runs in NIFTY 50 stocks were more likely to continue than to reverse.

Net P&L by year, 15-minute hammer / shooting starProfitLoss
−₹15L−₹10L−₹5L₹02016: −₹7.1 L net, 2,268 trades, 34.3% winners'162017: −₹10.8 L net, 2,308 trades, 33.6% winners'172018: −₹9.8 L net, 2,670 trades, 35.1% winners'182019: −₹7.7 L net, 2,597 trades, 35.1% winners'192020: −₹13.2 L net, 2,560 trades, 33.4% winners'202021: −₹12.2 L net, 2,561 trades, 33.3% winners'212022: −₹10.1 L net, 2,563 trades, 35.1% winners'222023: −₹11.7 L net, 2,390 trades, 33.2% winners'232024: −₹11.6 L net, 2,718 trades, 34% winners'242025: −₹9.2 L net, 2,648 trades, 34.7% winners'252026: −₹5.8 L net, 1,682 trades, 36.3% winners'26
Show as table
YearTradesNetWin %
20162,268−₹7.1 L34.3
20172,308−₹10.8 L33.6
20182,670−₹9.8 L35.1
20192,597−₹7.7 L35.1
20202,560−₹13.2 L33.4
20212,561−₹12.2 L33.3
20222,563−₹10.1 L35.1
20232,390−₹11.7 L33.2
20242,718−₹11.6 L34
20252,648−₹9.2 L34.7
20261,682−₹5.8 L36.3

The usual fixes don’t rescue it

We tried what traders usually add, decided before running anything: wait for a confirming candle, require heavy volume, both, faster 5-minute candles, and a closer 1R target.

Gross edge per trade, before costs (bps)
Textbook (15-min, 2R)−1.6 bps
Wait for a confirming candle−0.3 bps
Volume at least 1.5x average0.9 bps
Confirmation + volume−0.2 bps
5-min candles−0.4 bps
Target 1R−1.2 bps

The best variant earns under 1 bp before costs. A ₹5 lakh round trip costs about 6.5 bps.

VariantTradesGross / tradeWin %Net after costs+3 bps slippage2016-202021-232024-26
Hammer / shooting star after 3 candles, 15-min, 2R26,965−1.6 bps34.3%−₹1.09 Cr−₹1.90 Cr−₹48.6 L−₹34.0 L−₹26.6 L
Wait for a confirming candle8,669−0.3 bps39.4%−₹29.6 L−₹55.5 L−₹9.5 L−₹9.6 L−₹10.4 L
Volume at least 1.5x average6,3030.9 bps37.7%−₹17.7 L−₹36.6 L−₹5.4 L−₹7.9 L−₹4.4 L
Confirmation + volume2,544−0.2 bps40.9%−₹8.5 L−₹16.1 L−₹2.1 L−₹3.5 L−₹2.9 L
5-min candles69,418−0.4 bps34.9%−₹2.39 Cr−₹4.47 Cr−₹1.06 Cr−₹70.4 L−₹62.5 L
Target 1R27,030−1.2 bps47.4%−₹1.04 Cr−₹1.85 Cr−₹45.8 L−₹30.8 L−₹27.1 L

₹5 lakh per trade, 5-minute bars, v2026.08 snapshot (Jan 2016 – Aug 2026), NIFTY 50 point-in-time members, discount-broker (₹20/order) and statutory charges + 1 bp slippage per fill. Generated 2026-10-07.

Confirmation and volume filters cut the number of trades sharply (from 26,965 to 2,544 with both), which shrinks the loss, but the average trade still loses money before costs. The volume filter is the only variant with a positive gross edge, +0.9 bps, still far below the cost of a round trip. Five-minute candles trade 2.6 times as often and lose ₹2.39 crore.

What to take from this

  • A pattern that “looks like” a reversal can be a continuation signal. Test the raw edge before costs first; if it’s negative, no filter or exit will fix it.
  • Filters that cut trades make the loss smaller, not the edge bigger. Fewer trades means less money lost to costs, which is easy to mistake for improvement.
  • Compare against random picks at the same moment. It separates “the pattern has information” from “the market moved”.
The exact code we rancandle_pattern() in dpx_bt · 6 variants · snapshot v2026.08
def candle_pattern(chart=15, confirm=False, vol=0.0, r=2.0):
    """Three falling red candles, then a hammer making a new low -> long, stop below the hammer, target r x risk.
    Mirror: three rising green candles, then a shooting star at a new high -> short. Candles run across days like a
    chart. confirm: wait for the next candle to close beyond the signal candle. vol: candle volume >= vol x its
    20-candle average. Trades risking more than 3% are skipped."""
    def strategy(p):
        c = p.candles(chart)
        o, h, l, cl, v = (p.candle_series(c, f) for f in ('open', 'high', 'low', 'close', 'volume'))
        pc = cl.shift(1)
        atr = np.maximum(h - l, np.maximum((h - pc).abs(), (l - pc).abs())).rolling(14, min_periods=10).mean()
        body, rng = (cl - o).abs(), h - l
        lw, uw = np.minimum(o, cl) - l, h - np.maximum(o, cl)
        big = rng >= 0.5 * atr
        hammer = big & (lw >= 2 * body) & (lw >= 0.55 * rng) & (uw <= 0.2 * rng)
        star = big & (uw >= 2 * body) & (uw >= 0.55 * rng) & (lw <= 0.2 * rng)
        red, green = cl < o, cl > o
        run_red = red.shift(1) & red.shift(2) & red.shift(3) & (cl.shift(1) < cl.shift(2)) & (cl.shift(2) < cl.shift(3))
        run_green = green.shift(1) & green.shift(2) & green.shift(3) & (cl.shift(1) > cl.shift(2)) & (cl.shift(2) > cl.shift(3))
        long = run_red.fillna(False) & hammer & (l < l.shift(1).rolling(3).min())
        short = run_green.fillna(False) & star & (h > h.shift(1).rolling(3).max())
        stop_l, stop_s = l, h
        if confirm:
            long, short = long.shift(1, fill_value=False) & (cl > h.shift(1)), short.shift(1, fill_value=False) & (cl < l.shift(1))
            stop_l, stop_s = l.shift(1), h.shift(1)
        if vol:
            heavy = v >= vol * v.shift(1).rolling(20).mean()
            sig_heavy = heavy.shift(1, fill_value=False) if confirm else heavy
            long, short = long & sig_heavy, short & sig_heavy
        risk = ((cl - stop_l) / cl).where(long, (stop_s - cl) / cl)
        ok = (risk > 0) & (risk <= 0.03)
        long, short = long & ok, short & ok
        return bt.Signals(long=long.reindex(p.index), short=short.reindex(p.index),
                          stop=risk.reindex(p.index), target=(r * risk).reindex(p.index))
    return strategy

Every variant in this post is this function with different arguments, run through dpx_bt over Jan 2016 – Aug 2026.

Try a variation of this test in Ask

Have a variation in mind?

Ask runs your own idea on the same data and rules, with the same report: net after costs, +3 bps stress test, three periods.

Try Ask

Backtest on historical data (Jan 2016 – Aug 2026), net of discount-broker (₹20 per order) and statutory charges and 1 bp slippage per fill. Education and research only, not investment advice. Past results do not predict future returns. Disclaimer.