Six Candlestick Patterns: Context, Confirmation, and Risk

Video: The BEST Candlestick Pattern Guide You’ll EVER FIND
Creator: Data Trader
Original Video: Watch the original video
Difficulty: Intermediate

The Big Idea

A candlestick pattern becomes a trading hypothesis when you connect its shape to a location, a confirmation rule, and an invalidation price. Data Trader presents six patterns and then places them at support, resistance, or trendline confluence. The practical lesson is to choose the location before the signal arrives and decide exactly what would make the trade wrong.

The video describes these patterns as proven and claims that 99% of other patterns do not work. It supplies no trade ledger, sample definition, costs, or statistical comparison to establish those claims. Treat the six patterns as a research shortlist, not a ranked list of profitable strategies.

Read the Candle Before Naming the Pattern

On a standard candlestick chart, each bar records an open, high, low, and close for its interval. The real body is the distance between open and close; the shadows show price extremes outside that body. A conventional closing-price line chart omits those extremes.

A green body means the close exceeded the open; a red body means the reverse. A long lower shadow shows that price traded below the body and finished above that low. These observations do not identify the traders involved, measure aggressive buying and selling, or establish the order in which the high and low occurred. Descriptions such as “buyers took control” are interpretations of price movement.

Compare body size with a defined recent baseline. A $1 body means something different on a quiet $20 stock and a volatile $500 stock. Also separate body size from total range: a tiny body can sit inside a very large, volatile candle.

The Six Patterns: Shape, Trigger, and Stop

PatternWhat the source looks forEntry and initial stop in the video
EngulfingTwo opposite-color candles; the second real body covers the first body. Bullish is red then green; bearish is green then red. Engulfing the wicks is not required.Enter after the second candle closes. Bullish stop at its low; bearish stop at its high.
Pin barSmall body and a long shadow on one side. The source’s bullish version is green with a lower shadow; its bearish version is red with an upper shadow.Prefer an additional matching-color candle, then enter after its close. Stop beyond the pin bar’s shadow extreme.
Three-bar continuationLarge trend-color body, smaller opposite-color body, then another large trend-color body. The middle body ideally is no more than half the first. Final close advances beyond the middle close in the trade direction.Enter after the third close. Stop at the second candle’s low for longs or high for shorts.
Three-bar reversalLarge first body, smaller second body of the same color, then a large opposite-color body. The source favors a third body at least as large as the first.The initial explanation enters after the third close; a later example enters at the third candle’s high. Stop at the second candle’s relevant extreme.
Consolidation breakoutAt least three small-body candles followed by a large directional candle. Define the actual consolidation boundaries before calling a move a breakout.Enter after the breakout closes. The source places the stop at the breakout candle’s open, not necessarily outside the entire base.
Shrinking candlesAt least three same-color bodies getting progressively smaller, followed by a large opposite-color body. The source prefers that reversal to clear the second candle in the sequence.Enter after the reversal close. Stop at the immediately preceding candle’s low for longs or high for shorts.

These are the video’s definitions, not universal naming conventions. For shrinking candles, specify whether “clear the second candle” means its close, body edge, or full high/low. For a breakout, several small bodies alone do not establish a tight range: their shadows may cover a wide area.

Location Comes Before Confirmation

  1. Mark the level in advance. The source’s support example uses two earlier reactions and waits for a third visit. Record the zone while those earlier reactions are already visible.
  2. Describe the approach. Is price retracing within a trend, testing an old range boundary, or attempting to reverse a strong move? A reversal pattern and a continuation pattern answer different questions.
  3. Wait for the chosen pattern to finish. An unfinished bar can change color or lose its apparent engulfing shape before the close.
  4. Validate the stop and available room. A long stop must be below the planned entry; a short stop must be above it. Identify opposing levels before assuming a 2R target is accessible.
  5. Use one execution rule consistently. Record both signals you trade and signals you reject, with the rejection reason.

Data Trader prefers hourly and higher charts. That is a source preference, not demonstrated evidence that every hourly pattern outperforms every intraday version. Compare timeframes using consistent definitions and realistic costs.

