← All ideas
#074NewPosition sizingSwing

ADR% filter: acceptable stop and selection of fast stocks

A block for stocks. The 20-day ADR% shows how fast a stock moves: only stocks with ADR% at least twice the index's are traded, and trades with a stop wider than ADR% are skipped. Example on the 100-day high breakout card.

Jack Corsellis · Watch video

Markets

Stocks

Timeframe

D1

Data

OHLC

Rules

Partly formalised

Difficulty

Easy

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

ADR% is a stock's average daily range in percent over 20 days: how far the stock usually travels from low to high in a day. Jack Corsellis uses this number for two decisions.

The first decision: what to trade at all. The average ADR% of the S&P 500 and NASDAQ indices is about 1-1.5%. Jack's reasoning is that a stock with ADR% several times the index's moves noticeably more than the index in a trend. In Jack's examples the relationship is not proportional: NVDA has ADR% 2.4 times the index's and rose 56% versus 15%; AIRM has ADR% about 8 times higher and rose 76% versus 32%. A stock with ADR% like the index's barely outperforms the market, even from a perfect pattern. Jack looks for stocks with ADR% at least 1.5-2 times that of QQQ, which in practice means 3% and up. Jack's 3% threshold is soft: Jack bought NVDA at an ADR% of 2.84, and the strict version of the block below would have skipped that trade.

The second decision: whether the stop is acceptable. The initial stop in percent should be smaller than the stock's ADR%. For the best entries with a narrow candle it takes half to two thirds of ADR%, and for Qullamaggie a third to a half. On top of that comes Qullamaggie's anti-chasing filter: do not buy if the stock has already moved more than its ATR on the day.

This is a block, not a system. Entry, stop and exit come from the host strategy, and the block decides whether to let the trade through. Below is an example on the new-high-breakout-ma10-exit card.

Why it might work

The author's explanation: stocks have different characters. A slow stock physically cannot deliver +50% in a few weeks, however good the chart looks. A fast stock works as leverage on the index: if the market rises 10%, a stock with ADR% twice the index's can rise 20%, and one with three times, 30%. Jack notes that the leverage works on the way down too.

A stop measured in fractions of ADR% makes risk comparable across stocks. A stop wider than ADR% means the risk is larger than the stock's usual daily move: the same price move yields fewer initial risks, and the ratio of risk to potential "falls apart". Losses work against the account geometrically, so the author prefers to skip a trade rather than widen the stop.

The NVDA, AIRM and Foot Locker figures come from examples selected after the fact. The videos have no test across all stocks.

Rules

Stock speed (author)

// daily bars, values at the close of the day before entry
ADRpct   = 100 * (Average(High / Low, 20) - 1)
// author: 20 days, range from low to high, the gap between close and open is not counted
// the formula of the TradingView ADR% indicator the author uses
IndexADR = 100 * (Average(IndexHigh / IndexLow, 20) - 1)
// author: the "applicable" index: NASDAQ for a tech stock, otherwise SPY or Dow
Speed    = ADRpct / IndexADR

SpeedOK = Speed >= 2          // author: at least 1.5-2 times, better 2 or more
FastOK  = ADRpct >= 3         // author: "ideally" from 3-4%, the strongest 5-10% and above
// Finetiq: by default we require both conditions, and keep a Speed threshold of 1.5 as a variant
// the author's 3% threshold is soft: the author's NVDA buy at an ADR% of 2.84 passes only on Speed,
// and the default version of the block would have skipped it. The variant without FastOK is in "What to test", item 3

Acceptable stop (author)

// EntryPrice and StopLoss come from the host strategy
RiskPct = (EntryPrice - StopLoss) / EntryPrice * 100
Ratio   = RiskPct / ADRpct

IF Ratio > 1   THEN skip the trade      // author: stop smaller than ADR%
IF RiskPct > 5 THEN skip the trade      // author: more than 5% only for an exceptional setup
                                        // Finetiq: we treat it as a ban

