Culgan Wealth
Market Reversal v1
Pine Script® v6 TradingView
Market Reversal v1Overlay IndicatorDaily Timeframe

Market Reversal Indicator

Identifies high-probability bullish and bearish reversal zones by combining four confluence signals — candlestick patterns, support/resistance levels, RSI divergence, and volume confirmation. Signals are rated ★ to ★★★ based on how many confluences align. Only trade ★★★ signals.

How It Fits Your Workflow

Use this indicator after the Simple Screener narrows your watchlist

Sunday
Run Simple Screener
Find stocks scoring 4–5/5
Daily
Check Reversal Indicator
Look for ★★★ at S/R levels
Signal
Wait for Confirmation
Next candle closes above signal high
Entry
Run Position Calculator
Size position with 1% Rule

Critical rule: Never enter on the signal candle itself. Always wait for the next candle to close above the signal candle high (bullish) or below the signal candle low (bearish). This confirmation step eliminates the majority of false signals.

Signal Strength Guide

More confluences = higher probability — only trade ★★★

Action
Prepare your trade. Wait for next candle confirmation, then enter.
Entry Trigger
Next candle closes above signal candle high (bull) or below signal candle low (bear)
Stop Loss
Below signal candle low (bull) or above signal candle high (bear)

The 4 Confluence Signals

Click each signal to see all patterns and the logic behind them

BULLISH
Bullish Engulfing
A bearish candle is fully engulfed by the next bullish candle. The bull candle body must cover at least 60% of the total range. Strong institutional buying pressure.
BEARISH
Bearish Engulfing
A bullish candle is fully engulfed by the next bearish candle. Signals institutions are distributing (selling) into the rally.
BULLISH
Hammer
Small body at the top, long lower wick (2× the body), little/no upper wick. Must occur while price is below EMA 21 (downtrend). Buyers rejected the lows.
BEARISH
Shooting Star
Small body at the bottom, long upper wick (2× the body), little/no lower wick. Must occur while price is above EMA 21 (uptrend). Sellers rejected the highs.
BULLISH
Morning Star
3-candle pattern: large bearish → small indecision candle → large bullish that closes above the midpoint of candle 1. Classic bottom reversal.
BEARISH
Evening Star
3-candle pattern: large bullish → small indecision candle → large bearish that closes below the midpoint of candle 1. Classic top reversal.
BOTH
Doji at Extremes
A doji (body < 15% of range) at oversold RSI levels signals bullish indecision. At overbought RSI levels, signals bearish indecision. Alone it is weak — needs other confluences.

Bullish Reversal Checklist

1
Price is in a downtrend (below EMA 21)
2
Bullish candlestick pattern fires (Hammer, Engulfing, Morning Star)
3
Pattern occurs near a key support level
4
RSI is below 50 — ideally near 30 (oversold)
5
Volume is above the 20-day average
6
Wait for next candle to close above signal candle high
7
Enter with stop below signal candle low

Bearish Reversal Checklist

1
Price is in an uptrend (above EMA 21)
2
Bearish candlestick pattern fires (Shooting Star, Engulfing, Evening Star)
3
Pattern occurs near a key resistance level
4
RSI is above 50 — ideally near 70 (overbought)
5
Volume is above the 20-day average
6
Wait for next candle to close below signal candle low
7
Short entry (or exit long) with stop above signal candle high

TradingView Setup Guide

Including alert setup — takes about 10 minutes

01
Open TradingView Pine Editor
Go to TradingView.com → open any chart → click the 'Pine Editor' tab at the bottom of the screen.
02
Paste the script
Delete any existing code in the editor. Click 'Copy Script' above, then paste (Ctrl+V / Cmd+V) into the Pine Editor.
03
Add to chart
Click 'Add to chart'. The indicator overlays directly on your price chart — labels appear above/below candles, and dashed S/R lines are drawn automatically.
04
Switch to Daily chart
This indicator is designed for the DAILY timeframe for swing trading. Press 'D' in TradingView to switch to daily. It also works on 4H for more active setups.
05
Set Minimum Signal Strength to 2
In indicator settings → Display → set 'Minimum Signal Strength' to 2. This filters out weak ★ signals and only shows ★★ and ★★★ setups.
06
Set up TradingView Alerts
Right-click the indicator → Add Alert → select 'AA Reversal — Strong Bullish (★★★)'. Set alert to 'Once Per Bar Close'. Repeat for bearish. You'll get notified on your phone when a ★★★ signal fires.
07
Combine with Simple Screener
The Market Reversal indicator works best on stocks that already score 3–5 on the Simple Screener. Use the Screener to find candidates, then use this indicator to time your entry.

Set Up Alerts — Never Miss a ★★★ Signal

The script includes four built-in alert conditions. Set these up on your watchlist stocks and TradingView will notify you on your phone the moment a high-probability reversal fires.

AA Reversal — Strong Bullish (★★★)
AA Reversal — Bullish Signal (★★+)
AA Reversal — Strong Bearish (★★★)
AA Reversal — Bearish Signal (★★+)

