This indicator combines price plot, 9 EMA plot, 21 EMA plot and volume plot. The reason that the interaction of these particular individual indicators is relevant and important is because their interaction captures the relationship between price structure, trend persistence, and volume participation, allowing us to distinguish between continuation, exhaustion, and reversal conditions. Individually they show signals, but together they tell you whether a move is worth trading.
Here is how to translate the visual into actionable:
Who is in control + how aggressive they are
HIGH-VALUE SCENARIOS
1. LOW VOL PULLBACK (BULLISH CONTINUATION)
Condition:
Sellers are weak
No urgency to exit
Trend still intact
Meaning: Pullback → likely bounce
Trade Logic:
Condition:
Market is pausing, not selling
No distribution
Meaning: Continuation setup (A+)
3. ABSORPTION (HIDDEN BUYING)
Condition:
Sellers hitting bids
Buyers absorbing
Meaning: Fuel for next move up
4. HEALTHY TREND (CONTROLLED MOVE)
Condition:
Balanced buying
No exhaustion
Meaning: Trend continuation
5. EXHAUSTION (TOP RISK)
Condition:
Buyers getting trapped
Late entries
Meaning: Pullback likely
6. HIGH VOL SELLING (BEARISH)
Condition:
Real selling pressure
No absorption
Meaning: Avoid longs / short bias
7. WEAK PULLBACK (TREND AT RISK)
Condition:
Short-term trend breaking
Meaning: Transition phase
8. TREND BREAKDOWN
Condition:
Meaning: Bull trend likely over
9. NO EDGE / CHOP
Condition:
No control
Meaning: Stay out
AN EXAMPLE
“If price drops and 9 and 21 drop and volume drops…”
That actually becomes:
WEAKNESS, NOT BULLISH
This = lack of buyers AND sellers
Meaning: Drift / downtrend — not a bounce setup
SIMPLE DECISION FRAMEWORK
Ask 3 questions:
1. WHERE IS PRICE?
KEY INSIGHT (MOST IMPORTANT)
Volume tells you conviction
EMA tells you structure
Price tells you timing
Here is how to translate the visual into actionable:
Who is in control + how aggressive they are
HIGH-VALUE SCENARIOS
1. LOW VOL PULLBACK (BULLISH CONTINUATION)
Condition:
- Price ↓ (pulling back)
- EMA 9 ↑
- EMA 21 ↑
- Volume ↓
Meaning: Pullback → likely bounce
Trade Logic:
- Buy dips into 9 / 21
- Best version = shallow pullback
Condition:
- Price flat / slight ↓ near highs
- EMA 9 ↑
- EMA 21 ↑
- Volume ↓
Meaning: Continuation setup (A+)
3. ABSORPTION (HIDDEN BUYING)
Condition:
- Price ↓ or flat
- Volume ↑
- BUT price holds structure (no breakdown)
Meaning: Fuel for next move up
4. HEALTHY TREND (CONTROLLED MOVE)
Condition:
- Price ↑
- EMA 9 ↑
- EMA 21 ↑
- Volume steady (not spiking)
Meaning: Trend continuation
5. EXHAUSTION (TOP RISK)
Condition:
- Price ↑ fast
- Volume ↑↑ (spike)
- Price stalls or wicks
Meaning: Pullback likely
6. HIGH VOL SELLING (BEARISH)
Condition:
- Price ↓
- Volume ↑
- Breaks prior low
Meaning: Avoid longs / short bias
7. WEAK PULLBACK (TREND AT RISK)
Condition:
- Price ↓
- EMA 9 ↓
- EMA 21 still ↑ (lagging)
- Volume neutral / rising
Meaning: Transition phase
8. TREND BREAKDOWN
Condition:
- Price ↓ below 21 EMA
- EMA 9 ↓
- EMA 21 flattening or ↓
- Volume ↑
Meaning: Bull trend likely over
9. NO EDGE / CHOP
Condition:
- Price crossing 9 & 21 constantly
- EMA 9 flat
- EMA 21 flat
- Volume low
Meaning: Stay out
AN EXAMPLE
“If price drops and 9 and 21 drop and volume drops…”
That actually becomes:
- Price ↓
- EMA 9 ↓
- EMA 21 ↓
- Volume ↓
Meaning: Drift / downtrend — not a bounce setup
SIMPLE DECISION FRAMEWORK
Ask 3 questions:
1. WHERE IS PRICE?
- Above 9 = strong
- Between 9 & 21 = pullback
- Below 21 = danger
- Both up = trend
- 9 down, 21 up = pullback
- Both down = bearish
- Falling = weak move
- Rising = strong move
- Spike = exhaustion or break
| Setup | Meaning |
| Price ↓ + Vol ↓ + EMAs ↑ | BUY DIP |
| Price ↓ + Vol ↑ | SELL PRESSURE |
| Price flat + Vol ↓ | CONSOLIDATION |
| Price ↑ + Vol ↑ spike | EXHAUSTION |
| Price ↓ + EMAs ↓ | TREND DOWN |
KEY INSIGHT (MOST IMPORTANT)
Code:
# =========================
# EXECUTION CONTECT ENGINE
# NORMALIZED EMA + VOLUME PANEL
# antwerks 04/09/2026
# =========================
declare lower;
input normLength = 50;
# =========================
# PRICE + EMA
# =========================
def price = close;
def ema9 = ExpAverage(close, 9);
def ema21 = ExpAverage(close, 21);
# =========================
# NORMALIZATION RANGE
# =========================
def highestP = Highest(price, normLength);
def lowestP = Lowest(price, normLength);
def range = highestP - lowestP;
def normPrice = (price - lowestP) / range;
def normEMA9 = (ema9 - lowestP) / range;
def normEMA21 = (ema21 - lowestP) / range;
# =========================
# PLOTS (NOW VISIBLE)
# =========================
plot PriceNorm = normPrice;
PriceNorm.SetDefaultColor(Color.MAGENTA);
PriceNorm.SetLineWeight(2);
plot EMA9Norm = normEMA9;
EMA9Norm.SetDefaultColor(Color.CYAN);
EMA9Norm.SetLineWeight(2);
plot EMA21Norm = normEMA21;
EMA21Norm.SetDefaultColor(Color.YELLOW);
EMA21Norm.SetLineWeight(2);
# =========================
# VOLUME NORMALIZATION
# =========================
def vol = volume;
def volHigh = Highest(volume, normLength);
def normVol = vol / volHigh;
plot VolumeNorm = normVol;
VolumeNorm.SetDefaultColor(Color.GRAY);
VolumeNorm.SetLineWeight(1);
# =========================
# CONDITIONS
# =========================
def lowVol = normVol < Average(normVol, 20);
def pullback = normPrice < normEMA9;
def volAvg = Average(volume, 20);
def lowVolumePullback =
close < close[1] and
volume < Average(volume, 20) and
close > ExpAverage(close, 21); # <-- trend filter
def highVolumeSell =
close < close[1] and
volume > Average(volume, 20) and
close < low[1]; # <-- KEY ADDITION
def trueSellPressure =
highVolumeSell and
(high - low) > Average(TrueRange(high, close, low), 14);
def nearHigh =
close >= Highest(close, 20) * 0.98;
def momentumRising =
ExpAverage(close, 5) > ExpAverage(close, 5)[1];
def deeperPullback =
close < ExpAverage(close, 9) and
close < ExpAverage(close, 21);
# =========================
# SMART FLOW LABEL (FINAL)
# =========================
def avgVol = Average(volume, 20);
def absorption =
close < close[1] and
volume > avgVol and
close >= low[1];
AddLabel(yes,
# 🔵 HIGHEST PRIORITY: ABSORPTION
if absorption and nearHigh then "A+ ABSORPTION (BULLISH)"
else if absorption then "ABSORPTION (BUYERS ACTIVE)"
# 🟢 CONTINUATION
else if lowVolumePullback and deeperPullback then "WEAK PULLBACK (WATCH)"
else if lowVolumePullback then "B+ PULLBACK: DIGESTION"
# 🔴 TRUE SELLING
else if trueSellPressure then "STRONG SELLING (SHORT)"
else if highVolumeSell then "WEAK SELLING"
# ⚪ DEFAULT
else "NO EDGE",
# COLORS
if absorption then Color.CYAN
else if lowVolumePullback then Color.GREEN
else if highVolumeSell then Color.RED
else Color.GRAY
);
# =========================
# KEY LINE LABELS (COLOR MATCHED)
# =========================
AddLabel(yes,
"PRICE: " + Round(close, 2),
Color.MAGENTA
);
AddLabel(yes,
"EMA 9: " + Round(ExpAverage(close, 9), 2),
Color.CYAN
);
AddLabel(yes,
"EMA 21: " + Round(ExpAverage(close, 21), 2),
Color.GREEN
);
AddLabel(yes,
"VOL: " + Round(volume, 0),
Color.GRAY
);
Last edited by a moderator: