Derivation of John Carter's Pro Squeeze for ThinkorSwim

T

thebewb

Member
VIP
All,

I have been meaning to do derive John Carter's Pro Squeeze for a while and got around to it finally today. 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. I confirmed this by looking at

I think John Carter charges way too much for his indicators that really aren't very good (I mean come on he is charging $250 bucks for changin candle colors based off where they are relative to high low 34 EMA... its a joke), so this is my way of trying to save uneducated or newbie traders that may be taken in by his FOMO inducing marketing. Please feel free to share and update as you see fit.

dark_orange is the pre-squeeze, yellow signals the original, and red is one step above actual i.e., extreme compression. See below for some pictures:

I would post pictures but too lazy. Enjoy.

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:
technicallydreaming

technicallydreaming

Member
To be fair I believe the Grab candles you are referring to are available for free here and the simpler trader site somewhere ( albeit buried ).

I always thought the TTM squeeze was not that great at least for the way I trade on tick charts or lower time frames. I couldn't believe that there was a paid version. I even ran the squeeze included with tos side by side other reliable systems for longer term trading and it signals were often late or false. Thanks for your work on this. Will save some people a hard lesson.
 
Last edited:
rad14733

rad14733

Well-known member
VIP
@technicallydreaming I've never been able to get a feel for the squeezes either... Might just be me but they don't work for me as well as they are touted to and I've tried most of the squeezes out there... But, hey, they must work for some people or they wouldn't still be garnering attention...

@thebewb Regardless of my personal view of squeezes, great work...!!! (y)
 
G

GODSPEED

New member
VIP
You should try to recreate his new indicator " ready aim fire " this is what he's been using for the last few big plays that netted him 13 mill this year, looks interesting he doesn't even use the pro squeeze anymore...
 
technicallydreaming

technicallydreaming

Member
You should try to recreate his new indicator " ready aim fire " this is what he's been using for the last few big plays that netted him 13 mill this year, looks interesting he doesn't even use the pro squeeze anymore...

Hmmm I remember on a webinar the creator of ready aim fire specifically said that it is not to be used on it own but rather as confirmation indicator. So I am thinking there's definitely more to those million dollar trades then just that indicator.
 
wtf_dude

wtf_dude

Active member
Really like the use of the "pre-squeeze". Definitely switching over as my default. Good work, man! Appreciate it.
 
Shooters_Gotta_Shoot

Shooters_Gotta_Shoot

New member
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.
 
F

FOTM_8888

Member
VIP
please can you shared the study please. i copy but is not appear. thank you
 
BenTen

BenTen

Administrative
Staff
VIP
@FOTM_8888 I think @thebewb forgot to add declare lower; to his code. I just fixed it. Try again.
 
S

Sneaky_Swings

New member
VIP
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.
 
Shooters_Gotta_Shoot

Shooters_Gotta_Shoot

New member
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);
 
W

whats up

New member
VIP
@Shooters_Gotta_Shoot Nice work. What is the good time frame to use this indicator?
 
Shooters_Gotta_Shoot

Shooters_Gotta_Shoot

New member
@Shooters_Gotta_Shoot Nice work. What is the good time frame to use this indicator?
@whats up I was trying to use it on the 1000 tick chart but the indicator just wasn't quick enough to keep up. I'd at least bump it up to 5 minutes. I've seen the best results with the higher time frames for this indicator. Figured it was worth sharing, even though it doesn't match my trading style. Thought others would enjoy the concept.
 
W

whats up

New member
VIP
@whats up I was trying to use it on the 1000 tick chart but the indicator just wasn't quick enough to keep up. I'd at least bump it up to 5 minutes. I've seen the best results with the higher time frames for this indicator. Figured it was worth sharing, even though it doesn't match my trading style. Thought others would enjoy the concept.
thank you i did tested on a one minutes and 5min chart
i find it good on a one min chart using stochastic
 

Similar threads

Top