← All ideas
#064NewMean reversionSwing

Pullback to an average with a demand tail and Charles Harris's upside reversal

A stock in an uptrend pulls back to EMA 10, EMA 21 or SMA 50, and a candle undercuts the lows and closes near its high. Buy above its high, stop below its low. Harris variant: a market filter and a pullback of 10% or more.

Jack Corsellis · Watch video

Markets

Stocks

Timeframe

D1

Data

OHLC, Volume, Instrument universe

Rules

Partly formalised

Difficulty

Medium

Status

Untested

Some rules were added by us and are marked in the text.

TradingView ports directly
EasyLanguage has pitfalls
MetaTrader 5 has pitfalls

Idea in brief

Jack Corsellis swing trades leading stocks and enters on three types of candles. One of them is the demand tail (shakeout demand tail). A stock in an uptrend pulls back to a key average. On some day price drops, undercuts recent lows or the average itself, triggers stops and is then bought back. The candle closes near the high with a long lower shadow: a hammer, a dragonfly doji or a takuri. Volume on such a pullback is below average. Entry is a stop order through the candle's high, with the stop one cent below the low.

In variant B, from another video, Jack breaks down the approach of Charles Harris, a student of William O'Neil. Harris buys pullbacks in leaders only in a strong market and calls the signal an upside reversal. It is the same demand tail or a gap down with a reversal. To the candle Harris adds a market filter, a minimum pullback depth and an exit rule based on the 50-day average.

A gap down with a reversal at an average is covered in card #037: there a gap and an open at the low are required, while here the signal comes from the shape of the candle. An undercut of a low as a level appears in card #031 (variant 2B), without an average or a trend.

Why it might work

Jack's explanation comes from Wyckoff. Large players who accumulate a stock do not let it fall below certain levels. An undercut of the lows shakes out weak holders, and a long lower shadow shows that their selling was absorbed right away. Low volume on the pullback means there is little supply. The closer the close is to the high, the stronger the demand.

Harris adds market context. In a bull market, pullbacks hold at averages and prior support levels, while in a bear market most stocks find no support. Buying a pullback gives a lower entry price than a breakout, and breakouts, in Harris's observation, shake buyers out more and more often.

Bulkowski's statistics describe the candle in general, without the average, the trend or this stop. Jack draws the conclusion that the numbers are far from 100%, so a stop is mandatory.

Rules

Context (author, Finetiq thresholds)

// daily stock bars
EMA10 = EMA(Close, 10);  EMA21 = EMA(Close, 21)
SMA50 = SMA(Close, 50);  SMA200 = SMA(Close, 200)
ADRpct = 100 * (Average(High / Low, 20) - 1)      // author: 20-day ADR%; formula Finetiq

Trend = Close > SMA200                              // author: uptrend above the 200 SMA
        AND Close > SMA50 * 0.97                    // author: preferably above the 50 SMA; tolerance Finetiq
        AND SMA50 > SMA50[20]                       // Finetiq

Demand tail at an average (author, Finetiq thresholds)

Range     = High - Low
LowerTail = min(Open, Close) - Low
Tail      = LowerTail >= 0.5 * Range              // Finetiq: hammer, dragonfly, takuri
StrongClose = Close - Low >= 0.7 * Range          // author: the closer to the high, the better; 70% Finetiq

Tol = 0.25 * ADRpct / 100 * Close                  // Finetiq: "near the average"
Touch(MA) = Low <= MA + Tol AND Close >= MA - Tol  // author: at the average, near it or slightly below
KeyMA = Touch(EMA21) OR Touch(SMA50)
        OR (Touch(EMA10) AND ADRpct >= 4)          // author: 10 EMA for fast stocks with ADR of 4-6% or more

Undercut = Low < Lowest(Low, 5)[1]                 // author: undercut of recent lows; window Finetiq
DryVolume = Volume < Average(Volume, 30)[1]        // author: below the 30-day average

Setup = Trend AND Tail AND StrongClose AND KeyMA AND (Undercut OR Low < EMA21) AND DryVolume

Entry and stop (author)

RiskPct = 100 * (High - Low) / High

