TradingView chart patterns

V-bottom and V-top patterns: what is knowable before the turn?

A V bottom pattern is a sharp decline followed by a sharp recovery around one narrow turning area. A V top reverses that sequence: a sharp rise turns into a sharp decline. The completed shape is visible only after the second leg develops. A live signal therefore needs a recovery threshold and a deadline chosen in advance; the lowest or highest candle alone cannot confirm the reversal.

See the decision guide

A V-shaped recovery is a description, not advance knowledge

In the LBMA article Reversal Patterns, Taso Anastasiou describes V formations as abrupt reversals with little warning, often following a steep trend. That observation explains the timing problem; it does not establish a universal bar count, percentage recovery or win rate. A stock can finish a visually clear V after the opportunity to enter near its low has passed.

  • A V bottom chart pattern can contain several candles around its turn. The strict close-only experiment below deliberately accepts a narrower subset; it is not a universal visual classifier.
  • Keep the symbol, venue, session, timeframe and adjustment settings fixed. A V-shaped recovery in a stock price also says nothing by itself about a recovery in the company earnings or the economy.
StructureTurning behaviorWhat remains unknown at the low
V bottomOne narrow turn from fast decline to fast recoveryWhether a sustained recovery will follow
V topOne narrow turn from fast rise to fast declineWhether the decline will persist after the high
Rounded bottomA broader base with gradual change in slopeWhether price will leave the base
Double bottomTwo distinct low tests separated by a reboundWhether the second test and neckline break will occur

Freeze a rule before revealing the recovery

Use standard price candles and positive closing prices. This teaching experiment arms a bottom candidate after three consecutive lower closes with a total decline of at least 6% from the close three bars earlier. At that moment, save origin A, terminal close L, depth D = A - L and recovery level T = L + 0.80D. L is a provisional turning close, not a confirmed swing low. All numerical thresholds are chosen assumptions, not optimized settings.

  • Do not move the terminal close, origin, threshold or deadline to fit later prices. A new low cancels this candidate instead of silently stretching its first leg.
  • Only one candidate or failure watch runs at a time. Ignore overlapping setups; after cancellation, expiry, failure or the end of the three-bar watch, begin looking again on the following bar. Never rearm on the exit bar.
  • The detector ignores intrabar highs, lows and volume. A wick through a level changes no decision. A volume filter or tolerance for pauses would define a different experiment.
DecisionV bottom ruleV top mirror
Arm while idleC0 > C1 > C2 > C3; (C0 - C3) / C0 ≥ 6%C0 < C1 < C2 < C3; (C3 - C0) / C0 ≥ 6%
Freeze at C3 closeA = C0; L = C3; D = A - L; T = L + 0.80DA = C0; H = C3; D = H - A; T = H - 0.80D
Evaluate next three closesEvery close must be strictly higher than the previous closeEvery close must be strictly lower than the previous close
ConfirmFirst eligible close ≥ T, including the third recovery barFirst eligible close ≤ T, including the third decline bar
Cancel or expireA flat/lower close cancels first; otherwise expire if third close is below TA flat/higher close cancels first; otherwise expire if third close is above T
Watch after confirmationFirst close < T within the next three bars is a failureFirst close > T within the next three bars is a failure

Recalculate both directions bar by bar

These invented closes use equal bar intervals. For the bottom, A = 100 and L = 90, so D = 10 and T = 90 + 0.80 × 10 = 98. The decline is 10% over three intervals, averaging 3.33 price units per bar. Recovering eight units over the next three intervals averages 2.67 units per bar. A chart angle is unnecessary and would change with zoom or scale.

  • For the top, H = 110 and D = 10, so T = 110 - 8 = 102. Confirmation at 102 does not mean the script knew bar 3 would be the high.
  • Do not mark an entry at 90 or 110 using the later confirmation. A 100% return to the origin would be a different threshold and a later event on these paths.
  • Three hourly bars and three daily bars are different periods. The relative speed here is a rule in bars, not a claim that all markets reverse on the same clock.
Completed barBottom closeTop closeInformation available then
0100100Origin observation only
197103First directional change
294106Second directional change
390110Arm candidate; freeze T at 98 for bottom or 102 for top
49210820% of the first leg reversed; no signal
59610460% reversed; no signal
69810280% reversed on the final eligible close; confirm here

Keep failed confirmations and missed recoveries

Each alternative below starts with the same bottom closes 100, 97, 94, 90. Preserve every candidate in the review log. A recovery that the rule misses is useful evidence about its deadline; it must not be retrospectively inserted into the confirmed sample.

  • For the mirrored top, a close at 102.5 after confirmation at 102 is a failure under the same rule. A flat close cancels a candidate, but equality at the threshold does not fail an already confirmed event.
  • The three-bar failure window is an observation rule, not a stop order. A decline after that window remains a trading risk even though this detector no longer labels it.
Subsequent closesRecorded eventCalculation or failure condition
Bars 4 to 6: 92, 96, 98; bar 7: 97.5Confirmed at 6, failed at 797.5 < frozen T of 98 during the three-bar watch
Bars 4 to 6: 94, 96, 97.8; bar 7: 101Expired at 6; later recovery missed(97.8 - 90) / 10 = 78%, below 80%; bar 7 is too late
Bars 4 to 6: 94, 93, 99Cancelled at 5; no signal at 693 is below the previous 94 close; the final rebound cannot revive the candidate
Bar 4: 89; then 95, 101Cancelled at 4A lower terminal close requires a new candidate, not a rewritten 90 anchor
Bars 4 to 6: 92, 96, 98; bars 7 to 9: 98, 99, 100No failure during the watchEquality at 98 is allowed after confirmation; this is not a profit classification

