Relative Strength and Prior-Day Levels: Retests and Reclaims

Video: I Traded This Strategy Every Day for 1 Year And Didn’t Lose…
Creator: Jdub Trades
Original Video: Watch the original video
Difficulty: Advanced

The Big Idea

Jdub Trades separates stock selection from execution. First identify a favorable higher-timeframe context and relatively strong stocks. Then wait for either a break-and-retest of the previous day’s high or an undercut-and-reclaim of the previous day’s low.

Both models seek a long trade within a broader bullish thesis, but they respond to different intraday events. One joins strength after a level changes roles; the other looks for a failed move beneath support.

The title’s loss-free framing requires clarification. The presenter explicitly acknowledges losing trades and weeks and reports green months in a 2026 year-to-date record. That is not the same as never losing, and it does not independently establish a complete, audited year of results.

Build the Market Map Before Selecting an Entry

The source begins with daily, hourly, or weekly structure and primarily looks for bullish continuation. Its nine- and 21-period EMAs help describe momentum and the location of price relative to recent averages.

A stock above both averages can have a favorable trend context while still being extended, consolidating, or vulnerable to a pullback. The averages are tools for classification, not universally “best” momentum settings or guarantees that price will continue.

The statement that the market is designed to rise should also be treated carefully. A long bias is a strategy choice; an individual stock can fall sharply or remain weak regardless of the broader market’s long-term history.

For a repeatable scan, record the structure, average conditions, relevant levels, and available room before moving to the entry chart. Daily flags and wedges require their own objective definitions if they are to be included in a test.

Relative Strength Needs a Common Scale

The presenter compares potential trades with QQQ. Invesco’s QQQ description explains that it tracks the Nasdaq-100, comprising 100 of the largest non-financial companies traded on Nasdaq. It is not simply an equal-weighted collection of the world’s 100 largest companies.

A stock’s raw price line sitting above QQQ’s raw price line does not show outperformance. Compare returns over the same interval or normalize both price series to the same starting value.

Original 20-session exampleStarting priceEnding priceReturnDifference versus benchmark
Stock A100112+12%+7 percentage points
Benchmark400420+5%Reference
Stock B5051+2%−3 percentage points

Stock A outperformed despite having a lower nominal share price than the benchmark. Stock B rose but lagged. This is relative performance, not RSI, and it does not guarantee the ranking will persist.

Higher past returns may also reflect greater market sensitivity or a stock-specific event. A relatively strong stock can fall more sharply than QQQ during a later decline. Historical outperformance does not establish a reliable upside or downside multiplier.

Model One: Break Above the Previous High, Then Retest

The first model waits for price to move above the previous day’s high and subsequently return to that area. The source looks for buying on the retest, a stop beneath the relevant candle, and continuation toward the day’s high or a fixed 2R objective.

The logic is a potential resistance-to-support transition. A break alone is incomplete evidence: price may return beneath the level rather than defend it.

Define the break, the permitted retest tolerance, the reaction required, and the waiting period. A completed bullish candle at the level differs from an early discretionary buy while the candle is still forming.

Also define what “high of day” means. The high already recorded before entry is available information; the final session high is not. A target that moves to the best later high would introduce hindsight.

Model Two: Undercut the Previous Low, Then Reclaim

The second model allows price to move beneath the previous day’s low before recovering above it. The source places protection near the low of day and seeks an upward reversal consistent with the higher-timeframe thesis.

This is a failed-break hypothesis, not proof that sellers have been trapped. A reclaim can fail again, and a price chart does not reveal all orders or participant positions.

The low of day must be the lowest price observed by the entry decision, not the eventual full-day low. As price spends longer below the level, the setup may become different from a quick undercut. Specify an expiry rather than waiting indefinitely for any later recovery.

DecisionBreak and retestUndercut and reclaim
ReferencePrevious-day highPrevious-day low
Initial eventMove above resistanceMove beneath support
Entry evidenceA later return holds and reacts upwardA close recovers the broken level
Risk referenceRetest candle’s lowLow of day known at entry

