12 — Bilateral & Wedge

Rising Wedge#

BearishHeuristic1 min read
◆ The PatternBoth lines slope up but converge — momentum is dying

The Rising Wedge has both support and resistance sloping upward, but converging. Price is rising but the range is narrowing — momentum is exhausting. Usually resolves with a bearish breakdown.

Target = Breakdown − Height of wedge at widest
Key difference from ascending triangle: both lines slope up in a wedge, only one is flat in a triangle.
// Rising Wedge — upward but weakening
Key insight: The rising wedge is deceptive — price is going up, but the narrowing range and declining volume signal that the advance is running out of steam.
Pattern bridge: Upward slopes narrowing — momentum fading despite higher prices. In ML, vanishing gradients show the same decaying energy.
Worked example

Swing highs at 105, 108 and 110, swing lows at 95, 101 and 106: both lines rise, but the lows faster (1.0 a day against 0.42), so the range narrows. Day 21 closes at 100, below the last swing low; the usual target is where the wedge began, 95.

The example data

The turning points the daily closes run through, in straight lines between them; high and low are half a point either side of each bar.

DayClose
093
3105
695
9108
12101
15110
18106
21100
Where it misleads
  • A rising wedge can break upward too; the bearish reading is a tendency, not a rule.
  • Lines through three points each make the slopes very sensitive to which swings you pick.
  • “Back to the start” is a convention, not a measured move.
In code
def swings(s, n=2):                     # a swing high (low) is the extreme of the 2n+1 bars around it
    w = s.rolling(2 * n + 1, center=True)
    return s[s == w.max()], s[s == w.min()]
c = df['close']
highs, lows = swings(c)
hi, lo = highs.iloc[-3:], lows.iloc[-3:]
hs = np.polyfit(hi.index, hi.values, 1)[0]           # slope of the upper line
ls = np.polyfit(lo.index, lo.values, 1)[0]           # slope of the lower line
is_wedge = hs > 0 and ls > hs                         # both rise, the lows faster
breakdown = c.iloc[-1] < lo.iloc[-1]
target = lo.iloc[0]                                   # back to where the wedge began
Python, in your browser — edit the code and run it again

Assumes import numpy as np, import pandas as pd, and a DataFrame df with columns open, high, low and close for the data above.

Sources
  • Encyclopedia of Chart Patterns (2nd ed.), T. N. Bulkowski, Wiley, 2005 — success and failure rates from large counts of patterns
  • Technical Analysis of the Financial Markets, J. J. Murphy, New York Institute of Finance, 1999

Last reviewed October 2026 · How this site checks its content · Report a mistake

Linked from 1
← Previous
Symmetric Triangle
Open in the full reader, with the topic sidebar