IF Setup AND RiskPct <= 1.5 * ADRpct AND RiskPct <= 5
    // author: ideally risk below ADR%, up to 1.5 × ADR% with a stop of up to 4-5%
    // author: above 5% only for an exceptional setup; Finetiq: not allowed
    BUY STOP LIMIT: stop = High + 0.01, limit = High + 0.01 + 0.25 * ADRpct / 100 * Close
    // author: stop-limit through the high; limit width and a lifetime of 1 day Finetiq

StopLoss = Low - 0.01                               // author: one cent below the candle's low
SELL STOP at StopLoss

Trade management (partly author)

R = EntryPrice - StopLoss
// the author expects to make the trade free within 3-5 sessions with a 1-3R target
IF High >= EntryPrice + 2 * R THEN SELL 1/3 AT LIMIT, StopLoss = EntryPrice      // Finetiq
IF BarsSinceEntry >= 5 AND High since entry < EntryPrice + 1 * R
    EXIT AT NEXT BAR OPEN                                                        // Finetiq

// author: trailing stop on a close below the average chosen from the stock's history
TrailMA = EMA10 IF ADRpct >= 4 ELSE EMA21                                        // Finetiq
// the threshold of 4 is the same as for the EMA 10 support above: the author calls EMA 10 effective for stocks with ADR% of 4-6
IF Close < TrailMA THEN EXIT AT NEXT BAR OPEN

Variant B. Charles Harris's upside reversal

// market
Market = Close of Index > EMA(Close of Index, 21)    // author: nothing good below the 21-day average

// stock: higher highs and higher lows, a rising 50-day average
Uptrend = SMA50 > SMA50[10]                                          // author
          AND Highest(High, 60) > Highest(High, 60)[60]              // Finetiq: higher highs
          AND Lowest(Low, 60)[20] > Lowest(Low, 60)[80]              // Finetiq: higher lows

RecentHigh = Highest(High, 40)
Depth = (RecentHigh - Low) / RecentHigh
DeepEnough = Depth >= 10%                            // author: more than 10%, usually 12-20%, 16-18% on average

Support = Touch(EMA21) OR Touch(SMA50) OR Touch(SMA200)   // author; the prior base high counts too, Finetiq does not code it
UR = (Tail AND StrongClose)                               // demand tail
     OR (Open < Close[1] AND Open - Low <= 0.1 * Range AND StrongClose)   // gap down with a reversal, as in #037
// author: the gap is measured from yesterday's close, the open is near the day's low; 10% range tolerance Finetiq
HeavyVolume = Volume > Average(Volume, 30)[1]        // author: Harris prefers heavy volume; Finetiq: a required condition

IF Market AND Uptrend AND DeepEnough AND Support AND UR AND HeavyVolume
    BUY STOP at High + 0.01                          // author: buy through the high of the reversal
StopLoss = Low - 0.01                                // author: the reversal low is broken, the action is abnormal

// adding: each subsequent upside reversal (author), no more than 2 adds and only to a winner (Finetiq)

// exit: a decisive break of the 50-day average on rising volume (author)
Break50 = Close < SMA50 - 0.5 * ADRpct / 100 * Close AND Volume > Average(Volume, 30)[1]   // Finetiq
IF Break50 AND position profit < 3R THEN EXIT AT NEXT BAR OPEN
IF Break50 AND profit >= 3R AND the day is not the last trading day of the week
    SELL 1/2 AT NEXT BAR OPEN                        // author: with a large cushion, sell part
    remainder: EXIT if the week closed below SMA50   // author: wait for the weekly close
IF Break50 AND profit >= 3R AND the day is the last trading day of the week
    EXIT AT NEXT BAR OPEN                            // Finetiq: this day's close is the weekly close below SMA50

Stock selection (author, outside the signal)

Both authors take only leaders: an RS line at 52-week highs, support at averages in the past, a positive reaction to earnings. Harris also requires a fundamental track record in line with CANSLIM. The card describes a signal on a single symbol, and the leader scan is done separately.

Parameters