// quality zone by entry type (author)
// narrow trigger bar or inside bar: Ratio from 1/2 to 2/3 (Jack)
// Qullamaggie: Ratio from 1/3 to 1/2, stop usually about half, rarely the full ATR
// shakeout wick or reversal after a gap down: Ratio about 1, up to 1.5 acceptable (Jack)
// Finetiq: for these two entries the Ratio threshold is 1.5 instead of 1

Anti-chasing filter (Qullamaggie as retold by the author)

DayMove = EntryPrice - Close[1]
IF DayMove > ATR(20) THEN skip the trade
// author: do not buy if the stock has already moved more than its ATR on the day
// author: better to enter while 1/3, 1/2 or 2/3 of ATR has been covered
// period 20 from Jack's example; the author did not name the ATR smoothing
// the move is measured on the entry day: from yesterday's close to the entry price; ATR(20) at the prior day's close

Position size after the filter (Finetiq)

Shares = Equity * 0.5% / (EntryPrice - StopLoss)          // Finetiq: starting risk per trade
Shares = MIN(Shares, Equity * 25% / EntryPrice)           // Finetiq: position share cap, as with Qullamaggie
// with a tight stop the size grows quickly, and without a cap one stock would take the whole account

Example: breakout of a 100-day high

The new-high-breakout-ma10-exit card: buy at the open after a close above the 100-day high, exit on a close below MA10, no separate stop. We add the block.

IndexADR = index ADR% over 20 days                     // Finetiq: QQQ for NASDAQ, SPY for NYSE
Signal   = Close > Highest(High, 100)[1]               // from the card
StopLoss = Low - 0.01                                  // Finetiq: signal day low as the initial stop
EstRisk  = (Close - StopLoss) / Close * 100            // Finetiq: estimate before the open

IF Signal AND SpeedOK AND FastOK
   AND EstRisk <= ADRpct AND EstRisk <= 5              // block: acceptable stop, estimated at the close
    BUY AT NEXT BAR OPEN
    SELL STOP at StopLoss

// Finetiq: on the entry day the block is recalculated from the fill price
DayMove = EntryPrice - Close[1]                        // block: anti-chasing filter; Close[1] is the signal day close
RiskPct = (EntryPrice - StopLoss) / EntryPrice * 100
IF DayMove > ATR(20) OR RiskPct > ADRpct OR RiskPct > 5
    EXIT AT CLOSE of this bar                          // same-bar execution, the position is closed on the entry day
// with an entry at the open DayMove equals the gap; ADRpct and ATR(20) at the signal day close

IF Close < SMA(Close, 10) THEN EXIT AT NEXT BAR OPEN  // from the card

Parameters

Parameter Value Source
ADR% period 20 days author
ADR% formula 100 × (average High / Low − 1) author (TradingView indicator)
Index applicable: NASDAQ, SPY or Dow author
Index ADR% about 1-1.5% author
Minimum speed 2 × index (variant 1.5) author
Minimum ADR% 3% author ("ideally" 3-4%), required by Finetiq
Stop versus ADR% less than 1 ADR% author
Absolute stop up to 5% author, ban Finetiq
Zone for a narrow candle 1/2-2/3 ADR% (Qullamaggie 1/3-1/2) author
Reversal candles up to 1.5 ADR% author
Anti-chasing filter entry day's move no larger than ATR(20) author, period from the example
Risk per trade 0.5% Finetiq
Position share cap 25% of the account Finetiq (per qullamaggie-breakout)
Example: stop signal day low Finetiq

What to test

  1. Does speed add anything. Take one host strategy on a broad universe and split trades by Speed: below 1.5, 1.5-2, 2-4, above 4. Compare the average trade in percent and in R, the win rate and the maximum drawdown. Leverage works both ways, so look at the result including losses.
  2. Stop threshold. Split trades by Ratio: below 1/3, 1/3-1/2, 1/2-2/3, 2/3-1, above 1. If trades with a stop wider than ADR% are no worse than the rest, the filter only shrinks the sample.
  3. Parameter neighborhood. ADR% period of 10, 20 and 50 days. Speed of 1.5, 2 and 3. Minimum ADR% of 2, 3 and 4%, and no threshold (Speed only). Ratio threshold of 0.75, 1 and 1.5.
  4. Anti-chasing filter. With and without it, thresholds of 0.5, 1 and 1.5 ATR. For breakout strategies a strong day is the signal itself, so the filter may cut the best trades.
  5. Absolute and relative thresholds. For stocks with ADR% of 10% or more, half of ADR% already exceeds 5%. Compare the rule "Ratio only" with the rule "Ratio and no more than 5%".
  6. ADR% versus ATR%. The High / Low formula does not see gaps, while ATR accounts for them. Compare both variants on stocks with frequent earnings gaps.
  7. Costs. Fast stocks have wider spreads and more slippage on stop orders. The filter does not catch slippage when price gaps through the stop, so account for it separately.