Risk Distance Determines Size

In an original break-retest example, an entry at 100.50 with a 99.80 stop carries 0.70 of price risk per share. A 2R target is 101.90. A hypothetical $140 price-risk budget permits 200 shares before costs.

An undercut trade entered at 100.50 with a known day low at 98.50 and a 98.40 stop has 2.10 of price risk. The same budget permits 66 whole shares before costs. Equal share quantity would expose the account to three times the risk distance.

If entry slips or gaps, recompute actual reward/risk and exposure. “Tight stop” should describe a defined failure point, not an assumption that execution will make the loss small.

The Options Example Is a Different Product

The video includes an Nvidia swing trade using call options and reports a large percentage increase in the contracts. That illustrates the presenter’s broader process, but it is separate from an intraday share trade at the previous-day high.

Option value depends on the underlying, strike, remaining time, volatility, rates, and dividends, as described by the Options Industry Council’s option-price explanation. A favorable underlying move does not imply a fixed percentage return on a call.

The transcript’s option-price targets and some ticker references are inconsistent. Exact contract records would be needed to reconstruct the example. The research strategy below does not simulate options, expiration, or their spreads.

Pine Script: Compare the Two Models

Expand the complete Pine Script research strategy

//@version=6
strategy("Prior-day retest and reclaim with relative strength", overlay=true,
     initial_capital=25000, pyramiding=0, margin_long=100,
     commission_type=strategy.commission.percent, commission_value=0.01,
     slippage=2, calc_on_order_fills=true, calc_on_every_tick=false,
     process_orders_on_close=false)

model = input.string("Both", "Entry model", options=["Break and retest", "Undercut and reclaim", "Both"])
benchmark = input.symbol("NASDAQ:QQQ", "Relative-strength benchmark")
rsBars = input.int(20, "Completed daily return lookback", minval=1)
useRS = input.bool(true, "Require outperformance of benchmark")
useTrend = input.bool(true, "Require stock above daily 9 and 21 EMA")
useMarketTrend = input.bool(true, "Require benchmark above daily 9 and 21 EMA")
toleranceATR = input.float(0.10, "Retest tolerance / prior intraday ATR", minval=0)
expiry = input.int(20, "Break-retest expiry, chart bars", minval=1)
reclaimExpiry = input.int(3, "Undercut-reclaim expiry, chart bars", minval=0)
reward = input.float(2, "Target R from actual fill", minval=0.1)
cashRisk = input.float(100, "Estimated cash risk before costs", minval=1)
maxShares = input.int(1000, "Maximum shares", minval=1)
maxEntries = input.int(1, "Maximum submitted entries per session", minval=1)
lastEntryMinute = input.int(930, "Last entry: NY minutes (930 = 15:30)", minval=571, maxval=959)
flattenMinute = input.int(960, "Flatten: NY minutes (780 = 13:00)", minval=571, maxval=1440)

if barstate.isfirst and (not chart.is_standard or not timeframe.isintraday)
    runtime.error("Use standard intraday US equity candles.")
if session.ispremarket or session.ispostmarket
    runtime.error("Disable extended hours for this regular-session test.")

f_daily() =>
    [close[1], ta.ema(close, 9)[1], ta.ema(close, 21)[1], high[1], low[1], close[1] / close[rsBars + 1] - 1]