A trendline meeting an old support-turned-resistance zone may improve the clarity of the location. Those two observations often come from the same price history; counting them as two independent proofs exaggerates the evidence.

A Close Entry and a Breakout Entry Are Different Tests

The three-bar reversal explanation initially enters at the third candle’s close. The later support example instead says to enter at that candle’s high. For a bullish setup, a subsequent break above the completed signal high requires a buy-stop trigger; merely touching that high before the candle closes is not equivalent confirmation. The bearish mirror would require a later break below the signal low.

If you use a pending trigger, define its expiry, cancellation conditions, and gap handling. Waiting may eliminate signals that never follow through, but it also increases entry distance from the stop. Do not backtest a favorable intrabar high touch using a pattern that only became identifiable at the final close.

Original Example: The Same Pattern, Different Risk

Suppose support was identified around $100 before a bullish three-bar reversal forms. The second candle’s low is $99.60, the third closes at $101.20, and its high is $101.60. These are illustrative numbers, not prices reconstructed from the video.

  • A $101.20 close-based entry has $1.60 of nominal risk per share. A 2R target is $104.40.
  • A later $101.65 breakout fill has $2.05 of nominal risk per share. Its 2R target is $105.75.
  • With a $100 planned risk budget, whole-share quantities would be 62 and 48 respectively, before costs and execution uncertainty.

The breakout version needs more distance to reach its target. If meaningful resistance sits near $104.50, that changes the decision. A stop order also cannot guarantee that a gap will fill at the stop price. The source’s second-candle stop may be tighter than the low of the full three-bar formation; testing that alternative is a separate strategy variation.

Pine Script: Test the Three-Bar Reversal at a Known Level

Show Pine Script — three-bar reversal research strategy

//@version=6
// Guide: https://candlechasers.com/six-candlestick-patterns-context-confirmation-risk/
strategy("Three-bar reversal research [CandleChasers]", overlay=true,
     initial_capital=10000, pyramiding=0,
     commission_type=strategy.commission.percent, commission_value=0.01,
     slippage=2, margin_long=100, margin_short=100,
     calc_on_order_fills=false, calc_on_every_tick=false,
     process_orders_on_close=false)
length = input.int(20, "Prior average body length", minval=5)
large = input.float(1.2, "First body / prior average", minval=0.1)
small = input.float(0.5, "Second / first body maximum", minval=0.05, maxval=1)
full = input.float(0.6, "Minimum body / range", minval=0.1, maxval=1)
rr = input.float(2.0, "Reward / risk", minval=0.1)
units = input.float(1.0, "Fixed units or contracts", minval=0.001)
useLevel = input.bool(false, "Require manually selected level")
support = input.float(0.0, "Support price (0 disables longs)", minval=0)
resistance = input.float(0.0, "Resistance price (0 disables shorts)", minval=0)
knownFrom = input.time(timestamp("01 Jan 2026 00:00 +0000"), "Level known from")
zone = input.float(0.25, "Level tolerance in ATR", minval=0)
body = math.abs(close - open)
rangeSize = math.max(high - low, syminfo.mintick)
meanBody = ta.sma(body, length)
atr = ta.atr(14)
// Average ends before the three-candle sequence begins.
firstLarge = body[2] >= large * meanBody[3]
shapes = firstLarge and body[1] > 0 and body[1] <= small * body[2] and body >= body[2] and body[2] / rangeSize[2] >= full and body / rangeSize >= full
bull = shapes and close[2] < open[2] and close[1] < open[1] and close > open and close > open[2]
bear = shapes and close[2] > open[2] and close[1] > open[1] and close < open and close < open[2]
patternLow = math.min(low, math.min(low[1], low[2]))
patternHigh = math.max(high, math.max(high[1], high[2]))
// Prior-bar ATR makes tolerance independent of the signal candle.
tolerance = atr[1] * zone
longContext = not useLevel or (support > 0 and time[2] >= knownFrom and patternLow >= support - tolerance and patternLow <= support + tolerance and close > support)
shortContext = not useLevel or (resistance > 0 and time[2] >= knownFrom and patternHigh >= resistance - tolerance and patternHigh <= resistance + tolerance and close < resistance)
var float stopPrice = na
var int targetTicks = na
var int patterns = 0
var int submitted = 0
validChart = chart.is_standard
closedThisBar = strategy.closedtrades > nz(strategy.closedtrades[1], 0)
if barstate.isconfirmed
    if bull or bear
        patterns += 1
    // Avoid an immediate re-entry on the bar that just closed a trade.
    if strategy.position_size == 0 and not closedThisBar
        stopPrice := na
        targetTicks := na
        if validChart and bull and longContext and low[1] < close
            stopPrice := low[1]
            targetTicks := int(math.max(1, math.round(rr * (close - stopPrice) / syminfo.mintick)))
            strategy.entry("L", strategy.long, qty=units)
            strategy.exit("LX", "L", stop=stopPrice, profit=targetTicks)
            submitted += 1
        else if validChart and bear and shortContext and high[1] > close
            stopPrice := high[1]
            targetTicks := int(math.max(1, math.round(rr * (stopPrice - close) / syminfo.mintick)))
            strategy.entry("S", strategy.short, qty=units)
            strategy.exit("SX", "S", stop=stopPrice, profit=targetTicks)
            submitted += 1
