Strasmore Research
Learn am Matt ConnorBy Matt Connor

Falling Wedge: Wetin Di Data Really Talk

Falling wedge na bullish pattern? We code one mechanical falling wedge rule, count am for US daily bars, an compare di 10 an 20 session result with di plain base rate.

Falling wedge na di chart pattern wey you dey stare at when price dey grind go down but di candles dey shrink: lower high on top lower high, lower low under lower low, an di two trendlines dey squeeze enter each other, with di upper line dey fall faster pass di lower one. Almost every textbook go call am bullish. Very few go show you di count wey back di claim. We write one falling wedge rule wey machine fit test, run am across sixteen years of US daily bars, an compare wetin happen after with di plain base rate for di same names.

Wetin falling wedge be, for plain talk

Trendline na just one straight line wey touch di tops, or di bottoms, of di bars. Inside falling wedge, di line wey join di highs dey slope down, di line wey join di lows dey slope down too, but di top line dey drop faster, so di gap between di two dey narrow as price dey waka. For plain English, wetin dey narrow na di distance between di day high an di day low. Seller never comot for market, but dem no dey push far like before.

Di story wey people dey attach to di shape na say selling don dey tire, an di first strong close above di upper line na di breakout. Di wahala na say every person dey draw im own line. Two traders fit open di same chart, one go see clean wedge, di other one no go see anything. Anything wey you fit draw anyhow, you no fit test am. So make we write di thing down proper.

Di rule we use, written for ground

For dis page, one falling wedge na any session wey pass two test:

  • Four sessions back to back where each day high dey below di day before high, an each day low dey below di day before low. Na five bars be dat inside di wedge body.
  • Di average daily range (high minus low) across those five bars dey under di 25th percentile of di sixty daily ranges before di body start.

Di second line na di squeeze. E be like di volatility contraction wey TTM squeeze dey measure, only say we count am straight from di bar range. We take di sixty-day yardstick from sixty-four sessions back till five sessions back, so di quiet days inside di wedge no go spoil di measurement by making demsef look normal.

Plenty other definition fit work. Wetin matter na say dis one dey written, e dey countable, an you fit open di SQL under any panel for dis page an change am yourself.

QueryHow often di wedge rule dey flag each name
tickerwedge_countwedge_rate_pct
CVX180.44
INTC180.44
HD160.39
NVDA160.39
MSFT140.34
DIS130.31
PFE130.31
GOOGL90.3
JNJ120.29
T120.29
GS110.27
XOM110.27
TSLA100.25
BAC100.24
CSCO90.22
The exact SQL behind every number
WITH
bars AS (
    SELECT
        ticker,
        date,
        toFloat64(high)  AS hi,
        toFloat64(low)   AS lo,
        toFloat64(close) AS px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','META','TSLA','AVGO','JPM','BAC','WFC','GS','KO','PEP','PG','JNJ','PFE','MRK','XOM','CVX','WMT','HD','MCD','NKE','CSCO','INTC','IBM','T','VZ','DIS')
      AND date >= '2010-01-04'
      AND date <= '2026-09-30'
),
split_dates AS (
    SELECT
        ticker,
        groupArray(execution_date) AS split_days
    FROM
    (
        SELECT ticker, execution_date
        FROM global_markets.stocks_splits
        WHERE execution_date >= '2009-10-01'
        GROUP BY ticker, execution_date
    )
    GROUP BY ticker
),
stepped AS (
    SELECT
        ticker,
        date,
        px,
        hi - lo AS rng,
        if(hi < lagInFrame(hi, 1) OVER w AND lo < lagInFrame(lo, 1) OVER w, 1, 0) AS lower_both
    FROM bars
    WINDOW w AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
feat AS (
    SELECT
        ticker,
        date,
        px,
        sum(lower_both) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)  AS wedge_streak,
        avg(rng)        OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)  AS rng5,
        groupArray(rng) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 64 PRECEDING AND 5 PRECEDING) AS prior_rng,
        lagInFrame(px, 5)   OVER wf AS px_back5,
        leadInFrame(px, 5)  OVER wf AS px_fwd5,
        leadInFrame(px, 10) OVER wf AS px_fwd10,
        leadInFrame(px, 20) OVER wf AS px_fwd20
    FROM stepped
    WINDOW wf AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
