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

Three-Drive Pattern Strategy

The Three-Drive is a harmonic chart pattern in which price makes three consecutive, often symmetrical pushes ("drives") to a final extreme, usually described with Fibonacci retracements and extensions. Traders study it as a possible exhaustion / reversal map, not a profit signal. This page explains how the pattern is defined, how traders frame entries, exits and risk around it, and provides a valid Pine v6 illustrative marker script. Educational only — nothing here is predictive, and trading carries risk of loss.

How it works

The Three-Drive is a harmonic / price-action pattern discussed across the broader technical-analysis and smart-money communities. It describes a sequence in which price makes three successive "drives" in the same direction (three higher highs in a setup studied as bearish, or three lower lows in a setup studied as bullish), separated by two corrective pullbacks, before reaching a final extreme that some traders treat as a potential point of exhaustion.

The classic description has five turning points labelled in sequence — Drive 1, Retracement A, Drive 2, Retracement B, Drive 3 — and traders look for approximate symmetry between the legs. Two Fibonacci relationships are most commonly cited:

  • Each corrective retracement (A and B) tends to pull back to roughly the 0.618 of the prior drive.
  • Each new drive tends to extend to roughly the 1.27 (and sometimes up to 1.618) Fibonacci extension of the preceding retracement.

Equal time and price between the drives ("leg symmetry") is the feature most emphasised in descriptions of the pattern: Drive 2 and Drive 3 ideally cover similar distances over similar durations, giving the pattern its measured, rhythmic look. The completion of Drive 3 at the projected extension is the zone some traders treat as a place where the trending push may be over-extended.

It is important to be clear about what the pattern is and is not. It is a descriptive, geometric framework for a possible momentum-exhaustion point. It is not a mechanical buy/sell rule, it does not predict price, and the Fibonacci ratios are tolerances (traders usually allow some deviation), not exact triggers. Like all chart patterns, it is only confirmed in hindsight and is identified subjectively; two analysts can label the same chart differently. Nothing about the pattern implies a profitable outcome — it is one lens among many for organising what price has already done, and trading carries risk of loss.

Entry rules

Exit rules

Risk notes

Pine v6 example

//@version=6
// Three-Drive Pattern — ILLUSTRATIVE DETECTION / MARKER (educational only)
// The Three-Drive is a discretionary harmonic pattern and does NOT reduce to a
// clean mechanical entry/exit strategy. This script only MARKS candidate
// bearish three-drive shapes (three rising pivot-highs with two pivot-lows
// interleaved between them, i.e. D1 high, A low, D2 high, B low, D3 high) and
// checks approximate Fibonacci + symmetry tolerances. It is NOT a signal to
// trade, is not predictive, and trading carries risk of loss. Patterns confirm
// only in hindsight; tune inputs and verify by eye.
indicator("Three-Drive Pattern (Illustrative Marker)", overlay = true)

lenL    = input.int(5,    "Pivot lookback/forward (bars)",       minval = 1)
fibTol  = input.float(0.15, "Extension tolerance (fraction)",    minval = 0.0, step = 0.01)
retTol  = input.float(0.20, "Retracement tolerance (fraction)",  minval = 0.0, step = 0.01)
symTol  = input.float(0.30, "Leg-symmetry tolerance (fraction)", minval = 0.0, step = 0.05)

// Confirmed pivots (note: pivots are detected lenL bars after the fact)
ph = ta.pivothigh(high, lenL, lenL)
pl = ta.pivotlow(low,  lenL, lenL)

// Single TIME-ORDERED buffer of the last pivots so highs and lows truly
// interleave. Each entry stores price, bar_index and whether it was a high.
var array<float> pPrice = array.new<float>()
var array<int>   pBar   = array.new<int>()
var array<bool>  pIsHi  = array.new<bool>()

pushPivot(_price, _bar, _isHi) =>
    array.push(pPrice, _price)
    array.push(pBar,   _bar)
    array.push(pIsHi,  _isHi)
    // Keep the buffer small; 5 alternating points describe D1,A,D2,B,D3
    if array.size(pPrice) > 9
        array.shift(pPrice)
        array.shift(pBar)
        array.shift(pIsHi)

if not na(ph)
    pushPivot(high[lenL], bar_index[lenL], true)
if not na(pl)
    pushPivot(low[lenL],  bar_index[lenL], false)

within(_val, _target, _tol) =>
    _target == 0 ? false : math.abs(_val - _target) / math.abs(_target) <= _tol

