Thx @SRA, appreciate it. Question: if Sqz Index and Last Sqz Index are negative, does the same hold true as in your notes and is the %diff still valid or do we need to change it from negative to positive (or vice versa). Thanks!Mobius Squeeze and Custom Labels For ThinkOrSwim
A little gift for the group. This is my first indicator. I took Mobius' Squeeze and added a few things. There's about 30 line of code and 150 line of comments explaining what everything does. My background is data science as it pertains to advertising and a copywriter. I did some coding 2 centuries ago.
With the indicator, I can predict when a Squeeze will happen, as well as how likely a Squeeze is to happen. Bunch of other stuff, too. Provides about 6 items of direct metrics and another 6 of indirect metrics/indications. It is a pretty good tool for anticipating trends (if I say so myself)
Code:#--------------------- [ Care And Feeding Of Your New Indicator ] --------------------- # # In the 'SQUEEZE INDEX' display box, you'll find a bunch of predictive analytics. # The numbers, left to right... # # 1. 'Squeeze Index' number # 2. The previous SI number # 3. The Percentage Difference between the current and previous SI # 4. The current number of Squeeze Bars. If no Squeeze, then default is zero # 5. The number of bars since a Squeeze # 6. The lowest Percent Difference seen during the Squeeze. An indication of how # deep the Squeeze was. # Changed the sensitivity of the entrance and exit by just a couple of milliseconds. This was # done to help smooth the Squeeze. The change is so small, the human eye cannot see a difference, # but the smoothing prevents false entrances and premature exits. Once a Squeeze has been entered, # it is less likely to quickly jump back out. # Previously, the Squeeze indicator would light and then potentially immediately exit, only to jump back # in again, or maybe not... kinda like how my mother used to drive... start, stop, mash the gas and slam the brakes. # To her, a stop sign was merely a suggestion. That's LA driving :) How did I survive? Now, a Squeeze is # 'more committed' (smooth and steady) before it is announced and 'minor' false signals are ignored. # # Also made the indicator change color... blue for when the stock is moving away (above SI 20) from a Squeeze, # color.LIGHT_ORANGE when the Squeeze Index (SI) reaches <= 20. Blue was chosen while moving away # from a Squeeze because for Squeeze Traders, moving away from a Squeeze is 'sad' :) The LIGHT_ORANGE # alerts to a upcoming change as the SI reaches 20 and below. # # If a Squeeze reaches -20 or below (what I consider a Deep Squeeze) then the plot dot turns violet. Green for no # Squeeze, red for a Squeeze between zero (beginning) and -19, then violet for anything under -20. John Carter # uses a black dot to signify something (for what, I do not know) so I chose violet for Deep Squeeze. #-------------------------------------[ Disclaimer ] ------------------------------- # Because TOS is a scripting language (vs a complied language) AND because I am not a REAL programmer, # there are a few things to consider. TOS has a ton of cool features (recursive) but it doesn't like # to count numbers. Sometimes the counters (how many bars since a Squeeze) are a few bars off. # Sometimes they are correct. Depends on the timing of the displaying of the bars. Sounds very British :) # # There area few known bugs in TOS that cause the simplest stuff to be difficult, but then again, # TOS makes some really difficult stuff, easy. And, again... I am NOT a real programmer. # Add those two ingredients and bad stuff can happen, quickly. # # As far as I can tell, the cool recursive features makes doing some of the easy stuff, difficult. # If you know how to make the counters more accurate. then please... fix at will. # The math (maths for all my British friends) is correct (double-check, please). # The counters give a general idea, the math is more accurate. # Some of the code was written by me, and some written by others. I credited code when the # author was known. Everyone deserves a pat on the back :) Or, ala Moody Blues, Every Good Boy Deserves A Favour. # Gals, too :) # # #----------------------------------------------------------------------------------- # #-------------------------------- [ What It All Means ] ----------------------------- # This is my first indicator mod... a Thank You gift to the group :) Forgive my crappy programming... # fix if you wish. # # With this indicator, you can actually click the charts and predict when the next # Squeeze will happen. Cool. How? # The higher the SI (first number) the less likely (lower numbers means the event is near) # a Squeeze event will happen. The Percent Difference (3rd number) tells you if the # SI trend is up or down. An SI of 115 with a PD of -20% means the SI has been # recently driving downwards at a rate of 20% (roughly) per bar. A consistent drop of 20% will # mean the SI could reach zero in 5 bars, depending on Volume. Not likely, but you # get the idea. If the SI is at 100 and the PD shows -.025% (a slow downward drop) then we # know the Squeeze is a long way off. Time to look for another underlying. A positive number means the # underlying is moving away from a Squeeze. A Percent Difference (or SI) rise or fall of 20+ points indicates # a fast-moving stock, regardless of IV. # # More Examples: # # Nomenclature (In order, left to right): # ------------------------------- # SI = Squeeze Index (Group 1 or G1) # Past SI = PSI (G2) # Percent Difference = PD (G3) # Number Of Bars While In Squeeze = BIS (G4) # Number Of Bars Since Squeeze = BSS (G5) # Squeeze Depth (Lowest Percent Down While In Squeeze... variable 'historicalDifference') = SD (G6) # # # 1. SI (G1) = 500; G5 = 2 == huge swing UP coming out of Squeeze # IE: Only 2 bars out of Squeeze (G5) and already 500 Index Units UP # # 2. SI (G1) = 1000; G3= -5.00%; == huge swing DOWN towards Squeeze # IE: A negative G3 indicates negative movement (towards a Squeeze). However, since G1 is a positive # 1000 Units aways from a Squeeze(zero) then there is no immediate Squeeze. In fact, the trend # could reverse... and probably will. If G1 was <20, then a Squeeze is nearing. # 3. SI (G1) = 2000; G2 = 200; G5 = 100 == huge swing Up... moving away from Squeeze # IE: Since G! is a big number and it is >G2, there is no Squeeze approaching. Time for lunch :) # # 4. SI (G1) = -1; G4 = 1 == Just started Squeeze # IE: When in a Squeeze and G1 is increasing and/or G3 is increasing, then the Squeeze is reversing. Get ready :) # # 5. SI G(1) = 200; G2 = 100 == Moving fast towards (down) a Squeeze ( a 50% jump down) # # SI (G1) tells how far away (positive number) from a Squeeze # G2 indicates direction. If G1 > G2 then UP. If G1 < G2 then DOWN # G3 See G2 explanation # G4 The Percent Difference between G1 and G2. A positive number indicates UP and negative numbers indicates DOWN # G5 The number (always positive) of bars the Squeeze has occurred. Will be ZERO if not in a Squeeze # G6 The lowest Percent Difference while in a Squeeze # # For example... an SI of 120 and a previous SI of 110 with a Percent Difference of 1.5(%... # this indicate the underlying is moving very slowly away from a squeeze. An SI of 5 with a # previous of 4 and a PD of -1% means the underlying is moving to a possible Squeeze... # about 1-4 minutes to a Squeeze if the current conditions prevail...the bathroom can wait. # An SI of 1,000 (group 1) and a previous of 1,500 (group 2) and a PD of -50% (group 3) means the stock # is headed South towards a Squeeze, quickly. # # The relationship between the current and previous bar (Percent Difference) gives insight on direction, # as well as overall market trend, at the moment. I successfully calculate all my clients' digital advertising # based on 7 calculations. One of those predictive calculations is in this indicator. # # During testing, I have accurately predicted a Squeeze, with time to fetch coffee. I can # even predict the intensity of action after the Squeeze, while still in the Squeeze. The direction # of the Squeeze exit is shown visually via Bollinger Bands (not included). # # The number of bars during a Squeeze is the 4th group. In my testing, the more Squeeze bars # does not indicate a better Squeeze. What more bars does measure is a lack of interest in the underlying. # Low volume will drive a Squeeze to 10-20 bars in duration. Dreadfully painful. In my testing, a deeper Squeeze is # more beneficial than a longer Squeeze, as it indicates a potentially more explosive exit. # The SI will show you the depth of the Squeeze. I believe it's a valuable piece of previously missing information. # # Hope you find the SI informative and educational. I spent many years as a data scientist # and copywriter in the advertising industry. I use data to drive all decisions for my # FaceBook advertising clients, with impressive results. You can never have enough data, # but feel free to mod this ****er any way you wish. One size does not fit all. # Of course, don't use this thing, lose a bunch of money, and then blame me. Likewise, if make a ton of cash, # I won't ask for a commission :) All indicators are for informational purposes only. Just because it works # for my brain, doesn't mean it will work for you. I have a moderate brain injury from the military... # I know I see things differently, but in some ways it has become an asset. Using different tools and # seeing things differently than others is usually good. Some Data Scientists think my use of Percent Difference # vs Percent Change or even just regular Percent is strange, but I see something in Percent Difference that they don't... # a buffer. In my view, Percent Difference smooths calculations. A change from +10% to +20% would be seen as a 100% increase, # but that's not correct. It is actually only a 66.66% Percent Difference. That's the buffer. In my world, # Different or Unusual or Avantgarde > Normal. Do (and use) what works for your brain. # # # Thank You # David M. (Some Random Alien From Outer Space) # # PS: Generally speaking, scripting languages do not ignore comments. I don't know if TOS # is negatively affected by comments... I am sure if you delete all the long comments, the code # will run faster. Not sure... just a guess. #---------------------------------------------------------------------------------------- # Momentum Squeeze # Mobius # Added Squeeze Label with directional color # Label is green when momentum is ascending, red when descending #---------------------------------------------------------------------------------- #---------------------------------------------------------------------------------- # David changed the default Input to 21. After years of data scientist-ery, I have # become fond of odd numbers. They do all sorts of cool stuff. Odd numbers smooth # calculations and such. It seems the Universe can spilt the difference with even numbers # (the dreaded 50/50 split), but must make a choice when presented with odd numbers. I chose '21' # as a default because a lot of traders follow the 21 EMA or 21 SMA. A nod to those who travelled before me :) # Now.... on with the show # #---------------------------------------------------------------------------------- # --------------------------- [ Mobius code below ] ------------------------------- declare lower; # Remark this out to allow placement on upper chart... or 'declare upper' input length = 21; #hint length: Length for average calculation. input price = close; input SDmult = 2.0; input ATRmult = 1.5; def K = (Highest(high, length) + Lowest(low, length)) / 2 + ExpAverage(close, length); plot Momo = Inertia(price - K / 2, length); Momo.SetPaintingStrategy(PaintingStrategy.HISTOGRAM); Momo.SetLineWeight(3); Momo.AssignValueColor(if Momo > Momo[1] and Momo > 0 then Color.CYAN else if Momo > 0 and Momo < Momo[1] then Color.BLUE else if Momo < 0 and Momo < Momo[1] then Color.RED else Color.YELLOW); #--------------- [ Metrics From Mobius ] --------------- def SD = StDev(close, length); def Avg = Average(close, length); def ATR = Average(TrueRange(high, close, low), length); def SDup = Avg + (SDmult * SD); def ATRup = Avg + (ATRmult * ATR); plot Squeeze = if SDup < ATRUp then 0 else Double.NaN; #------------------------------------------------------------------------------------------ # David M.(Some Random Alien) 10-6-2021 # Don't blame Mobius... I made this mess :) # Code displays Squeeze Watch Prediction Index. # Depending on volume, a score of less then 25 could signal an impeding Squeeze. def squeezePrediction = ((SDup - ATRup) / (SDup + ATRup) / 2) * 100; def squeezeIndex = Round(squeezePrediction * 10000, 0); def squeezeIndexDifference = (squeezeIndex - squeezeIndex[1]) / (squeezeIndex + squeezeIndex[1]) / 2 * 100; def squeezeProgress = Round((squeezePrediction - squeezePrediction[1]) * 10000, 2); def squeezeIndexOn = squeezeIndex <= 0; rec counter = if squeezeIndexOn then counter[1] + 1 else 0; def deepSqueeze = squeezeIndex <= -20; rec accumCounter = if squeezeIndex >= 0 then accumCounter[1] + 1 else 0; rec historicalDifference = if squeezeIndexOn then Lowest(squeezeIndexDifference) else historicalDifference[1]; #---------------------------- [ Plots Some Dots ] ----------------------------- Squeeze.SetPaintingStrategy(PaintingStrategy.POINTS); Squeeze.SetLineWeight(3); Squeeze.AssignValueColor( if deepSqueeze then CreateColor(185, 30, 249)else color.RED); Squeeze.SetDefaultColor(Color.RED); plot zero = if IsNaN(close) or !IsNaN(Squeeze) then Double.NaN else 0; zero.SetPaintingStrategy(PaintingStrategy.POINTS); zero.SetLineWeight(3); zero.SetDefaultColor(Color.GREEN); #------------------------------------------------------------------------------ # Make the SI bar look pretty :) AddLabel(yes, " SQUEEZE INDEX: " + squeezeIndex + " [" + squeezeIndex[1] + "] " + "[" + AsText(squeezeIndexDifference, NumberFormat.TWO_DECIMAL_PLACES) + "%] " + "[" + (counter[1]) + "] | " + "[" + accumCounter + "] " + "[" + AsText(historicalDifference[1], NumberFormat.TWO_DECIMAL_PLACES) + "%] ", if squeezeIndex > squeezeIndex[1] and squeezeIndex > 50 and squeezeIndexDifference > 0 then CreateColor(16, 198, 226) else color.LIGHT_ORANGE); def fixBug = if squeezeIndex >= 0 then counter[1] == counter[1] == 0 else Double.NaN; #-------------------------------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------- # # I changed this Mobius code to show orange during initial squeeze # and then turns to red if >5 squeeze bars. John Carter believes that a squeeze of 5 is better # than a squeeze of 2 or 3. He is correct. However, during my initial testing, a squeeze of more # than 5 is not better. During my testing, a squeeze substantially greater than 20 is worse than a 5. # Your mileage may vary. Consult your owner's manual for more information. Hands and feet inside the ride # at all times :) And because I am a self-taught coder, I messed up Mobius' pretty formatting to reflect # my ignorance of the craft :) # #---------------------------------------------------------------------------------------------------- AddLabel(!IsNaN(Squeeze), " >>> Squeeze <<< ", if IsAscending(Momo) then Color.GREEN else if counter[1] >= 5 then Color.RED else CreateColor(16, 198, 226)); def cleanup = if IsNaN(Squeeze) then counter[1] == 0 else 0; # End Code - Momentum Squeeze
Thanks to the group for answering all my questions and providing inspiration.