scored AS (
    SELECT
        f.ticker AS ticker,
        f.date   AS date,
        if(f.wedge_streak = 4 AND f.rng5 < arraySort(f.prior_rng)[15], 1, 0) AS is_wedge
    FROM feat AS f
    LEFT JOIN split_dates AS s ON s.ticker = f.ticker
    WHERE length(f.prior_rng) = 60
      AND f.px_back5 > 0
      AND f.px_fwd5  > 0
      AND f.px_fwd10 > 0
      AND f.px_fwd20 > 0
      AND NOT arrayExists(d -> (d >= f.date - 10) AND (d <= f.date + 32), s.split_days)
)
SELECT
    ticker,
    countIf(is_wedge = 1)                           AS wedge_count,
    round(100 * countIf(is_wedge = 1) / count(), 2) AS wedge_rate_pct
FROM scored
GROUP BY ticker
ORDER BY wedge_rate_pct DESC, ticker ASC
LIMIT 15
Run am yourself

Across di fifteen names wey flag most often, CVX carry di highest rate: 18 wedge days, wey be 0.44% of all di sessions we test for am. Number fifteen for di same list, CSCO, flag 0.22%. Na so di thing be: di pattern no common at all. If you dey see wedge every week for one chart, wetin you dey draw loose well well pass dis rule.

Wetin price actually do after di wedge

Di only honest way to judge di pattern na to put am against di base rate. Base rate na wetin di same names do over di same window without any pattern condition at all: every single session, counted flat. If di wedge no beat dat number, di drawing never add anything to your chart.

QueryAfter di wedge against di plain base rate, 5, 10 an 20 sessions out
horizonwedge_up_pctbase_up_pctavg_gap_pctwedge_signals
552.354.4-0.02287
1051.955.7-0.39287
205457.1-0.76287
The exact SQL behind every number
WITH
bars AS (
    SELECT
        ticker,
        date,
        toFloat64(high)  AS hi,
        toFloat64(low)   AS lo,
        toFloat64(close) AS px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','META','TSLA','AVGO','JPM','BAC','WFC','GS','KO','PEP','PG','JNJ','PFE','MRK','XOM','CVX','WMT','HD','MCD','NKE','CSCO','INTC','IBM','T','VZ','DIS')
      AND date >= '2010-01-04'
      AND date <= '2026-09-30'
),
split_dates AS (
    SELECT
        ticker,
        groupArray(execution_date) AS split_days
    FROM
    (
        SELECT ticker, execution_date
        FROM global_markets.stocks_splits
        WHERE execution_date >= '2009-10-01'
        GROUP BY ticker, execution_date
    )
    GROUP BY ticker
),
stepped AS (
    SELECT
        ticker,
        date,
        px,
        hi - lo AS rng,
        if(hi < lagInFrame(hi, 1) OVER w AND lo < lagInFrame(lo, 1) OVER w, 1, 0) AS lower_both
    FROM bars
    WINDOW w AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
feat AS (
    SELECT
        ticker,
        date,
        px,
        sum(lower_both) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)  AS wedge_streak,
        avg(rng)        OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)  AS rng5,
        groupArray(rng) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 64 PRECEDING AND 5 PRECEDING) AS prior_rng,
        lagInFrame(px, 5)   OVER wf AS px_back5,
        leadInFrame(px, 5)  OVER wf AS px_fwd5,
        leadInFrame(px, 10) OVER wf AS px_fwd10,
        leadInFrame(px, 20) OVER wf AS px_fwd20
    FROM stepped
    WINDOW wf AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
scored AS (
    SELECT
        f.px       AS px,
        f.px_fwd5  AS px_fwd5,
        f.px_fwd10 AS px_fwd10,
        f.px_fwd20 AS px_fwd20,
        if(f.wedge_streak = 4 AND f.rng5 < arraySort(f.prior_rng)[15], 1, 0) AS is_wedge
    FROM feat AS f
    LEFT JOIN split_dates AS s ON s.ticker = f.ticker
    WHERE length(f.prior_rng) = 60
      AND f.px_back5 > 0
      AND f.px_fwd5  > 0
      AND f.px_fwd10 > 0
      AND f.px_fwd20 > 0
      AND NOT arrayExists(d -> (d >= f.date - 10) AND (d <= f.date + 32), s.split_days)
)
SELECT
    horizon,
    round(100 * countIf(is_wedge = 1 AND fwd_pct > 0) / countIf(is_wedge = 1), 1) AS wedge_up_pct,
    round(100 * countIf(fwd_pct > 0) / count(), 1)                                AS base_up_pct,
    round(avgIf(fwd_pct, is_wedge = 1) - avg(fwd_pct), 2)                         AS avg_gap_pct,
    countIf(is_wedge = 1)                                                         AS wedge_signals