// Evaluate only when a fresh HIGH pivot just completed a possible Drive 3,
// and only if the last five buffered pivots alternate high-low-high-low-high.
bearShape = false
if not na(ph) and array.size(pPrice) >= 5
    n  = array.size(pPrice)
    // Last five pivots in time order: idx0=D1H, 1=A(L), 2=D2H, 3=B(L), 4=D3H
    h1 = array.get(pPrice, n - 5)
    aL = array.get(pPrice, n - 4)
    h2 = array.get(pPrice, n - 3)
    bL = array.get(pPrice, n - 2)
    h3 = array.get(pPrice, n - 1)
    t1 = array.get(pBar,   n - 5)
    t2 = array.get(pBar,   n - 3)
    t3 = array.get(pBar,   n - 1)
    isHi1 = array.get(pIsHi, n - 5)
    isLo2 = array.get(pIsHi, n - 4)
    isHi3 = array.get(pIsHi, n - 3)
    isLo4 = array.get(pIsHi, n - 2)
    isHi5 = array.get(pIsHi, n - 1)

    alternating = isHi1 and not isLo2 and isHi3 and not isLo4 and isHi5
    higherHighs = h3 > h2 and h2 > h1            // three ascending drives
    lowsInside  = aL < h1 and aL < h2 and bL < h2 and bL < h3  // lows sit below their drives

    // Drive leg sizes (price) and durations (bars) for the symmetry check
    drive2  = h2 - aL
    drive3  = h3 - bL
    dur2    = t2 - t1
    dur3    = t3 - t2
    priceSym = drive2 > 0 ? within(drive3, drive2, symTol) : false
    timeSym  = dur2  > 0 ? within(dur3,  dur2,  symTol) : false

    // Retracement A as a fraction of Drive 1, Retracement B as a fraction of
    // Drive 2 — both cited near ~0.618. (Drive 1 = first up-leg into h1.)
    drive1 = h1 - aL
    retrA  = drive1 > 0 ? (h1 - aL) / drive1 : na   // by construction ~1.0 here; see note
    retrB  = drive2 > 0 ? (h2 - bL) / drive2 : na
    retOk  = not na(retrB) and within(retrB, 0.618, retTol)

    // Extension: each drive near ~1.27 (up to ~1.618) of the PRECEDING
    // retracement leg. Retracement-B size = h2 - bL; Drive 3 size = h3 - bL.
    extLeg = h2 - bL
    extOk  = extLeg > 0 and (within(drive3, extLeg * 1.27, fibTol) or within(drive3, extLeg * 1.618, fibTol))

    bearShape := alternating and higherHighs and lowsInside and priceSym and timeSym and retOk and extOk

plotshape(bearShape, title = "Bearish 3-Drive (candidate)", style = shape.triangledown,
     location = location.abovebar, color = color.new(color.red, 0), size = size.small,
     text = "3D?")

// Reminder label on the most recent candidate
if bearShape
    label.new(bar_index[lenL], high[lenL], "3-Drive candidate (illustrative)",
         style = label.style_label_down, color = color.new(color.red, 70),
         textcolor = color.white, size = size.tiny)

Pitfalls

FAQ

Is the Three-Drive pattern bullish or bearish?

It can be either. A series of three rising drives to a high is studied as a potential bearish (downside reversal) setup, while three falling drives to a low is studied as a potential bullish one. In both cases it is treated as a possible exhaustion point, not a guaranteed turn — nothing about it predicts price or profit, and trading carries risk of loss.

How is the Three-Drive different from an ABCD or Gartley pattern?

All are harmonic patterns built on Fibonacci relationships, but they differ in structure. The ABCD has four points and one corrective leg; harmonics like the Gartley have five points forming an XABCD shape with specific ratios. The Three-Drive is defined by three symmetrical drives separated by two retracements near ~0.618, with each drive extending ~1.27–1.618 of the preceding retracement. The emphasis on leg symmetry is what most distinguishes it.

Can the Three-Drive be fully automated in Pine?

Not cleanly. Because swing-point selection is discretionary and the ratios are tolerances, it does not reduce to a reliable mechanical strategy. The script on this page is an illustrative marker that flags candidate shapes meeting approximate Fibonacci, retracement and symmetry checks on confirmed, time-ordered pivots — it is meant for study and visual confirmation, not as a trading signal. Always verify on bar close and treat results as past, not predictive.

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