John Carter's Squeeze Pro Indicator for ThinkorSwim (FREE)

thebewb

Member
GO HERE FIRST: Everything You Wanted To Know About The Free ThinkOrSwim John Carter's Squeeze Pro Indicator And Were Afraid To Ask: https://usethinkscript.com/threads/john-carters-squeeze-pro-question.8705/

John Carter's Squeeze Pro Indicator for ThinkorSwim (FREE)

I derived John Carter's Pro Squeeze indicator. All it looks like he does is add in more conditional rules on whether BBs are inside a larger and smaller range. The code is actually pretty simple just added a few Keltner ranges and added in Mobius's derivation of the original TTM Squeeze's momentum function.

Dark_orange is the pre-squeeze, yellow signals the original, and red is one step above actual i.e., extreme compression.

fGRwu9s.png


Thanks,

TheBewb

Code:
declare lower;

##Assembled by TheBewb using existing Mobius Squeeze Momentum coding and "squeeze" concept made popular by John Carter.

input price = close;
input length = 20;
input Num_Dev_Dn = -2.0;
input Num_Dev_up = 2.0;
input averageType = AverageType.SIMPLE;
input displace = 0;
def sDev = StDev(data = price[-displace], length = length);
def MidLineBB = MovingAverage(averageType, data = price[-displace], length = length);
def LowerBandBB = MidLineBB + Num_Dev_Dn * sDev;
def UpperBandBB = MidLineBB + Num_Dev_up * sDev;
input factorhigh = 1.0;
input factormid = 1.5;
input factorlow = 2.0;
input trueRangeAverageType = AverageType.SIMPLE;
def shifthigh = factorhigh * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftMid = factormid * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftlow = factorlow * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def average = MovingAverage(averageType, price, length);

def Avg = average[-displace];

def UpperBandKCLow = average[-displace] + shiftlow[-displace];
def LowerBandKCLow = average[-displace] - shiftlow[-displace];

def UpperBandKCMid = average[-displace] + shiftMid[-displace];
def LowerBandKCMid = average[-displace] - shiftMid[-displace];

def UpperBandKCHigh = average[-displace] + shifthigh[-displace];
def LowerBandKCHigh = average[-displace] - shifthigh[-displace];

def K = (Highest(high, length) + Lowest(low, length)) /
2 + ExpAverage(close, length);
def momo = Inertia(price - K / 2, length);

def pos         = momo>= 0;
def neg         = momo< 0;
def up         = momo >= momo[1];
def dn         = momo < momo[1];

def presqueeze      = LowerBandBB > LowerBandKCLow and UpperBandBB < UpperBandKCLow;
def originalSqueeze     = LowerBandBB > LowerBandKCMid and UpperBandBB < UpperBandKCMid;
def ExtrSqueeze     = LowerBandBB > LowerBandKCHigh and UpperBandBB < UpperBandKCHigh;

def PosUp = pos and up;
def PosDn = pos and dn;
def NegDn = neg and dn;
def NegUp = neg and up;

plot squeezeline = 0;
squeezeline.SetPaintingStrategy(PaintingStrategy.POINTS);
squeezeline.AssignValueColor(if ExtrSqueeze then Color.RED else if originalSqueeze  then Color.YELLOW else if presqueeze then Color.DARK_ORANGE else Color.GRAY);

plot momentum = momo;
momentum.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
momentum.AssignValueColor( if PosUp then Color.green else if PosDn then Color.dark_green else if NegDn then Color.dark_orange else if NegUp then Color.yellow else Color.YELLOW);
 
Last edited by a moderator:

New Indicator: Buy the Dip

Check out our Buy the Dip indicator and see how it can help you find profitable swing trading ideas. Scanner, watchlist columns, and add-ons are included.

Download the indicator

venus360

New member
I use Squeeze pro as a confirmation along with price action and other tools (Divergence). RSI Divergence worked well for me in the last few weeks.
 
Last edited by a moderator:

BC1106

New member
2019 Donor
VIP
Almost all of John Carter's/Simpler Trading indicators are just slightly different versions of indicators someone else created (and for free on Thinkorswim) or they visually combine a few separate indicators into one. Ex-the RAF indicator is the same thing as Fisher Transformer just visually displayed a little different. Also the Squeeze pro just combines 3 settings you can change yourself on the TTM Squeeze.