FROM
(
    SELECT
        is_wedge,
        h.1 AS horizon,
        h.2 AS fwd_pct
    FROM
    (
        SELECT
            is_wedge,
            arrayJoin([
                (5,  100 * (px_fwd5  / px - 1)),
                (10, 100 * (px_fwd10 / px - 1)),
                (20, 100 * (px_fwd20 / px - 1))
            ]) AS h
        FROM scored
    )
)
GROUP BY horizon
ORDER BY horizon ASC
Run am yourself

Ten sessions after di wedge, price close higher 51.9% of di time. Di base rate over di same ten-session window na 55.7%. Carry am go twenty sessions an di wedge give 54% against 57.1%. On average move, di difference between wedge days an all days na -0.76 percentage point over twenty sessions, an di sanity bound wey dey hold dis panel keep am under five point either side.

Na 287 wedge days we dey talk about here. With sample size like dat, gap of one or two percentage point no fit separate real edge from ordinary noise. Make I yarn am clear for Pidgin: di falling wedge, as we define am for dis page, no be money machine. Anybody wey tell you say e dey work 70 percent of di time suppose show you di count, di names, an di window wey dem use.

Di shape of di move, no be only win rate

Win rate na half di story. One pattern fit win small small plenty times an den lose big once. So make we look where di twenty-session moves actually land.

QueryWhere di 20 session move land: wedge days against all days
move_bucketwedge_share_pctbase_share_pct
below -10%8.75.3
-10% to -5%11.510.8
-5% to 0%25.826.7
0% to +5%27.932.1
+5% to +10%1616
above +10%10.19.1
The exact SQL behind every number
WITH
bars AS (
    SELECT
        ticker,
        date,
        toFloat64(high)  AS hi,
        toFloat64(low)   AS lo,
        toFloat64(close) AS px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','META','TSLA','AVGO','JPM','BAC','WFC','GS','KO','PEP','PG','JNJ','PFE','MRK','XOM','CVX','WMT','HD','MCD','NKE','CSCO','INTC','IBM','T','VZ','DIS')
      AND date >= '2010-01-04'
      AND date <= '2026-09-30'
),
split_dates AS (
    SELECT
        ticker,
        groupArray(execution_date) AS split_days
    FROM
    (
        SELECT ticker, execution_date
        FROM global_markets.stocks_splits
        WHERE execution_date >= '2009-10-01'
        GROUP BY ticker, execution_date
    )
    GROUP BY ticker
),
stepped AS (
    SELECT
        ticker,
        date,
        px,
        hi - lo AS rng,
        if(hi < lagInFrame(hi, 1) OVER w AND lo < lagInFrame(lo, 1) OVER w, 1, 0) AS lower_both
    FROM bars
    WINDOW w AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
feat AS (
    SELECT
        ticker,
        date,
        px,
        sum(lower_both) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)  AS wedge_streak,
        avg(rng)        OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)  AS rng5,
        groupArray(rng) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 64 PRECEDING AND 5 PRECEDING) AS prior_rng,
        lagInFrame(px, 5)   OVER wf AS px_back5,
        leadInFrame(px, 5)  OVER wf AS px_fwd5,
        leadInFrame(px, 10) OVER wf AS px_fwd10,
        leadInFrame(px, 20) OVER wf AS px_fwd20
    FROM stepped
    WINDOW wf AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
scored AS (
    SELECT
        f.px       AS px,
        f.px_fwd20 AS px_fwd20,
        if(f.wedge_streak = 4 AND f.rng5 < arraySort(f.prior_rng)[15], 1, 0) AS is_wedge
    FROM feat AS f
    LEFT JOIN split_dates AS s ON s.ticker = f.ticker
    WHERE length(f.prior_rng) = 60
      AND f.px_back5 > 0
      AND f.px_fwd5  > 0
      AND f.px_fwd10 > 0
      AND f.px_fwd20 > 0
      AND NOT arrayExists(d -> (d >= f.date - 10) AND (d <= f.date + 32), s.split_days)
)
SELECT
    move_bucket,
    round(100 * wedge_n / sum(wedge_n) OVER (), 1) AS wedge_share_pct,
    round(100 * base_n  / sum(base_n)  OVER (), 1) AS base_share_pct