Parameter Value Source
Timeframe daily bars author
Trend above SMA 200, preferably above SMA 50 author
Rising SMA 50 over 20 bars Finetiq
Key averages EMA 10, EMA 21, SMA 50 author
EMA 10 only with ADR% of 4 or more author (threshold 4: Finetiq, within the author's range of 4-6)
Lower shadow at least 50% of the range Finetiq
Close in the top 30% of the range Finetiq (principle: author)
Average touch tolerance 0.25 × ADR% Finetiq
Volume below the 30-day average author
Maximum risk up to 1.5 × ADR% and no more than 5% author (up to 1.5 × ADR%), Finetiq (ban above 5%; for the author more than 5% only for an exceptional setup)
Entry stop-limit through the high, 1 day author (lifetime and limit: Finetiq)
Stop one cent below the low author
Partial exit 1/3 at +2R, stop to breakeven Finetiq (1-3R target within 3-5 sessions: author)
Time exit no +1R within 5 sessions Finetiq
Trailing stop close below EMA 10 with ADR% of 4 or more, otherwise EMA 21 Finetiq (close below an average: author; threshold as for the EMA 10 support)
B: market filter index above the 21-day EMA author
B: pullback depth 10% or more from the 40-bar high author (window: Finetiq)
B: reversal volume above the 30-day average author (Harris's preference), required by Finetiq
B: exit decisive break of SMA 50 on rising volume author (0.5 ADR threshold: Finetiq)
B: cushion for waiting for the weekly close profit of 3R or more Finetiq

What to test

  1. Reversal volume. Jack wants light volume, Harris wants heavy volume. Run the same candles with DryVolume, with HeavyVolume and with no volume filter. This is a direct disagreement between the two sources.
  2. Which average. EMA 10, EMA 21 and SMA 50 separately, and for EMA 10 also stocks with ADR% below 4 and above 4. If the average adds nothing beyond the candle and the trend, the location is only nominal.
  3. Candle shape. A shadow of 40, 50, 60% of the range and a close in the top 20, 30, 40%. Separately the hammer, the dragonfly and the takuri. Compare the ranking of results with Bulkowski's ranking: 66% for the takuri, 60% for the hammer, 50% for the dragonfly.
  4. Pullback depth. No filter, 10% or more, within 12-20%. Harris names 16-18% as the average pullback depth in Harris's study, not as a profitability threshold.
  5. Market filter. Index above the 21-day EMA versus no filter, with 2008, 2018 and 2022 checked separately. According to Harris, pullbacks in a bear market without the filter are terrible.
  6. Exit. Trailing on EMA 10 and EMA 21 versus a break of SMA 50 with the weekly rule and versus an exit after 10 days. Jack chooses the average from the chart's history. A mechanical choice by ADR% is our simplification.
  7. Stop-limit versus stop. How many entries the limit missed because of a gap up, and how expectancy changed.

Platform notes

TradingView (Pine Script)

  • Stop-limit: strategy.entry("L", strategy.long, stop = h, limit = h + off). The order stays active until canceled, so after one day strategy.cancel("L") is needed.
  • Index for variant B: request.security("SP:SPX", "D", ta.ema(close, 21)). On a daily chart the timeframe is the same, and the value is taken for the same closed day without lookahead.
  • Weekly rule: Friday is not always the last trading day, and holidays shift the weekly close. Check for a change of week on the next bar rather than the day of the week.
  • The strategy does not scan for leaders: it trades only the chart symbol. Leaders are selected with a screener outside the strategy, and a test on today's list contains survivorship bias.

MultiCharts and TradeStation (EasyLanguage)

  • The daily bar depends on the symbol's session template. If the session includes premarket, the day's low and the candle's tail will differ from exchange data. Use the regular session.
  • The index is added as a second data stream: Close of Data2. Check that the trading day calendars match, otherwise the index's EMA 21 will shift relative to the stock.
  • The language has stop-limit orders, but the syntax differs between TradeStation and MultiCharts. It is simpler to test Buy next bar at High + 0.01 stop (lives exactly one bar) and separately count the entries the limit would have missed.
  • Set the stop as a price on every bar: Sell next bar at StopLoss stop. SetStopLoss is set in money, while a price level below the candle's low is easier to check against the rules.

MetaTrader 5 (MQL5)

  • Stock CFDs have only tick volume. A filter for volume below or above the 30-day average is approximate on it, and the disagreement between Jack and Harris cannot be tested. For volume you need exchange-traded stocks with iRealVolume.
  • The Buy Stop Limit order type (ORDER_TYPE_BUY_STOP_LIMIT) exists in MT5, but not every broker accepts it for stocks. Set the expiration to the next day.
  • The index for the market filter at a broker is usually a CFD: its daily bar is built on server time and does not close at 16:00 ET. The EMA 21 of such a series differs from the EMA of the cash index.
  • Charts are built on Bid, while a buy triggers on Ask. The entry happens earlier by the spread, and a stop one cent below the low of a Bid bar is too tight for stocks with a wide spread.

Where the idea can break

  • Neither author has a backtest of the setup. Bulkowski's numbers apply to candles in general, and Harris's numbers apply to discretionary trading in front of a screen all day.
  • Harris's statistics come from 1999, at the peak of the bubble, and 2020 rests on Tesla alone. Whether such years repeat in other periods has not been shown.
  • Jack chooses the trailing average by looking at the past trends of a specific stock. This is reasonable for manual trading, but in a test it easily turns into hindsight overfitting.
  • The sources disagree on volume: Harris wants heavy volume on the reversal, Jack wants light volume. A mechanical version with one filter represents only one of them.
  • Harris's fundamental selection and Jack's assessment of leadership are not part of the rules. Without them the signal catches every stock with a similar candle, including weak ones.
  • A long tail means a wide stop. The 1.5 ADR% filter removes the candles with the strongest shape, and quiet stocks produce few setups.

Sources

  • LEARN a Pro Swing Trading Setup │ SHAKEOUT DEMAND TAILS │ Guided Tutorial

    Jack Corsellis

    • 01:55Demand tail: hammer, dragonfly doji, takuri
    • 02:05Bulkowski's statistics: a reversal in 60%, 50% and 66% of cases
    • 04:27Uptrend: above the 200 SMA, preferably above the 50 SMA
    • 04:41Key averages: 10 EMA, 21 EMA, 50 SMA
    • 05:41The closer the close to the high, the better
    • 06:39Stop below ADR%, up to 1.5 ADR, above 5% only in exceptions
    • 07:43A free trade within 3-5 sessions at 1-3R
    • 10:51Volume on the pullback below the 30-day average
    • 12:08Stop-limit through the high, stop one cent below the low
    • 18:17EMA 10 suits stocks with ADR of 4-6% or more
    • 34:04Sell rules based on the stock's history: a close below the 10 or 21
  • CHARLES HARRIS Swing Trading Pullback Strategy EXPLAINED | How he made MILLIONS

    Jack Corsellis · Charles Harris

    • 03:12Nothing good below the 21-day average
    • 11:39Statistics for 1999
    • 14:06Pullbacks only in a strong market, with the stock in an uptrend
    • 18:03Wait for an upside reversal, preferably on heavy volume
    • 18:48Risk: the low of the reversal bar
    • 19:36Pullback of more than 10%, usually 12-20%, 16-18% on average
    • 22:23Two reversal types: a demand tail and a gap down with a reversal
    • 29:29Harris favors heavy volume, Jack does not mind light volume
    • 39:33A break of the 50-day average mid-week: wait for the weekly close

Author's claims

These figures and statements are the author's. We have not verified them.

  • Jack Corsellis cites Thomas Bulkowski ("Encyclopedia of Candlestick Charts", 4.7 million candle combinations, about 20,000 records per type): the reversal rate is 60% for the hammer, 50% for the dragonfly doji and 66% for the takuri. This is the direction in which price leaves the pattern, not the win rate of trades.
  • Charles Harris on 1999 (a quote on Jack's slide): about 60% winning trades, an average holding period of 7 days, an average gain of 16%, an average loss of 6%, 10 profitable months out of 12, minus 8% after the first quarter and +1031% for the year on about 700 trades.
  • Jack: according to Jack's data, Harris made about 1400% in 2020, and about 80% of the profit came from Tesla.

Related ideas

Updated: 2026-09-11