← All ideas
#075NewMean reversionSwing

Wyckoff: effort without result at an extreme and a failed retest

Toby Crabel: at multi-day highs and lows, volume is often high while the range narrows. This is a warning, not an entry: wait for a retest of the level and its failure. Volume and range are normalized by a 10-20 day average.

The Algorithmic Advantage · Toby Crabel · Watch video

Markets

Futures

Timeframe

D1, M30

Data

OHLC, Volume, Session times

Rules

Partly formalised

Difficulty

Medium

Status

Untested

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

TradingView has pitfalls
EasyLanguage has pitfalls
MetaTrader 5 needs data or workarounds

Idea in brief

Toby Crabel, founder of Crabel Capital and known for work on the opening range breakout, says that Crabel's new work increasingly combines price and volume. Crabel reads a bar as the ratio of the size of its range to the volume traded within that range. This is an old idea from Richard Wyckoff: effort (volume) versus result (price movement). According to Crabel, it has hardly been used systematically, because database builders considered volume unimportant.

Crabel's observation: now that markets have more mean reversion, highs and lows often come with relatively high volume and narrowing ranges. According to Crabel, many important daily extremes arrive with this structure. Wyckoff would have called it churning or laboring: great effort without result. Crabel stresses that this is only a warning. The entry should come after a test of the level and confirmation, and there is no reason to step in front of the move without that check.

The interview gives no thresholds. Crabel named the normalization method (a 10-20 day average on daily bars, the same time of day on intraday data), the shape of the signal and the sequence of actions. The thresholds, the definition of the test and the exit are ours.

The difference from prior-extreme-raid-reclaim: there the level is the prior day's, with a reclaim back across it, price only. Here the level comes from a volume signature at a multi-day extreme, and the entry waits for a separate retest several days later.

Why it might work

Wyckoff's logic is about the balance of forces. If many contracts traded at the high but price barely moved, the buying met an equal volume of selling. A large seller is distributing a position into demand, and the next attempt higher will most likely run into that seller again. At a low it is mirrored: heavy selling is absorbed, and price does not go lower.

Crabel links the frequency of such extremes to the general shift of markets toward mean reversion. In the same interview, Crabel says that large participants increasingly step in front of moves at one- and two-day extremes (covered in prior-extreme-raid-reclaim). The public part of the interview contains no test of this link.

Crabel ranks volume below price: price is the market's reality, and volume can be deceptive. That is why the signal in this card requires price confirmation.

Rules

Normalized volume and range, daily bars (author)

// daily bars of a liquid futures contract
Range    = High - Low
RelVol   = Volume / SMA(Volume, 20)[1]        // author: average over 10 or 20 days
RelRange = Range  / SMA(Range, 20)[1]         // author: range relative to the same average
// Finetiq: length 20, average excluding the current bar

Intraday normalization (author)

// author: intraday volume has a "smile", compare with prior days at the same time
Slot      = bar open time on the exchange clock, for example 10:00-10:30 ET
SlotVol   = average Volume of the same Slot over the last 20 days      // Finetiq: 20 days
SlotRange = average Range of the same Slot over the last 20 days
RelVolI   = Volume / SlotVol
RelRangeI = Range  / SlotRange
// from here on, the same rules as on daily bars, with RelVolI and RelRangeI

Warning: effort without result (author, thresholds Finetiq)

AtHigh = High >= Highest(High, 20)[1]           // Finetiq: 20-bar extreme
AtLow  = Low  <= Lowest(Low, 20)[1]

Effort   = RelVol   >= 1.5                       // author: relatively high volume; Finetiq: 1.5
NoResult = RelRange <= 0.8                       // author: narrowing range; Finetiq: 0.8

WarnTop    = AtHigh AND Effort AND NoResult
WarnBottom = AtLow  AND Effort AND NoResult
// variant to test: a 2-3 bar signature at the extreme,
// average RelVol >= 1.3 and each bar's RelRange smaller than the previous one

IF WarnTop    THEN Level = High, WarnBar = current bar
IF WarnBottom THEN Level = Low,  WarnBar = current bar

Test and confirmation (Finetiq)

// author: wait for the test, get confirmation, only then enter
// the whole definition of the test below is ours

// short after WarnTop
TestWindow = from 2 to 10 bars after WarnBar                 // Finetiq
Test = High >= Level - 0.25 * ATR(20)                        // price came back to the level
       AND High <= Level + 0.5 * ATR(20)                     // and did not go far above it
       AND Close < Level                                     // closed below the level
Confirm = Test AND Close < (High + Low) / 2                  // close in the lower half of the bar

IF Confirm within TestWindow
    SELL SHORT STOP at Low of the test bar - 1 tick          // price confirmation, the order lives 1 bar
StopLoss = MAX(Level, High of the test bar) + 0.25 * ATR(20)
IF Close > Level + 0.5 * ATR(20) before the test THEN CANCEL // level broken, signal withdrawn

// exit: short holding, like the core products of Crabel's firm (up to two days)
EXIT at the close of the second day after entry
// variant: target SMA(Close, 20) or the opposite edge of the WarnBar range