regularTicker = ticker.new(syminfo.prefix, syminfo.ticker, session.regular)
[dClose, dEMA9, dEMA21, pdHigh, pdLow, stockReturn] = request.security(regularTicker, "D",
     f_daily(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
[bClose, bEMA9, bEMA21, bHigh, bLow, benchmarkReturn] = request.security(benchmark, "D",
     f_daily(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
eligible = (not useTrend or (dClose > dEMA9 and dClose > dEMA21)) and
     (not useMarketTrend or (bClose > bEMA9 and bClose > bEMA21)) and
     (not useRS or stockReturn > benchmarkReturn)
atr = ta.atr(14)
minutesOpen = hour(time, "America/New_York") * 60 + minute(time, "America/New_York")
minutesClose = hour(time_close, "America/New_York") * 60 + minute(time_close, "America/New_York")
firstBar = minutesOpen == 570

varip int stage = 0
varip int setupBar = na
varip float tolerance = na
varip float dayLow = na
varip int entries = 0
varip float tradeStop = na
varip float tradeTarget = na
varip float seenPosition = 0.0
varip int lastFillBar = na
fillPass = strategy.position_size != seenPosition
seenPosition := strategy.position_size

if fillPass
    lastFillBar := bar_index
    if strategy.position_size > 0
        distance = strategy.position_avg_price - tradeStop
        if distance > 0
            tradeTarget := strategy.position_avg_price + reward * distance
        else
            tradeTarget := na
            strategy.close("L", comment="Fill beyond stop", immediately=true)

if not fillPass and barstate.isconfirmed
    if firstBar
        stage := 0
        entries := 0
        dayLow := low
    else
        dayLow := na(dayLow) ? low : math.min(dayLow, low)
    window = minutesOpen >= 570 and minutesClose < math.min(lastEntryMinute, flattenMinute)

    if strategy.position_size == 0 and (na(lastFillBar) or bar_index > lastFillBar)
        if not eligible or not window
            stage := 0
        else if entries < maxEntries
            if stage == 1 and (bar_index - setupBar > expiry or close < pdHigh - tolerance)
                stage := 0
            if stage == 2 and bar_index - setupBar > reclaimExpiry
                stage := 0
            ambiguous = high > pdHigh and low < pdLow
            if stage == 0 and not ambiguous and not na(atr[1])
                if model != "Break and retest" and low < pdLow
                    stage := 2
                    setupBar := bar_index
                else if model != "Undercut and reclaim" and close > pdHigh and close[1] <= pdHigh
                    stage := 1
                    setupBar := bar_index
                    tolerance := atr[1] * toleranceATR

            retest = stage == 1 and bar_index > setupBar and low <= pdHigh + tolerance and
                 high >= pdHigh - tolerance and close > pdHigh and close > open
            reclaim = stage == 2 and close > pdLow and close > open
            if retest or reclaim
                candidateStop = (reclaim ? dayLow : low) - syminfo.mintick
                unitRisk = (close - candidateStop) * syminfo.pointvalue
                shares = unitRisk > 0 ? math.floor(math.min(maxShares, cashRisk / unitRisk)) : 0
                if shares >= 1
                    tradeStop := candidateStop
                    tradeTarget := na
                    entries += 1
                    strategy.entry("L", strategy.long, qty=shares, comment=reclaim ? "Undercut reclaim" : "Break retest")
                    strategy.exit("L-bracket", "L", stop=tradeStop)
                stage := 0

    if minutesClose == flattenMinute
        strategy.cancel_all()
        strategy.close_all(comment="Session flatten", immediately=true)

if strategy.position_size > 0 and not na(tradeTarget)
    strategy.exit("L-bracket", "L", stop=tradeStop, limit=tradeTarget)

plot(pdHigh, "Previous regular-session high", color=color.orange)
plot(pdLow, "Previous regular-session low", color=color.blue)
plot(strategy.position_size > 0 ? tradeStop : na, "Stop", color=color.red, style=plot.style_linebr)
plot(strategy.position_size > 0 ? tradeTarget : na, "Target", color=color.green, style=plot.style_linebr)
plot((stockReturn - benchmarkReturn) * 100, "Daily outperformance, percentage points", display=display.data_window)

This original long-only strategy uses completed daily observations for the stock’s nine- and 21-EMA condition, the benchmark’s equivalent condition, and a 20-session percentage-return comparison. All three filters can be toggled.

Our entry definitions: a confirmed close above the previous regular-session high arms the break-retest model. A later candle must overlap a frozen ±0.10 prior intraday ATR tolerance and close bullish above the level. An opening gap that finishes above the level can count as the initial break.

The undercut model arms when price trades beneath the previous low, then requires a bullish close back above within three subsequent bars; the sweep candle itself may supply that reclaim. Its stop uses the session low known at that close. A candle crossing both daily edges is rejected as ambiguous.

Other research defaults are a 20-bar retest expiry, one submitted entry per session, estimated $100 cash risk capped at 1,000 shares, and a 2R target from the actual fill. These quantities and thresholds are ours, not the source’s exact rules.

Execution QA

Use standard intraday US equity candles with extended hours disabled and a 9:30 New York opening. The source demonstrates one-minute timing; changing the chart timeframe changes the confirmation and expiry intervals.

Daily requests return offset, completed values with lookahead enabled, preventing use of the current day’s eventual daily close or range. Relative strength is a difference between matching daily percentage returns, not a comparison of raw price levels.

A valid active setup is retained until entry, invalidation, expiry, or a new session. In the combined mode, the first eligible setup occupies that state; it is not two independent strategies trading simultaneously. Test each model separately before interpreting the combined results.

Signals use completed candles. Market entries normally fill at the next bar’s open, with initial protection submitted alongside entry. A fill-only recalculation sets the target from actual entry and frozen stop without using that fill bar’s completed high or low to generate another setup. A fill beyond the stop prompts an immediate simulated exit.

Position quantity is estimated from the signal close, so actual cash risk can change after a gap. The 100% margin setting can prevent a qualifying order from filling. Commission defaults to 0.01% per fill and slippage to two ticks, adjustable in Strategy Properties; variable spreads, partial fills, and venue restrictions are absent.

The session flatten uses an immediate simulated closing fill, an optimistic assumption requiring cost stress. Set the flatten minute to 780 for a 13:00 early close; the entry cutoff is capped by that setting. Holidays are not detected automatically.

This is a single-symbol share strategy. It does not rank a whole watchlist, simulate options, identify discretionary flags or wedges, or reproduce the source’s live record. Same-bar bracket outcomes depend on emulator assumptions; inspect them with Bar Magnifier where available. The code has been reviewed but has not been compiled or backtested in TradingView.

Backtest Lab

ComparisonChange one assumptionEvaluate
Entry modelBreak-retest versus undercut-reclaimNet expectancy, stop distance, trade frequency
Relative performanceToggle the benchmark-return filterWhether outperformance improves later trade outcomes
Trend contextToggle stock or benchmark EMA conditions separatelyOpportunity exclusions and drawdown
Execution stressIncrease slippage and commissionWhether tight-stop gains survive friction

Use the same instruments and dates, include all qualifying losses, and reserve an untouched period for validation. A historical watchlist should reflect stocks actually available then, rather than only today’s successful constituents. Consider sector correlation when combining trades across several relatively strong names.

Interpret the Monthly Claim Correctly

The presenter distinguishes green months from losing trades and weeks. Monthly aggregation can conceal a difficult drawdown, substantial daily risk, or dependence on a small number of large winners.

Assess the complete chronological record, costs, risk units, exposure, and worst losing stretches. Several positive months do not establish that the next month will be positive or that the strategy generalizes to another trader’s account.

Final Takeaway

The framework gives stock selection and entry timing separate jobs. Higher-timeframe context and relative performance identify candidates; a defined retest or reclaim supplies the trigger. Consistency means applying those rules when opportunities occur and accepting valid losses, rather than expecting every trade or month to finish green.


Risk Disclosure: This material is for educational and research purposes only and is not financial or investment advice. Trading can result in substantial losses. Backtests are hypothetical, depend heavily on their assumptions, and cannot reproduce every aspect of live execution. Commissions, spreads, slippage, liquidity, gaps, order behavior, market regime changes, and discretionary decision-making can materially affect results. Options involve additional pricing, expiry, and leverage risks and can lose their entire premium. Historical results do not guarantee future performance.

This article is an independent educational companion to the video and is not affiliated with, sponsored by, endorsed by, or authorized by Jdub Trades.

As an Amazon Associate I earn from qualifying purchases.