FROM
(
    SELECT
        multiIf(fwd20 < -10, 'below -10%',
                fwd20 < -5,  '-10% to -5%',
                fwd20 < 0,   '-5% to 0%',
                fwd20 < 5,   '0% to +5%',
                fwd20 < 10,  '+5% to +10%',
                             'above +10%') AS move_bucket,
        multiIf(fwd20 < -10, 1, fwd20 < -5, 2, fwd20 < 0, 3, fwd20 < 5, 4, fwd20 < 10, 5, 6) AS bucket_order,
        countIf(is_wedge = 1) AS wedge_n,
        count()               AS base_n
    FROM
    (
        SELECT is_wedge, 100 * (px_fwd20 / px - 1) AS fwd20
        FROM scored
    )
    GROUP BY move_bucket, bucket_order
)
ORDER BY bucket_order ASC
Run am yourself

Di below -10% bucket hold 8.7% of di wedge cases against 5.3% of all days. For di other end, di above +10% bucket hold 10.1% of wedge cases against 9.1% of all days. Di two shapes dey sit for nearly di same place, with small shift. Di whole argument for falling wedge live inside dat small shift.

Di wedges wey di rule catch last

QueryDi most recent wedges wey di rule flag, an wetin follow dem
signal_datesignal_labeltickerfive_day_fall_pctfwd_20_pct
2026-01-05Jan 5, 2026PG3.0210.65
2026-01-05Jan 5, 2026MCD3.486.54
2026-01-06Jan 6, 2026PEP3.6619.59
2026-03-09Mar 9, 2026NKE7.34-24.48
2026-04-28Apr 28, 2026HD4.32-3.41
2026-04-29Apr 29, 2026HD4.92-0.5
2026-05-11May 11, 2026T4.71-8.69
2026-07-24Jul 24, 2026AMZN6.1211.43
2026-08-12Aug 12, 2026NKE4.57-9.6
2026-08-20Aug 20, 2026INTC11.8917.88
2026-08-31Aug 31, 2026GS1-10.69
2026-09-01Sep 1, 2026HD5.36-11.03
The exact SQL behind every number
WITH
bars AS (
    SELECT
        ticker,
        date,
        toFloat64(high)  AS hi,
        toFloat64(low)   AS lo,
        toFloat64(close) AS px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL','MSFT','NVDA','AMZN','GOOGL','META','TSLA','AVGO','JPM','BAC','WFC','GS','KO','PEP','PG','JNJ','PFE','MRK','XOM','CVX','WMT','HD','MCD','NKE','CSCO','INTC','IBM','T','VZ','DIS')
      AND date >= '2010-01-04'
      AND date <= '2026-09-30'
),
split_dates AS (
    SELECT
        ticker,
        groupArray(execution_date) AS split_days
    FROM
    (
        SELECT ticker, execution_date
        FROM global_markets.stocks_splits
        WHERE execution_date >= '2009-10-01'
        GROUP BY ticker, execution_date
    )
    GROUP BY ticker
),
stepped AS (
    SELECT
        ticker,
        date,
        px,
        hi - lo AS rng,
        if(hi < lagInFrame(hi, 1) OVER w AND lo < lagInFrame(lo, 1) OVER w, 1, 0) AS lower_both
    FROM bars
    WINDOW w AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
feat AS (
    SELECT
        ticker,
        date,
        px,
        sum(lower_both) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)  AS wedge_streak,
        avg(rng)        OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)  AS rng5,
        groupArray(rng) OVER (PARTITION BY ticker ORDER BY date ROWS BETWEEN 64 PRECEDING AND 5 PRECEDING) AS prior_rng,
        lagInFrame(px, 5)   OVER wf AS px_back5,
        leadInFrame(px, 5)  OVER wf AS px_fwd5,
        leadInFrame(px, 10) OVER wf AS px_fwd10,
        leadInFrame(px, 20) OVER wf AS px_fwd20
    FROM stepped
    WINDOW wf AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
),
scored AS (
    SELECT
        f.ticker   AS ticker,
        f.date     AS date,
        f.px       AS px,
        f.px_back5 AS px_back5,
        f.px_fwd20 AS px_fwd20,
        if(f.wedge_streak = 4 AND f.rng5 < arraySort(f.prior_rng)[15], 1, 0) AS is_wedge
    FROM feat AS f
    LEFT JOIN split_dates AS s ON s.ticker = f.ticker
    WHERE length(f.prior_rng) = 60
      AND f.px_back5 > 0
      AND f.px_fwd5  > 0
      AND f.px_fwd10 > 0
      AND f.px_fwd20 > 0
      AND NOT arrayExists(d -> (d >= f.date - 10) AND (d <= f.date + 32), s.split_days)
)
SELECT
    signal_date,
    signal_label,
    ticker,
    five_day_fall_pct,
    fwd_20_pct