In the TTM squeeze available for free on Thinkorswim, changing the "nbb" input setting from 2.0 to 1.5 will give the more frequent squeezes he talks about in his webinars and changing it "nbb" from 2.0 to 2.5 will result in much less squeezes. The Squeeze Pro just visually puts all 3 into one indicator by having different colors of the "Squeeze" dots.
 

cherif

Member
Based on my continuous observation of the combination of BB/KC in relation with Price Action, there is lag that can be costly. What i did is i modified the parameters to help give a better signal on lower time frames
BB(2.0,8,exponential)
KC(1.0,8, exponential)
If BB is inside KC THEN THAT IS A SQZ I WOULD WATCH AND I WILL FOLLOW THE PRICE DIRECTION.
To confirm the accuracy of such set up, the squeeze on chart that is posted on this forum by mobius can go hand in hand with the setting above.
any questions, feel free to ask
 
Last edited by a moderator:

BC1106

New member
2019 Donor
VIP
do you know what his "buy or sell arrow" in the Squeeze Pro is based off of?
 
Last edited by a moderator:

Trader Raider

Well-known member
VIP
@BC1106, there can be several types of signals generated, depending on whether the histogram is above/below zero or rising/falling. JC likes to see 5 dots in a squeeze, so the arrows are supposed to mark the 5th dot of the squeeze. If you can count 5 dots in a row then you don't need the signal arrows.
 
Last edited:

ribeezy

New member
ZScore is a good supporting study for deciding which way sqz is going to fire https://tos.mx/4WjebUG

Ill look into that Ramesh, Also........ The Schaff Trend indicator, Free on TOS, pairs very well with Squeeze, and even better with Squeeze pro, as a better alternative to the RAF..

I also find the Early-in-out indicator in that pro package worth trying to get on sale at the very least.

In an Anchor chart I recommend using the .382 and .618 levels on the Schaff Trend Indicator for entries on Squeezes, and then, like JC, using the Early-in-out indicator for entry confirmation, and exits.

I then use Projection Oscillator, with Slim Ribbon, above or below ichimoku clouds on a micro chart to help spot bull or bear flags, with Ease of Movement indicator for confirmation. This micro chart is apx 9x smaller time frame than the Anchor chart. For example, 3day anchor, 130 minute micro

I was actually able to use this setup to catch TSLA on a monthly anchor, 3 day micro chart before it broke above the high 300s around Thanksgiving. Too bad I took profits at New Years... At least I got a piece of the Cybertruck rally.

Maybe we can keep adding to this thread to find even more ways to improved the use of squeeze setups. The TMO from here helps confirm entries on anchor charts, so thanks to BenTen and all you contributors for that and other gifts. Hope this helps you all in this wild mkt.
 

123 man

New member
Found this somewhere. TTM Squeeze painting bars. . Move it to lower imo.

Code:
input price = CLOSE;
input length = 20;
input nK = 1.5;
input nBB = 2.0;
input alertLine = 1.0;
def squeezeHistogram = TTM_Squeeze(price, length, nK, nBB, alertLine).Histogram;
plot hist = if squeezeHistogram>= 0 then
if squeezeHistogram> squeezeHistogram[1] then 2 else 1
else if squeezeHistogram < squeezeHistogram[1] then -2 else -1; assignPriceColor(if squeezeHistogram >= 0 then
if squeezeHistogram > squeezeHistogram[1] then color.CYAN else color.BLUE
else if squeezeHistogram < squeezeHistogram[1] then color.RED else color.YELLOW); hist.assignvaluecolor(if squeezeHistogram >= 0 then
if squeezeHistogram > squeezeHistogram[1] then color.CYAN else color.BLUE
else if squeezeHistogram < squeezeHistogram[1] then color.RED else color.YELLOW);
 

VicD

Member
@Ramesh16 Z-Score mountains with clouds. I did overlay the MA that you had. have not added it in, will see if it makes sense.


Code:
# Intraday VWAP Zscore


declare lower;

input price = close;
input length = 20;



#calc_zvwap(pds) =>
#    mean = sum(volume*close,pds)/sum(volume,pds)
def mean = Sum(Volume*Close, length)/Sum(Volume, length);
#    vwapsd = sqrt(sma(pow(close-mean, 2), pds) )
def vwapsd = Sqrt(Average(Power(Close-mean, 2), length));
#    (close-mean)/vwapsd
def zScore = (Close-mean)/vwapsd;
####

