This is the third weapon in the AI-Trader pairing system — and it’s built different. Instead of chasing laggy signals, this tool shows you where real force is behind a move by treating volume as mass and price change as velocity. The output is raw momentum energy — smoothed, normalized, and ranked — so you can make decisions based on conviction, not just direction.
You can find the other 2 here:
1) https://usethinkscript.com/threads/eliteperformers-for-thinkorswim.20982/
2) https://usethinkscript.com/threads/next-gen-volume-momentum-oscillator-for-thinkorswim.20983
Core Mindset:
Read it like this:
Quick Rules
Color Code Reminder:
Labels:
Strategy Tips:
You can find the other 2 here:
1) https://usethinkscript.com/threads/eliteperformers-for-thinkorswim.20982/
2) https://usethinkscript.com/threads/next-gen-volume-momentum-oscillator-for-thinkorswim.20983

This tool isn’t here to tell you which way to trade — it tells you when energy is concentrated, when it's fading, and when the market is likely at a pivot.
Read it like this:

Zone | Action Bias | Meaning |
---|---|---|
Above 75 and falling | ⚠ Take profits / fade extremes | Exhaustion — smart money likely exiting |
Above 75 and rising | ![]() | Breakout — high conviction buyers/sellers are active |
Below 25 and rising | ![]() | Quiet strength — early energy buildup |
Below 25 and falling | ![]() | No interest — weak conviction, fakeouts likely |

- Green shades = energy rising while price rises (bullish power)
- Red shades = energy rising while price falls (bearish pressure)
- Purple = energy is high but falling — blowoff risk
- Gray = no one cares — skip it

- “Pivot Zone” shows when energy is in the top or bottom 25% — these are decision zones.
- Other labels (Breakout Building, Exhaustion Risk, etc.) guide your narrative — match them with your price structure.

- Pair this with your structure or pattern setup — energy shows when a setup has force, not just shape.
- Fade purple when extended, especially if it lines up with prior resistance/support or volume cliffs.
- Look for trend continuation in green/red zones when price pulls back and energy holds strong.
- Ignore signals in the gray unless something else is screaming at you.

Code:
declare lower;
# === Inputs ===
input length = 14;
input emaLength = 5;
input normalizeLength = 50;
input thresholdGood = 20;
input thresholdStrong = 60;
input thresholdExtreme = 85;
# === Core Energy Calculation ===
def pctChange = 100 * (close - close[1]) / close[1];
def pctChangeSquared = Sqr(pctChange);
def avgVolume = Average(volume, length);
def relativeVolume = if avgVolume != 0 then volume / avgVolume else 1;
def rawEnergy = relativeVolume * pctChangeSquared;
def energyEMA = ExpAverage(rawEnergy, emaLength);
# === Percentile Rank Normalization ===
def rankCount = fold i = 1 to normalizeLength + 1
with counter = 0
do counter + (if energyEMA > energyEMA[i] then 1 else 0);
def normalizedEnergy = 100 * rankCount / normalizeLength;
# === Context Flags ===
def energyPrev = normalizedEnergy[1];
def isRising = normalizedEnergy > energyPrev;
def isFalling = normalizedEnergy < energyPrev;
def priceUp = close > close[1];
def exhaustionRisk = normalizedEnergy >= thresholdExtreme and isFalling;
def explosiveMove = pctChangeSquared > 9 and relativeVolume < 1.2;
def convictionMove = pctChangeSquared > 4 and relativeVolume > 1.5;
def stealthAccum = pctChangeSquared < 2 and relativeVolume > 2;
def fakeoutMove = pctChangeSquared > 4 and relativeVolume < 1.2;
def crossedStrong = normalizedEnergy crosses above thresholdStrong;
def fastDecay = energyPrev - normalizedEnergy > 10;
def slowBurn = normalizedEnergy > thresholdGood and !fastDecay and isFalling;
# === Plot Normalized Energy ===
plot energy = normalizedEnergy;
energy.AssignValueColor(
if exhaustionRisk then CreateColor(128, 0, 128)
else if priceUp and normalizedEnergy >= thresholdExtreme then Color.DARK_GREEN
else if priceUp and normalizedEnergy >= thresholdStrong then Color.GREEN
else if priceUp and normalizedEnergy >= thresholdGood then Color.LIGHT_GREEN
else if !priceUp and normalizedEnergy >= thresholdExtreme then Color.DARK_RED
else if !priceUp and normalizedEnergy >= thresholdStrong then Color.RED
else if !priceUp and normalizedEnergy >= thresholdGood then Color.PINK
else Color.GRAY
);
energy.SetLineWeight(2);
# === Pivot Threshold Lines ===
plot pivotHigh = 75;
pivotHigh.SetDefaultColor(Color.LIGHT_GRAY);
pivotHigh.SetStyle(Curve.SHORT_DASH);
pivotHigh.SetLineWeight(1);
plot pivotLow = 25;
pivotLow.SetDefaultColor(Color.LIGHT_GRAY);
pivotLow.SetStyle(Curve.SHORT_DASH);
pivotLow.SetLineWeight(1);
# === Pivot Zone Label ===
def inPivotZone = normalizedEnergy > 75 or normalizedEnergy < 25;
AddLabel(inPivotZone,
"⚠ Pivot Zone",
if normalizedEnergy > 75 then Color.RED else Color.GREEN);
# === Main Interpretation Label ===
AddLabel(yes,
if exhaustionRisk then "Exhaustion Risk (Potential Blowoff)"
else if normalizedEnergy >= thresholdStrong and isRising then "Confirmed Breakout Momentum"
else if normalizedEnergy >= thresholdGood and isRising then "Breakout Potential Building"
else if relativeVolume > 1.5 and pctChangeSquared < 2 then "Accumulation/Distribution Zone"
else "Quiet / Low Interest",
if exhaustionRisk then CreateColor(128, 0, 128)
else if normalizedEnergy >= thresholdStrong and isRising then Color.RED
else if normalizedEnergy >= thresholdGood and isRising then Color.ORANGE
else if relativeVolume > 1.5 and pctChangeSquared < 2 then Color.YELLOW
else Color.DARK_GRAY
);
# === Supporting Context Labels ===
AddLabel(yes, if isRising then "Building Energy" else "Draining Energy",
if isRising then Color.GREEN else Color.RED);
AddLabel(yes,
if convictionMove then "Conviction Move"
else if explosiveMove then "Explosive Move (Low Vol)"
else if stealthAccum then "Stealth Accumulation"
else if fakeoutMove then "Fakeout Risk"
else "",
if convictionMove then Color.CYAN
else if explosiveMove then Color.YELLOW
else if stealthAccum then Color.MAGENTA
else if fakeoutMove then Color.LIGHT_RED
else Color.GRAY);
AddLabel(crossedStrong, "New Energy Spike", Color.ORANGE);
AddLabel(slowBurn, "Slow Burn Energy (Possible Continuation)", Color.LIGHT_GREEN);
AddLabel(fastDecay, "Energy Cooling Fast", Color.BLUE);