FROM
(
    SELECT
        toString(date)                           AS signal_date,
        formatDateTime(date, '%b %e, %Y')        AS signal_label,
        ticker,
        round(abs(100 * (px / px_back5 - 1)), 2) AS five_day_fall_pct,
        round(100 * (px_fwd20 / px - 1), 2)      AS fwd_20_pct
    FROM scored
    WHERE is_wedge = 1
    ORDER BY date DESC
    LIMIT 12
)
ORDER BY signal_date ASC
Run am yourself

Di last 12 wedges wey di rule catch dey inside dat panel, each one with wetin follow am. Take di one for HD on Sep 1, 2026: price fall 5.36% inside di five bars wey form di body, an twenty sessions later e move -11.03%. Run your eye down di last column an you go see di spread. Some run up strong, some continue to fall. Dat na di correct picture, an e match di distribution wey dey above am.

So wetin di falling wedge still good for

Even when di edge thin like dis, di shape still give you one level wey no be opinion:

  • Di stop level. Di lowest low inside di five wedge bars na di line. If price close below am, di pattern don die by im own definition, no story needed. Old levels like di 52-week high an low fit mark di same kind of boundary, an anchored VWAP na another one wey dey computed instead of drawn.
  • Di size of your risk. Di distance between your entry an dat low na your risk per share. Example wey be only example: entry $10.00, wedge low $9.50, risk per share na $0.50. If your own rule na say one trade no go risk pass 1% of one $2,000 account, dat na $20, an $20 divided by $0.50 na 40 shares. Dat arithmetic na di part wey dey fully for your hand.
  • Di tight range na im make di stop sit near di entry. Same naira risk dey carry more share. Dat na di practical use of any pattern wey dey squeeze.
  • Di wedge no dey tell you how far price go travel. Di measured move idea wey people dey teach (di height of di wedge mouth) na rule of thumb, an nothing for dis page test am.

If you dey trade from Lagos, remember say US clock na im dey close di daily bar. Regular session dey open 2:30pm your time for most of di year, an 3:30pm from early November till March when America fall back dia clock, an e dey close 9pm or 10pm Lagos time. So di wedge wey you dey watch for daily chart dey complete late for night, no be for afternoon.

One more caution. If you carry dis same rule go small, thin names, di answer fit change, an no be for di sweet side: wide spread an gap dey chop di kind thin edge wey we measure here. Backtest for market wey thin carry im own trap.

Full data notes

Di test cover thirty large US names from January 2010 till September 2026, daily bars only. Four things worth knowing before you quote any number from dis page:

  • Bars na raw, no split adjustment. So we comot any wedge window wey get stock split inside am (ten calendar days before till thirty-two after), sake of say one split dey look like mad fall for raw bar an e go poison di forward return.
  • Di base rate count every session for di same names over di same window, including di wedge days demsef. Dat na di unconditional number.
  • Di thirty names still dey trade today. Companies wey die no dey inside, so di base rate itself dey lean friendly. Any comparison between di wedge an di base rate dey less affected by dis, since di two share di same names.
  • No breakout confirmation dey inside di rule. We measure from di last bar of di wedge body, no be from any close above di upper line. Add dat condition an both numbers go change.

FAQ

Falling wedge na bullish pattern?

For di test on dis page, wedge days close higher 54% of di time twenty sessions later, against 57.1% for all days across di same names an window. Dat gap too small to carry di strong bullish promise wey many textbook dey give.

How many bar di falling wedge suppose get?

No official number dey. Hand-drawn wedge fit take weeks or months on one chart. We pick a five-bar body for dis page so di rule fit run di same way across every name, an we write di number for di open so anybody fit change am an count again.

Wetin make falling wedge different from descending triangle?

For falling wedge, di highs an di lows both dey drop, an di top line dey drop faster. For descending triangle, di lows dey rest for one flat level while di highs dey drop. Di flat bottom na di first thing your eye suppose check.

Where person dey put stop for falling wedge?

Di common place na small below di lowest low inside di wedge body, sake of say one close below dat point kill di pattern by im own definition. Di distance from your entry to dat level na your risk per share, an na dat number dey decide how many share fit enter di risk wey you set for yourself.

Dis rule fit work for crypto or forex chart?

Di numbers here come from US stock daily bars only. Crypto dey trade 24/7 an forex get im own session clock, so five daily bars no dey cover di same amount of market time for those places. You go need count am again for dat market before you carry any figure from dis page go there.


Every panel on dis page get di exact SQL under am. Open any one, change di four-day run to five, or move di quartile to di median, an watch wetin di numbers do. You fit ask di same question for plain English on di Strasmore terminal.

#technical-analysis#chart-patterns#falling-wedge#trend-reversal#beginners