// Fixed brackets are attached at submission, including the entry bar.
if strategy.position_size > 0
    strategy.exit("LX", "L", stop=stopPrice, profit=targetTicks)
if strategy.position_size < 0
    strategy.exit("SX", "S", stop=stopPrice, profit=targetTicks)
targetPrice = strategy.position_size > 0 ? strategy.position_avg_price + targetTicks * syminfo.mintick : strategy.position_size < 0 ? strategy.position_avg_price - targetTicks * syminfo.mintick : na
plot(useLevel and time >= knownFrom and support > 0 ? support : na, "Support", color.green)
plot(useLevel and time >= knownFrom and resistance > 0 ? resistance : na, "Resistance", color.red)
plot(strategy.position_size != 0 ? stopPrice : na, "Frozen stop", color.orange, style=plot.style_linebr)
plot(targetPrice, "Frozen target", color.aqua, style=plot.style_linebr)
plotshape(barstate.isconfirmed and bull, title="Bullish pattern", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny)
plotshape(barstate.isconfirmed and bear, title="Bearish pattern", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny)
var table status = table.new(position.top_right, 1, 4)
if barstate.islast
    message = not validChart ? "Use standard candles" : useLevel and support == 0 and resistance == 0 ? "Blocked: enter a support or resistance" : useLevel ? "Manual level filter ON" : "Pattern-only research mode"
    table.cell(status, 0, 0, message, text_color=chart.fg_color)
    table.cell(status, 0, 1, "Patterns: " + str.tostring(patterns), text_color=chart.fg_color)
    table.cell(status, 0, 2, "Entry orders submitted: " + str.tostring(submitted), text_color=chart.fg_color)
    table.cell(status, 0, 3, "Closed trades: " + str.tostring(strategy.closedtrades), text_color=chart.fg_color)

The following Pine Script v6 strategy turns one pattern into an explicit experiment. It does not implement all six patterns or reproduce Data Trader’s discretionary results. It uses a large first body relative to a prior average, a second body no larger than a chosen fraction of the first, and a final opposite body at least as large as the first. It additionally requires the final close to clear the first body’s outer edge, following the video’s bullish context example and a bearish mirror.

Optional manual support or resistance must have been known before the entire three-bar formation began. Set the “Level known from” timestamp honestly. The script cannot verify the two prior bounces, a trendline, or whether you selected a level with hindsight. The filter is OFF by default so the script can test patterns immediately without requiring price inputs. Enable it only after entering a valid support and/or resistance price and its known-from date. With the filter enabled, a zero level disables that direction. Use separate date windows when changing levels. Pattern-only mode is a baseline experiment, not the source’s complete context strategy.