Alert setup: Right-click indicator on chart → Add Alert → select condition → set "Once Per Bar Close" → enable mobile push notifications.

Important Limitations

This indicator identifies potential reversals — not guaranteed ones. All signals require confirmation from the next candle before entering.

In strong trending markets, reversal signals can fail repeatedly. Always check the broader market verdict (from your Sunday Review) before acting on any signal.

Do not use this indicator as your only reason to enter a trade. It is one tool in the workflow — combine it with the Simple Screener score and the Position Size Calculator.

Pine Script® v6 Source Code

Copy and paste into TradingView Pine Editor

AA Market Reversal v1.pinev6
// Jessie's Market Reversal Screener
// Culgan Wealth | Pine Script v6
// Four confluence signals: Candlestick Pattern + S/R Level + RSI Divergence + Volume
// Signal Strength: 3=HIGH 2=MED 1=LOW
// HOW TO USE: Daily chart, look for 3-HIGH signals at key S/R levels
// Wait for NEXT candle to confirm before entering. Stop below signal low (bull) or above signal high (bear).

//@version=6
indicator("Jessie's Market Reversal Screener", shorttitle="Jessie Reversal", overlay=true, max_bars_back=500)

// INPUTS
bodyRatio = input.float(0.6, "Min Body Ratio (Engulfing)", group="Candles", minval=0.1, maxval=1.0, step=0.05)
dojiRatio = input.float(0.15, "Max Body Ratio (Doji)", group="Candles", minval=0.01, maxval=0.5, step=0.01)
hammerRatio = input.float(0.35, "Max Body Ratio (Hammer)", group="Candles", minval=0.1, maxval=0.6, step=0.05)
rsiLen = input.int(14, "RSI Length", group="RSI", minval=2)
rsiOB = input.float(70, "RSI Overbought", group="RSI", minval=50, maxval=90)
rsiOS = input.float(30, "RSI Oversold", group="RSI", minval=10, maxval=50)
divLookback = input.int(14, "Divergence Lookback", group="RSI", minval=5, maxval=50)
swingLen = input.int(10, "Swing Lookback", group="S/R", minval=3)
srZonePct = input.float(0.5, "S/R Zone Tolerance %", group="S/R", minval=0.1, maxval=2.0, step=0.1)
volMaLen = input.int(20, "Volume MA Length", group="Volume", minval=5)
volMultiplier = input.float(1.0, "Volume Multiplier", group="Volume", minval=0.5, maxval=3.0, step=0.1)
minStrength = input.int(2, "Min Signal Strength (1-3)", group="Display", minval=1, maxval=3)

// COLOURS
C_CYAN = color.rgb(0, 212, 170)
C_RED = color.rgb(239, 68, 68)
C_NAVY = color.rgb(13, 20, 33)
C_SLATE = color.rgb(148, 163, 184)
C_LIGHT = color.rgb(203, 213, 225)
C_BORDER = color.rgb(30, 58, 95)

// CANDLE MATHS
candleRange = high - low
candleBody = math.abs(close - open)
upperWick = high - math.max(close, open)
lowerWick = math.min(close, open) - low
isBull = close > open
isBear = close < open
bodyPct = candleRange > 0 ? candleBody / candleRange : 0
rsiVal = ta.rsi(close, rsiLen)
volMa = ta.sma(volume, volMaLen)
volOk = volume >= volMa * volMultiplier
ema21 = ta.ema(close, 21)
downtrend = close < ema21
uptrend = close > ema21

// CANDLESTICK PATTERNS
bullEngulf = isBear[1] and isBull and close > open[1] and open < close[1] and bodyPct >= bodyRatio
bearEngulf = isBull[1] and isBear and close < open[1] and open > close[1] and bodyPct >= bodyRatio
hammer = downtrend and bodyPct <= hammerRatio and lowerWick >= candleBody * 2.0 and upperWick <= candleBody * 0.5
shootingStar = uptrend and bodyPct <= hammerRatio and upperWick >= candleBody * 2.0 and lowerWick <= candleBody * 0.5
doji = bodyPct <= dojiRatio
bullDoji = doji and downtrend and rsiVal < rsiOS + 15
bearDoji = doji and uptrend and rsiVal > rsiOB - 15
morningStar = isBear[2] and candleBody[2] / candleRange[2] >= 0.5 and candleBody[1] / candleRange[1] <= 0.35 and isBull and candleBody / candleRange >= 0.5 and close > (open[2] + close[2]) / 2
eveningStar = isBull[2] and candleBody[2] / candleRange[2] >= 0.5 and candleBody[1] / candleRange[1] <= 0.35 and isBear and candleBody / candleRange >= 0.5 and close < (open[2] + close[2]) / 2
bullCandle = bullEngulf or hammer or bullDoji or morningStar
bearCandle = bearEngulf or shootingStar or bearDoji or eveningStar

// SUPPORT AND RESISTANCE
pivotH = ta.pivothigh(high, swingLen, swingLen)
pivotL = ta.pivotlow(low, swingLen, swingLen)
var float lastPH = na
var float lastPL = na
if not na(pivotH)
    lastPH := pivotH