plot "0" = if IsNaN(close) then Double.NaN else 0;
"0".SetDefaultColor(Color.GRAY);
plot "1SD" = if IsNaN(close) then Double.NaN else 1;
"1SD".SetDefaultColor(Color.WHITE);
def "2SD" = if IsNaN(close) then Double.NaN else 2;

def "2.5SD" = if IsNaN(close) then Double.NaN else 2.5;

AddCloud("2SD", "2.5SD", Color.RED, Color.GREEN);



plot "-1SD" = if IsNaN(close) then Double.NaN else -1;
"-1SD".SetDefaultColor(Color.WHITE);
def "-2SD" = if IsNaN(close) then Double.NaN else -2;
def "-2.5SD" = if IsNaN(close) then Double.NaN else -2.5;

AddCloud("-2SD", "-2.5SD", Color.RED, Color.GREEN);
Plot zscorevwap = zscore;
AddCloud(0,  Zscore,  Color.RED,  Color.GREEN);
# End Code
 

VicD

Member
@greentonic The painted bars with the blue bubbles for momentum

Code:
DefineGlobalColor(“Long”, Color.GREEN);
DefineGlobalColor(“Short”, Color.RED);
DefineGlobalColor(“Neutral”, Color.YELLOW);

input DMIlength = 14;
input ADXThreshold = 20;
def ADX = DMI(length = DMIlength).”ADX”;
def DIm = DMI(length = DMIlength).”DI-“;
def DIp = DMI(length = DMIlength).”DI+”;
def long = DIp > DIm and ADX > ADXThreshold;
def short = DIm > DIp and ADX > ADXThreshold;
AssignPriceColor(if long then GlobalColor(“Long”) else if short then GlobalColor(“Short”) else GlobalColor(“Neutral”));

input volumeAveragingLength = 20;
input volumePercentThreshold = 50;
input showVolumeStrengthOnYellow = No;
def aVol = Average(volume, volumeAveragingLength);
def pVol = 100 * ((volume – aVol[1]) /aVol[1]);
def pDot = pVol >= volumePercentThreshold;
plot volumeStrength = if pDot and (long or short or showVolumeStrengthOnYellow) then hl2 else Double.NaN;
volumeStrength.SetPaintingStrategy(PaintingStrategy.POINTS);
volumeStrength.SetLineWeight(5);
volumeStrength.SetDefaultColor(color.cyan);
volumeStrength.hideBubble();

input enableAlerts = NO;
alert(enableAlerts and long and !long[1], “10x Green Alert”, alert.bar, sound.ring);
alert(enableAlerts and short and !short[1], “10x Red Alert”, alert.bar, sound.ring);
alert(enableAlerts and pDot and (long or short or showVolumeStrengthOnYellow), “10x Volume Strength Alert”, alert.bar, sound.ring);

plot scan = if long then 1 else if short then -1 else 0;
scan.hide();
 

pkcfc

New member
Hello Everybody, I'm a fairly new options trader, I've been doing a lot of digging on this site here to find some indicators that complements well with Squeeze Pro, but I was hoping to gain some insight from the Pros here as to what indicators they use along side the squeeze to help them confirm their trades. I feel that is is easy to get overwhelmed with all these great indicators but I'm just trying to narrow it down to a few good ones. Much Appreciated!
 
Last edited by a moderator:

ribeezy

New member
Hello Everybody, I'm a fairly new options trader, and I recently purchased the Squeeze Pro and I've been doing a lot of digging on this site here to find some indicators that complements well with it, but I was hoping to gain some insight from the Pros here as to what indicators they use along side the squeeze to help them confirm their trades. I feel that is is easy to get overwhelmed with all these great indicators but I'm just trying to narrow it down to a few good ones. Much Appreciated!

While in squeeze, SchaffTrend break above .382 and Ichimoku Kumo Cloud and Kijun under price will make you bank and get you in early.
 
Last edited by a moderator:
The "pre-squeeze" is an absolute game changer. You can never have too much great information, and I felt that the original TTM Squeeze was lacking this final piece to the puzzle. Great work and looking forward to making some money with this beauty.
How are you utilizing the pre-squeeze feature?

I understand the concept behind it, but have yet to understand how to successfully implement it into my trading.
 
How are you utilizing the pre-squeeze feature?

I understand the concept behind it, but have yet to understand how to successfully implement it into my trading.
@Sneaky_Swings I re-coded the pre-squeeze to tell me if it is squeezing in or out. Made it a little easier to see if we are about to get a breakout or not. I made it more like a red, yellow, green light situation. Then you know if you have the green light to trade, red light not to trade at all, and yellow you might want to add extra criteria for your buying criteria to be met before pulling the trigger.