Platform notes

TradingView (Pine Script)

  • ADR% in one line: 100 * (ta.sma(high / low, 20) - 1). For the index, use the same expression inside request.security with the index symbol on the daily timeframe.
  • If extended hours are enabled on the chart, the day's High and Low include the premarket, and ADR% comes out larger. Calculate on the regular session.
  • ta.atr uses Wilder smoothing. For the anti-chasing filter the difference from a simple average is small, but a day right at the threshold may fall on either side.
  • Selection by Speed across the whole universe cannot be reproduced in a strategy: it trades only the chart symbol.

MultiCharts and TradeStation (EasyLanguage)

  • ADR%: 100 * (Average(High / Low, 20) - 1). The index as a second data stream: 100 * (Average(High of Data2 / Low of Data2, 20) - 1).
  • AvgTrueRange(20) is a simple average of TrueRange, not Wilder. If you compare with Pine, the anti-chasing filter will select slightly different days.
  • Place the block check before Buy next bar at market, and set the stop as a price: Sell next bar at StopLoss stop. SetStopLoss works in money.
  • Selection by speed across many stocks is done in Portfolio Maestro or Portfolio Trader. In a portfolio test, the index has to be attached to each stock.

MetaTrader 5 (MQL5)

  • A stock CFD's daily bar is built on server time and may include extended hours. ADR% will differ from that of the exchange-listed stock, and the 3% and 2× thresholds will shift.
  • Calculate Speed from the stock and the index at the same broker: an index CFD (US500, USTEC) also has its own daily range.
  • iATR is a simple average of TR, as in EasyLanguage. Take values from the closed bar (index 1).
  • Brokers whose server is not on GMT+2/+3 may have short Sunday bars. They understate the 20-day average range.

Where the idea can break

  • All examples were selected after the fact. Jack shows fast stocks that rose and one slow stock that lagged. The videos show no fast stocks that produced a losing streak.
  • The threshold relative to the index depends on the market regime. In a panic, the index ADR% rises to 2-3%, and the filter lets almost nothing through. In a quiet market, more stocks pass it.
  • A stop smaller than ADR% on daily bars does not protect against an overnight gap. The actual loss on some trades will exceed RiskPct.
  • The High / Low formula ignores gaps. A stock that moves a lot overnight on news looks calmer than it is.
  • The filter cuts trades with a wide stop. On post-earnings gaps (the episodic-pivot card) the stop is often wider than ADR%, and the block may remove precisely the strongest events.
  • The 3% and 1-1.5% index thresholds were given for US growth stocks. On futures, currencies and bonds the numbers are different, and the block needs recalibration.

Sources

Author's claims

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

  • NVDA: 20-day ADR% of 2.84% versus 1.19% for the NASDAQ, about 2.4 times higher. Until the first close below EMA 21 the stock rose 56%, while the NASDAQ-100 rose 15% over the same period.
  • AIRM: ADR% of 7.42% with the index ADR% below 1%, about 8 times. The stock rose 76%, while SPY rose about 32% over the same period.
  • Foot Locker with a low ADR%: two technically clean breakouts gave about 13% and 12-13% until a close below EMA 21, in both cases about 4% more than the S&P 500 over the same period. Jack attributes this to the stock's slow character.
  • Jack hand-picked all the examples (about 40 charts from 1980 to 2024). The video does not show how often fast stocks produced losses.

Related ideas

Updated: 2026-09-11