Inspect the Pine Script event timing

This Pine Script v6 indicator implements the fixed experiment above. Select Bottom or Top, inspect C (candidate), V (confirmation), R (cancellation), E (expiry) and F (failure) on the bars when those facts become available. The orange line is the frozen threshold while a candidate or watch is active. TradingView documents that barstate.isconfirmed becomes true on the closing update of a realtime bar.

  • Add the indicator to standard candles and create an alert from its confirmation or failure condition, choosing Once Per Bar Close. Historical markers are not historical alert deliveries.
  • The code evaluates only closed bars and does not move an event back to an earlier turn. Feed revisions, changed chart settings and different history start points can still change a recalculated sample; closed-bar logic is not a guarantee against every form of repainting.
  • A syntax check does not establish recognition quality or profitability. Compare events with the written rules before considering additional filters or a strategy conversion.
Educational detector, not a trading strategy. Thresholds are fixed in the source. No future pivots, plot offsets, higher-timeframe requests, orders or performance statistics are used.pine
//@version=6
indicator("V reversal: fixed close-only experiment", overlay = true)
mode = input.string("Bottom", "Direction", options = ["Bottom", "Top"])
float direction = mode == "Bottom" ? 1.0 : -1.0
float x = direction * close
// Phase 0: idle; 1: candidate; 2: three-bar failure watch.
var int phase = 0
var int armedBar = na
var int confirmedBar = na
var float threshold = na
bool armed = false
bool confirmed = false
bool rejected = false
bool expired = false
bool failed = false
bool enoughData = not na(close[3])
bool positivePrices = enoughData and math.min(math.min(close, close[1]), math.min(close[2], close[3])) > 0
bool fallingLeg = enoughData and x < x[1] and x[1] < x[2] and x[2] < x[3]
float legSize = enoughData ? x[3] - x : na
bool setup = positivePrices and fallingLeg and legSize / close[3] >= 0.06

if barstate.isconfirmed
    if phase == 0
        if setup
            threshold := x + 0.8 * legSize
            armedBar := bar_index
            phase := 1
            armed := true
    else if phase == 1
        int age = bar_index - armedBar
        // A flat or adverse close cancels before confirmation is checked.
        if x <= x[1]
            rejected := true
            phase := 0
        else if x >= threshold
            confirmed := true
            confirmedBar := bar_index
            phase := 2
        else if age >= 3
            expired := true
            phase := 0
    else
        int age = bar_index - confirmedBar
        if x < threshold
            failed := true
            phase := 0
        else if age >= 3
            phase := 0

plot(phase != 0 ? direction * threshold : na, "Frozen 80% level", color.orange, style = plot.style_linebr)
plotshape(armed, title = "Candidate", style = shape.circle, location = location.abovebar, color = color.gray, text = "C")
plotshape(confirmed, title = "Confirmed", style = shape.diamond, location = location.abovebar, color = color.blue, text = "V")
plotshape(rejected, title = "Rejected", style = shape.xcross, location = location.belowbar, color = color.orange, text = "R")
plotshape(expired, title = "Expired", style = shape.xcross, location = location.belowbar, color = color.gray, text = "E")
plotshape(failed, title = "Failed within 3 bars", style = shape.xcross, location = location.belowbar, color = color.red, text = "F")
alertcondition(confirmed, "V rule confirmed", "The fixed close-only V rule confirmed on this bar.")
alertcondition(failed, "V rule failed", "Price closed back through the frozen recovery level within three bars.")

Separate confirmation from a usable entry

Suppose the bottom confirms at 98 and a hypothetical next-bar entry fills at 99. If an independently chosen protective level is 90 and the reference objective is the old origin at 100, planned risk is 99 - 90 = 9 units and remaining upside is 100 - 99 = 1 unit. The gross reward-to-risk ratio is 1 / 9, about 0.11, before costs. Recognizing a V does not make those trade terms attractive.

  • TradingView strategy market orders normally fill on the next available tick, often the next historical bar open under default settings. The indicator above submits no orders and does not simulate those fills.
  • A stop level does not guarantee its execution price during a gap. Define position size, costs, slippage and holding period separately; do not infer them from the pattern label.
  • Save a chart before the candidate resolves and another at confirmation. Record A, L or H, T, direction, candidate time, confirmation time and the next three closes. Keep cancelled and expired rows alongside confirmed rows.

Use Pineify to review the screenshot and the rule

AI Chart Analysis accepts a chart image for interpretation. Provide a labeled screenshot showing the symbol, timeframe, full first leg, saved threshold and latest completed bar. Compare its interpretation with the visible prices. A screenshot cannot reveal future candles, verify an intrabar fill or establish a detector success rate.

  • Use Pine Script AI Coding Agent when you need a draft with different duration, amplitude or recovery rules. Include cancellation precedence and overlap handling in the request so the intended events can be reviewed.
  • Keep the fixed example as a reference when reviewing a generated revision. Syntax-check the final source and inspect its signals in TradingView; this page does not provide an automatic V-pattern market scanner.
Where Pineify fits

AI Chart Analysis

Upload a labeled V-reversal chart for interpretation, then check the response against the visible closes and your saved threshold.

Also useful: Pine Script AI Coding Agent. Draft or modify explicit reversal rules, then review the source and compare event timing on TradingView.

Review a chart screenshot

Frequently asked questions

Educational information, not investment advice. Prices, thresholds, event paths and trade arithmetic are hypothetical. No market backtest, recognition accuracy or return is reported. Pattern confirmation does not guarantee continuation, a fill price or profit.

Sources and verification

Published by Pineify. Pineify is an independent product and is not affiliated with TradingView. Sources support the technical explanations; examples do not establish trading performance.