Zeroline Color Definitions:
Dark Red = Extra Squeeze (In & Out)
Red = Original Squeeze (In & Out)
Pink = Pre-Squeeze (In)
Yellow = Pre-Squeeze (Out)
Green = BB's are officially outside of Keltner Channels

Code:
##Assembled by TheBewb using existing Mobius Squeeze Momentum coding and "squeeze" concept made popular by John Carter.

declare lower;

input price = close;
input length = 20;
input Num_Dev_Dn = -2.0;
input Num_Dev_up = 2.0;
input averageType = AverageType.SIMPLE;
input displace = 0;
def sDev = StDev(data = price[-displace], length = length);
def MidLineBB = MovingAverage(averageType, data = price[-displace], length = length);
def LowerBandBB = MidLineBB + Num_Dev_Dn * sDev;
def UpperBandBB = MidLineBB + Num_Dev_up * sDev;
input factorhigh = 1.0;
input factormid = 1.5;
input factorlow = 2.0;
input trueRangeAverageType = AverageType.SIMPLE;
def shifthigh = factorhigh * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftMid = factormid * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def shiftlow = factorlow * MovingAverage(trueRangeAverageType, TrueRange(high, close, low), length);
def average = MovingAverage(averageType, price, length);

def Avg = average[-displace];


def UpperBandKCLow = average[-displace] + shiftlow[-displace];
def LowerBandKCLow = average[-displace] - shiftlow[-displace];

def UpperBandKCMid = average[-displace] + shiftMid[-displace];
def LowerBandKCMid = average[-displace] - shiftMid[-displace];

def UpperBandKCHigh = average[-displace] + shifthigh[-displace];
def LowerBandKCHigh = average[-displace] - shifthigh[-displace];

def K = (Highest(high, length) + Lowest(low, length)) /
2 + ExpAverage(close, length);
def momo = Inertia(price - K / 2, length);

def pos         = momo >= 0;
def neg         = momo < 0;
def up         = momo >= momo[1];
def dn         = momo < momo[1];


def presqueeze      = LowerBandBB > LowerBandKCLow and UpperBandBB < UpperBandKCLow;
def presqueezein    = LowerBandBB > LowerBandKCLow and UpperBandBB < UpperBandKCLow and lowerBandBB > lowerBandBB[1];
def presqueezeout   = LowerBandBB > LowerBandKCLow and UpperBandBB < UpperBandKCLow and lowerbandbb < lowerbandbb[1];

def originalSqueeze     = LowerBandBB > LowerBandKCMid and UpperBandBB < UpperBandKCMid;
def originalSqueezein   = LowerBandBB > LowerBandKCMid and UpperBandBB < UpperBandKCMid and lowerbandBB > lowerbandbb[1];
def originalSqueezeout  = LowerBandBB > LowerBandKCMid and UpperBandBB < UpperBandKCMid and lowerbandbb < lowerbandbb[1];


def ExtrSqueeze     = LowerBandBB > LowerBandKCHigh and UpperBandBB < UpperBandKCHigh;
def ExtrSqueezein   = LowerBandBB > LowerBandKCHigh and UpperBandBB < UpperBandKCHigh and lowerbandbb > lowerbandbb[1];
def ExtrSqueezeout  = LowerBandBB > LowerBandKCHigh and UpperBandBB < UpperBandKCHigh and lowerbandbb < lowerbandbb[1];



def PosUp = pos and up;
def PosDn = pos and dn;
def NegDn = neg and dn;
def NegUp = neg and up;



plot squeezeline = 0;
squeezeline.SetPaintingStrategy(PaintingStrategy.LINE_VS_SQUARES);
squeezeline.setLineWeight(5);
squeezeline.AssignValueColor(if ExtrSqueezein then Color.dark_red else if extrsqueezeout then color.dark_red else if originalSqueezein then Color.red else if originalSqueezeout then color.red else if presqueezein then Color.pink else if presqueezeout then color.yellow else Color.green);

plot momentum = momo;
momentum.SetPaintingStrategy(PaintingStrategy.HISTOGRAM);
momentum.AssignValueColor( if PosUp then Color.cyan else if PosDn then Color.blue else if NegDn then Color.red else if NegUp then Color.yellow else Color.gray);
 

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Top