◆ New — Strategy Validator, Code Fixer & Prop Compliance Checker are live. Try one free →
Home / Strategies / Wyckoff Spring Strategy
Concept breakdown

Wyckoff Spring Strategy

The Wyckoff Spring is a price-action concept from the classic Wyckoff method, taught widely in the trading community. It describes a brief dip below a trading-range support followed by a recovery back inside the range — interpreted by traders as a "test" of selling pressure that some associate with the later part of an accumulation phase. This page explains the concept neutrally, describes how traders define entries, exits, and risk around it, and gives an illustrative Pine v6 marker. It is educational only: nothing here is predictive, no outcome is implied, and trading carries the risk of loss.

How it works

The Spring (sometimes paired with the related "Shakeout") is one of the events Wyckoff students look for inside a trading range, the sideways consolidation that the Wyckoff schematic labels "accumulation." The idea, popularised across the broader Wyckoff / price-action education community, is this: after price has spent time ranging between a support floor (the lower boundary of the range) and a resistance ceiling, a Spring is a bar or short sequence of bars that pokes BELOW that support and then closes (or quickly recovers) back ABOVE it, back inside the range.

Traders interpret this in narrative terms: the dip below support may trip stop-loss orders sitting under the obvious low and may tempt breakout sellers to enter short. If price then returns inside the range rather than continuing lower, those who sold the breakdown can be left offside, and the Wyckoff reading is that supply below support was "absorbed" rather than overwhelming — i.e., the breakdown failed. Wyckoff students often describe the event by how deep the penetration was and by the volume and "result" of the bars that follow. A common follow-up event they watch for is the "Test": a later, often lower-volume revisit toward the spring low that does NOT make a decisive new low, which some treat as additional context that the earlier absorption held.

This is a discretionary, context-dependent pattern, not a fixed formula. There is no single agreed numeric definition of "how far below" or "how fast a recovery," and the same bar shape can appear in ranges that simply keep falling. For that reason this page treats the Spring as something to DETECT and MARK on a chart for study, not as a mechanical buy rule. Nothing about the pattern is predictive; identifying a Spring does not tell you what price will do next, and trading on it can result in loss.

Entry rules

Exit rules

Risk notes

Pine v6 example

//@version=6
indicator("Wyckoff Spring - Illustrative Marker", overlay = true)

// EDUCATIONAL / ILLUSTRATIVE ONLY. The Wyckoff Spring is a discretionary,
// context-dependent concept, so it does NOT reduce to a mechanical strategy.
// This script only DETECTS and MARKS candidate "spring" bars for study.
// It is not a buy/sell signal and is not predictive. Trading risks loss.

// ---- Inputs ----
rangeLen = input.int(20, "Trading-range lookback (bars)", minval = 5)
volLen   = input.int(20, "Volume average length", minval = 1)

// ---- Range support: lowest low of the lookback window, EXCLUDING the current bar ----
// Using low[1] avoids referencing the still-forming bar, which would invite bias.
support = ta.lowest(low[1], rangeLen)

// ---- Penetration: current bar's low pierces below that prior support ----
brokeBelow = low < support

// ---- Reclaim: the SAME bar broke below support but CLOSED back above it (failed breakdown) ----
// Note: this detects a single-bar reclaim only. A multi-bar recovery, which the
// classic concept also allows, is a discretionary read and is not coded here.
springCandidate = brokeBelow and close > support

// ---- Optional volume context (effort vs. result is part of the classic reading) ----
volAvg     = ta.sma(volume, volLen)
lowVolTest = volume < volAvg

// ---- Markers (detection is on the closed bar; this script does not place orders) ----
plotshape((springCandidate) and barstate.isconfirmed, title = "Spring candidate", style = shape.triangleup, location = location.belowbar, size = size.small, color = color.new(color.teal, 0))
plot(support, title = "Range support", color = color.new(color.gray, 0), style = plot.style_stepline)
bgcolor(springCandidate and lowVolTest ? color.new(color.teal, 90) : na, title = "Low-volume spring highlight")

Pitfalls

FAQ

Is the Wyckoff Spring a buy signal?

No. Traders treat it as one event within a trading range — a failed dip below support — that they study alongside the surrounding structure, the follow-up 'Test', and volume context. It is an observation, not an instruction, and it tells you nothing certain about future price. Any trade based on it can lose money.

What is the difference between a Spring and a Shakeout?

Both describe a dip below range support that recovers, and the terms are used loosely across the community. In the classic teaching a Spring is often described as the more contained penetration with a quicker recovery, while a Shakeout tends to describe a sharper, deeper, higher-volume flush below support before price comes back. Neither has a single agreed numeric definition, which is one reason they are treated as discretionary judgements rather than mechanical rules.

Can the Wyckoff Spring be coded as a fully mechanical strategy?

Not cleanly. The concept depends on context — whether a real trading range exists, how to describe the penetration and the test, and how to read volume — that resists a single fixed formula. That is why the script on this page is an illustrative DETECTOR that marks candidate spring bars for study, not an automated entry system. Coding it naively also risks look-ahead bias or repainting, which makes hindsight results misleading; detect only on closed, past bars.

Educational & software only — not financial advice, not a recommendation to trade. Backtests are illustrative; past performance does not predict future results. Trading involves substantial risk of loss.

Catch the bug that compiles.Run auditGet Pro