// long after WarnBottom is mirrored

Plugging into cards in the base (Finetiq)

// example 1: prior-extreme-raid-reclaim, variant C (fade of a two-day extreme)
IF DayHigh > H2 AND Close60 < H2                    // as in the card
   AND WarnTop on at least one of the last 5 days   // volume signature at this extreme
    SELL SHORT AT NEXT BAR OPEN
// compare with the version without the signature: does volume add anything to the price reclaim

// example 2: prev-high-breakout-adx (buying a breakout of yesterday's high)
IF WarnTop on yesterday's bar
    CANCEL BUY STOP                                  // do not buy a breakout of an effort-without-result bar

Parameters

Parameter Value Source
Normalization average on daily bars 10 or 20 days author
Chosen length 20 days Finetiq
Intraday normalization the same time slot on prior days author
Days in the slot average 20 Finetiq
Extreme 20-day high or low Finetiq
High volume RelVol of 1.5 or more Finetiq
Narrow range RelRange up to 0.8 Finetiq
Test window 2-10 bars Finetiq
Test zone from 0.25 ATR below to 0.5 ATR above the level Finetiq
Confirmation close in the lower half and a break of the test bar low Finetiq
Stop beyond the level or the test high plus 0.25 ATR Finetiq
Exit close of the second day Finetiq (based on the up-to-two-day holding at the author's firm)

What to test

  1. Does the signature mark extremes. Label all 20-day highs on ES, CL, GC and ZN. Compare the share that remained the high for the next 10 days among WarnTop and among the rest. This is a direct test of Crabel's observation.
  2. Threshold neighborhood. RelVol of 1.2, 1.5 and 2.0; RelRange of 0.6, 0.8 and 1.0; an average of 10 and 20 days. The signal is rare, so also look at the number of events.
  3. Is the test needed. A short on the day after WarnTop versus an entry after the test. Crabel insists on the test, so check whether it pays for the missed trades.
  4. Volume versus range alone. The same signal with NoResult only, without the volume condition. If the result is the same, volume adds nothing, and the data requirements get simpler.
  5. Years. Split the result into five-year periods. Crabel talks about today's market with more mean reversion. If the signal is weaker on older data, that will be consistent with Crabel's words.
  6. Intraday version. Normalization by time slot versus normalization by an average of neighboring bars. On bars near the open and the close the difference should be noticeable.
  7. Costs. A two-day holding period and a stop in fractions of ATR on futures. Add slippage on the stop entry.

Platform notes

TradingView (Pine Script)

  • Daily futures bars have volume, and RelVol and RelRange take a couple of lines with ta.sma.
  • Intraday normalization needs averages per time slot, which are convenient to store in an array indexed by slot number. Define the slot in exchange time via time(timeframe.period, "1000-1030", "America/New_York"), otherwise it will shift when daylight saving time changes.
  • Intraday history depth is limited by your subscription plan. 20 days per slot plus a test over several years may not fit.
  • On a continuous futures series, volume on rollover days is split between contracts. RelVol drops or jumps near expiration, so check those dates separately.

MultiCharts and TradeStation (EasyLanguage)

  • For futures, the TradeStation daily bar closes at settlement, while the 1440-minute bar closes at the last trade. Settlement changes only the close. High, Low and the range of the two bar types differ only if their session boundaries differ, for example a daily bar on the regular session and a 1440-minute bar on the full session. Check the session templates, otherwise RelRange and WarnTop may fall on different days. With the same boundaries, only calculations based on the close differ.
  • On TradeStation intraday bars, total volume has historically been stored in Ticks, while Volume may contain only up volume. In MultiCharts the field is set by a symbol setting (Build Volume On).
  • Sell Short next bar at X stop lives for one bar, which matches the confirmation rule. Store the level and the test window in variables.
  • AvgTrueRange is a simple average of TR. The test zone in fractions of ATR will be slightly different than in Pine.

MetaTrader 5 (MQL5)

  • CFDs and forex have only tick volume (iTickVolume): the number of quote changes at the broker, not contracts. High volume without result cannot be tested with it. Real volume (iRealVolume) is available only for exchange-traded futures at a few brokers.
  • Without volume, only the price part remains: a narrow range at an extreme. That is a different idea and needs to be tested separately (test 4).
  • A CFD daily bar and intraday slots are built on the broker's server time. Convert the 10:00 ET slot to server time, accounting for daylight saving time.
  • Set the level and stop as prices, not in _Point.

Where the idea can break

  • Crabel described an observation, not a system. The thresholds, test, confirmation and exit are ours, and a weak result may reflect a weak formalization.
  • The interview has no figures. The breakdown of charts with volume went into a paid bonus episode for members of the host's community, and the public part has only words.
  • Volume on a continuous futures series is distorted at rollovers, and data vendors build continuous contracts in different ways.
  • The signal is rare: a 20-day extreme with high volume and a narrow range happens a few times a year per market. A usable sample needs dozens of markets.
  • Crabel warns that volume can be deceptive and that price comes first.
  • The episode advertises the host's crypto trading course.

Sources

Related ideas

Updated: 2026-09-11