if not na(pivotL)
    lastPL := pivotL
tol = close * (srZonePct / 100)
nearSup = not na(lastPL) and math.abs(close - lastPL) <= tol
nearRes = not na(lastPH) and math.abs(close - lastPH) <= tol
prevDH = request.security(syminfo.tickerid, "D", high[1])
prevDL = request.security(syminfo.tickerid, "D", low[1])
nearPrevH = math.abs(close - prevDH) <= tol
nearPrevL = math.abs(close - prevDL) <= tol
bullSR = nearSup or nearPrevL
bearSR = nearRes or nearPrevH

// RSI DIVERGENCE
lowestLow = ta.lowest(low, divLookback)
highestHigh = ta.highest(high, divLookback)
lowestRsi = ta.lowest(rsiVal, divLookback)
highestRsi = ta.highest(rsiVal, divLookback)
bullDiv = low <= lowestLow and rsiVal > lowestRsi and rsiVal < rsiOS + 20
bearDiv = high >= highestHigh and rsiVal < highestRsi and rsiVal > rsiOB - 20

// SIGNAL STRENGTH
bullCount = (bullCandle ? 1 : 0) + (bullSR ? 1 : 0) + (bullDiv ? 1 : 0) + (volOk ? 1 : 0)
bearCount = (bearCandle ? 1 : 0) + (bearSR ? 1 : 0) + (bearDiv ? 1 : 0) + (volOk ? 1 : 0)
bullStr = math.min(bullCount, 3)
bearStr = math.min(bearCount, 3)
bullSig = bullCandle and bullStr >= minStrength
bearSig = bearCandle and bearStr >= minStrength

// BACKGROUND HIGHLIGHT for 3-star signals
bgcolor(bullSig and bullStr >= 3 ? color.new(C_CYAN, 93) : bearSig and bearStr >= 3 ? color.new(C_RED, 93) : na, title="Reversal Zone")

// PLOTS
plot(bullStr > 0 ? bullStr : na, "Bull Strength", C_CYAN, display=display.none)
plot(bearStr > 0 ? bearStr : na, "Bear Strength", C_RED, display=display.none)
plot(rsiVal, "RSI", C_SLATE, display=display.none)

// ALERTS
alertcondition(bullSig and bullStr >= 3, title="Jessie Reversal - Strong Bullish", message="{{ticker}} - Strong Bullish Reversal 3-star | Price: {{close}}")
alertcondition(bullSig and bullStr >= 2, title="Jessie Reversal - Bullish Signal", message="{{ticker}} - Bullish Reversal 2-star | Price: {{close}}")
alertcondition(bearSig and bearStr >= 3, title="Jessie Reversal - Strong Bearish", message="{{ticker}} - Strong Bearish Reversal 3-star | Price: {{close}}")
alertcondition(bearSig and bearStr >= 2, title="Jessie Reversal - Bearish Signal", message="{{ticker}} - Bearish Reversal 2-star | Price: {{close}}")

// INFO TABLE
var table t = table.new(position.bottom_right, 2, 6, bgcolor=color.new(C_NAVY, 10), border_color=color.new(C_BORDER, 80), border_width=1, frame_color=color.new(C_CYAN, 60), frame_width=1)

if barstate.islast
    table.cell(t, 0, 0, "Jessie's Market Reversal", text_color=C_CYAN, text_size=size.small, bgcolor=C_NAVY, text_halign=text.align_left)
    table.cell(t, 1, 0, "Culgan Wealth", text_color=C_SLATE, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_right)
    table.cell(t, 0, 1, "RSI", text_color=C_LIGHT, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_left)
    table.cell(t, 1, 1, str.tostring(math.round(rsiVal, 1)), text_color=rsiVal < rsiOS ? C_CYAN : rsiVal > rsiOB ? C_RED : C_SLATE, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_center)
    table.cell(t, 0, 2, "Near Support", text_color=C_LIGHT, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_left)
    table.cell(t, 1, 2, nearSup ? "YES" : "NO", text_color=nearSup ? C_CYAN : C_SLATE, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_center)
    table.cell(t, 0, 3, "Near Resistance", text_color=C_LIGHT, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_left)
    table.cell(t, 1, 3, nearRes ? "YES" : "NO", text_color=nearRes ? C_RED : C_SLATE, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_center)
    table.cell(t, 0, 4, "Bull Signal", text_color=C_LIGHT, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_left)
    table.cell(t, 1, 4, bullSig ? bullStr >= 3 ? "3 - HIGH" : "2 - MED" : "-", text_color=bullSig ? C_CYAN : C_SLATE, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_center)
    table.cell(t, 0, 5, "Bear Signal", text_color=C_LIGHT, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_left)
    table.cell(t, 1, 5, bearSig ? bearStr >= 3 ? "3 - HIGH" : "2 - MED" : "-", text_color=bearSig ? C_RED : C_SLATE, text_size=size.tiny, bgcolor=C_NAVY, text_halign=text.align_center)