Signals are evaluated on completed standard-chart bars. Market orders normally fill at the next bar’s open, rather than assuming an exact signal-close fill. The initial stop is the second candle’s extreme. The take-profit distance is calculated in ticks from the signal close to that stop, multiplied by the reward/risk input, then anchored to the actual simulated entry fill. Both orders are attached when the entry is submitted; no order-fill recalculation is required. Gaps and slippage mean the realized ratio may differ from the selected 2R; a fill through the stop can lead to an immediate stop execution under the emulator’s rules. The bracket is frozen for the trade. Fixed units make results sensitive to price and stop distance; they are not constant percentage-risk sizing. Adjust contract units, margin, and costs to the instrument.

The script includes example commission and slippage settings, prohibits pyramiding, and disables order-fill and intrabar recalculation. Keep “After order is filled” and “On every tick” disabled in Strategy Properties. The status panel distinguishes detected patterns, submitted orders, and closed trades. If orders are submitted but do not fill, check capital, fixed units, the instrument’s contract value, and margin. If no patterns are detected, try a longer history or a different symbol/timeframe before changing the documented shape thresholds. TradingView’s broker emulator still relies on historical execution assumptions. Review the official strategy documentation (paid link) for order timing, fill behavior, and testing limitations. This code has not been compiled or backtested in TradingView here; no performance results are claimed.

How to Test Whether Context Adds Value

  1. Pattern alone versus a preselected level: keep body thresholds, exits, instrument, and dates identical. Record how many trades the filter removes and how expectancy and drawdown change.
  2. Body-strength thresholds: compare a final body at least 1.0 times the first with 1.25 times, using a separately documented modification. Avoid selecting the best threshold on the same sample used to report results.
  3. Stop location: compare the source’s second-candle extreme with the full pattern extreme. Recalculate quantity for equal planned monetary risk when comparing results outside this fixed-unit example.
  4. Entry timing: compare next-open execution with a separately implemented break of the completed signal high or low, including unfilled and expired orders. Do not substitute one timing model without documenting it.

Use a development period and a later untouched evaluation period. Record average win, average loss, expectancy after costs, maximum drawdown, trade count, and exposure alongside win rate. An idealized system earning 2R on each winner and losing 1R on each loser breaks even at one-third winners before costs; actual partial exits, gaps, and unequal losses change that arithmetic.

Check representative trades manually: no entry before the final candle closes; no level used before it was known; stop on the correct side; target offset anchored to the entry fill; and no entry on a still-forming candle. Investigate bars where both stop and target were touched with finer historical data or Bar Magnifier where available. A chart showing a completed winner does not establish the sequence of fills inside that bar.

Common Mistakes

  • Buying a name instead of a setup: an engulfing body in the middle of a choppy range is a different hypothesis from one at a preselected support zone.
  • Assuming a larger candle means a better trade: a larger signal can also increase stop distance, entry slippage, and the distance to a feasible target.
  • Using candle color as the whole pin-bar definition: the source’s color restriction is one convention; explicitly record shadow and body requirements.
  • Calling three small bodies consolidation: measure the total base range and require a genuine boundary break.
  • Moving the level after seeing the outcome: hindsight can make almost any attractive reversal appear to have occurred at support.

Final Takeaway

Use the six patterns to organize observations, then make one setup testable. Define the level before the pattern, wait for confirmation, distinguish close entries from later breakout triggers, and measure results after costs. A pattern’s usefulness depends on those rules and its tested outcomes, not its name or a claim of a high win rate.

Risk Disclosure

This article and its code are for education and research, not financial advice or a recommendation to trade any asset. Trading can cause substantial losses; leverage can amplify them. Stops do not guarantee execution prices. Hypothetical backtests depend on data and modeling assumptions and cannot reproduce all live conditions. Commissions, spreads, slippage, liquidity, gaps, order behavior, market regimes, and discretionary level selection can materially change results. Historical performance does not guarantee future outcomes. Validate the code, instrument specifications, and risk controls before considering live use.

CandleChasers independently interprets the source material and is not affiliated with or endorsed by Data Trader. Source claims belong to the creator; the examples, research definitions, and code here are CandleChasers’ own educational work.

As an Amazon Associate I earn from qualifying purchases.