Skip to main content

TTM Squeeze Dashboard for ThinkOrSwim (Free Download)

DashboardFreeIntermediate26 min video34 lines of codeJan 30, 2020Updated Oct 21, 2026

A free Squeeze dashboard for ThinkOrSwim MarketWatch: custom columns flag stacked EMAs, count red squeeze dots and mark fired squeezes on 3 timeframes.

TTM Squeeze Dashboard on a ThinkOrSwim chart
  • Green Stacked MAs: 8, 13, 21 and 34 EMAs stacked bullish
  • Red Stacked MAs: stacked bearish
  • Sqz Count: red squeeze dots in the last 10 bars
  • Sqz FIRED: the squeeze fired on this bar

A blank cell means no stack, or no squeeze.

A futures watchlist from the start of the video. Watch this moment

On this page

What you'll build

TTM Squeeze Dashboard in ThinkOrSwim: The dashboard beside a Coca-Cola chart
The dashboard beside a Coca-Cola chart, at 24:25 in the video.
On real data
MarketWatch · Squeeze dashboardOct 19, 2026 close
SymbolMoving AveragesWeekly SqueezeDaily Squeeze
SPYSqz Count: 1
QQQSqz Count: 8
IWMStacked MAsSqz Count: 2
DIASqz Count: 2Sqz Count: 6
XLKSqz Count: 7
XLF
XLEStacked MAs
XLVStacked MAsSqz Count: 6
XLYSqz Count: 8
XLPStacked MAsSqz Count: 10
XLIStacked MAsSqz Count: 10
XLUSqz Count: 4
XLBSqz Count: 10
XLRESqz Count: 5
XLCStacked MAsSqz Count: 6Sqz Count: 5
The dashboard's columns for the index ETFs and sector SPDRs at the Oct 19, 2026 close, computed from daily bars. In the video the columns run on daily, 1-hour and 30-minute bars; the intraday columns need intraday data, so this one uses weekly and daily.
Type
Dashboard
Runs as
Watchlist columns
Code
34 lines
Video
26 minutes
Level
Intermediate

In this tutorial I build a Squeeze dashboard in the ThinkOrSwim MarketWatch tab, using custom quote columns in place of charts. Each row is a symbol. One column shows whether the 8, 13, 21 and 34-period EMAs are stacked, and three more columns count red squeeze dots on the daily, 1-hour and 30-minute timeframes and flag the bar where a squeeze fires.

The dashboard is for anyone who wants to check a list of symbols for squeezes without flipping through charts. In the video I run it as a funnel, from index ETFs to sector ETFs to one sector's top holdings, then switch the timeframes to 15, 5 and 3 minutes for day trading. Both column scripts are free to download.

Key takeaways

  • The Squeeze dashboard is 4 custom quote columns in the ThinkOrSwim MarketWatch tab: one for stacked moving averages and one each for the Squeeze on daily, 1-hour and 30-minute bars.
  • The Moving Averages column turns green when the 8, 13, 21 and 34-period EMAs are stacked in bullish order, with the 8 on top, and red when they are stacked in bearish order.
  • Each squeeze column counts red squeeze dots over the last 10 bars. That 10-period lens covers 10 days on the daily column, 10 hours on the 1-hour column and 5 hours on the 30-minute column.
  • A squeeze cell turns green and reads "Sqz FIRED" on the bar where the squeeze fires: the previous bar had a red dot and the current bar doesn't. With no squeeze, the cell stays black.
  • In the video, the funnel went from 6 sector ETFs to a 10-bar 1-hour squeeze in XLP, then to XLP's top 10 holdings, where Walmart showed its first daily squeeze dot.

What it shows

What the Squeeze Dashboard Shows

The Squeeze dashboard is a MarketWatch quotes table where each row is a symbol and each column is a short thinkScript. Before writing any code, I sketched the layout in PowerPoint as a table with 5 columns, so I knew what each column had to answer.

PowerPoint mock-up of the Squeeze dashboard with Symbol, Moving Averages, Daily Squeeze, 1hr Squeeze and 30m Squeeze columns
The design mock-up: a green Moving Averages cell, red squeeze counts on the daily and 1-hour columns, and a green fired cell on the 30-minute column, with the 10-period lens notes below.
ColumnWhat it showsCell colors
SymbolEach ticker in the watchlist you loadNone
Moving AveragesWhether the 8, 13, 21 and 34 EMAs are stackedGreen = bullish stack, red = bearish stack, black = neither
Daily SqueezeRed dots in the last 10 daily bars, or "Sqz FIRED"Red = squeeze on, green = fired, black = neither
1hr SqueezeThe same count over the last 10 hourly barsRed, green or black
30m SqueezeThe same count over the last 10 thirty-minute barsRed, green or black

The design also sets a 10-period lens: every squeeze column looks back exactly 10 bars of its own timeframe. On the daily column that's 10 days, on the 1-hour column it's 10 hours, and on the 30-minute column it's 5 hours. A fixed lookback keeps the code short, because one Sum function does the counting.

I picked daily, 1-hour and 30-minute bars for swing trading. If you day trade, use smaller timeframes. You can also add other indicators as columns.

How the Dashboard Reads Squeeze Dots

The Squeeze dashboard reads the dots through SqueezeAlert, a plot of the Squeeze study built into ThinkOrSwim. SqueezeAlert equals 0 on a bar with a red dot, which means a squeeze is on. The squeeze fires on the bar where SqueezeAlert goes from 0 on the previous bar to 1, and that single bar is the one the dashboard paints green.

The dashboard shows only the dots, not the histogram, so open the chart for direction. On Walmart in the video, the histogram bar was still below zero, which marks a negative squeeze. For more tools and tutorials on reading the indicator, start at our Squeeze hub.

Build Your Watchlists as a Funnel

The dashboard reads whatever watchlist you load, and I build those lists like a funnel, from broad to narrow. The wide end holds index ETFs like SPY. The middle holds sector ETFs like XLF. The narrow end holds single stocks such as Goldman Sachs and JPMorgan, which tells you where the opportunity is right now.

Funnel diagram with SPY and XLF at the wide top, JPM in the middle and GS at the narrow bottom
The watchlist funnel: start with SPY and a sector ETF like XLF, then narrow to holdings like JPM and GS.

I made three watchlists in the video. Each list is one level of the funnel:

  • Index ETFs: SPY, QQQ, IWM and DIA, plus gold and bonds.
  • Top ETFs: XLF, XLY, XLV, XLP, XLE and XLU.
  • XLP Holdings: PG, KO, PEP, WMT, COST, MDLZ, MO, PM, CL and KMB, the top holdings of XLP when I recorded the video.

To create a list, open the Watchlist gadget in the left sidebar. If it isn't there, add it with the + icon. For a long list, paste comma-separated symbols into the watchlist import box, and ThinkOrSwim recognizes every ticker. Add as many or as few symbols as you like to each level.

The dashboard on real data

Drawn from real intraday bars with the code on this page, through the Oct 20, 2026 close. Each cell runs the post's column code: the Moving Averages column checks the daily 8, 13, 21 and 34 EMAs, and each squeeze column counts red squeeze dots over the last 10 bars, or reads "Sqz FIRED" on the bar where a squeeze ends. The 1-hour column uses hourly bars built from 30-minute bars starting at 9:30.

The funnel's first step: 14 ETFs on Oct 20, 2026

TTM Squeeze dashboard columns for SPY, QQQ, IWM, DIA and 10 sector ETFs at the Oct 20, 2026 close
14 ETFs at the Oct 20, 2026 close. Red cells count squeeze dots in the last 10 bars; green reads Sqz FIRED.

At the Oct 20, 2026 close, 1 of the 14 ETFs had a daily squeeze on (XLI), and DIA, XLK and XLE showed a squeeze firing on at least one column.

The same columns on 30 stocks

TTM Squeeze dashboard on well-known stocks at the Oct 20, 2026 close, sorted by the daily squeeze count
The stocks from our list of 30 with a squeeze on or firing on any column, sorted by the daily count.

Sorted by the daily column, AAPL came first: 10 of its last 10 daily bars had a squeeze dot, so the daily squeeze had been on for at least 10 trading days. Its hourly cell read "Sqz FIRED" and its 30-minute cell read nothing (no squeeze). The count tells you how long a squeeze has been building; the green cell tells you one just let go.

By the numbers

16 of 30Stocks with a squeeze on or firing on any column
15Of 44 with the 8, 13, 21 and 34 EMAs stacked bullish
10Stacked bearish
4 daysTypical daily squeeze, start to fire

44 stocks and ETFs at the Oct 20, 2026 close. The typical squeeze is the median length of 1,354 daily squeezes that ended, from each name's first daily bar in our data; 20% of them lasted 10 days or more, enough to fill the 10-bar count.

Install it in ThinkOrSwim

TTM Squeeze Dashboard

Download the Squeeze Dashboard columns for ThinkOrSwim. The download is a .zip with three .txt files: the code for the Moving Averages column, the code for the Squeeze column, and a file with two ThinkOrSwim share links, one for each column. Paste each script into a custom quote column in MarketWatch, using the same squeeze code for every timeframe, or open a share link from Setup, then Open shared item. If you haven't imported a shared item before, here's how to import into your ThinkOrSwim platform.

Download free

How to Add a Custom Column in MarketWatch

Every dashboard column is a custom quote, a short thinkScript that ThinkOrSwim runs on each symbol and prints in a cell. To add one:

  1. Open the MarketWatch tab and load your watchlist in the quotes table.
  2. Remove the existing quote columns so only the Symbol column is left.
  3. Click the gear icon on the table and choose Customize.
  4. Open the dropdown, scroll down to Custom Quotes, and open the thinkScript editor for the first slot, Custom 1.
  5. Name the column, set its aggregation, paste in the code, and click OK.
  6. Add the column to the table and click OK again. Repeat with Custom 2, 3 and 4 for the squeeze columns.

ThinkOrSwim limits how many custom quote slots you get and how many quotes run at any moment. Watchlist columns and custom studies all count toward that total, so a long list with many columns uses it up faster.

Each column prints its result with AddLabel and colors the cell with AssignBackgroundColor. If labels are new to you, our AddLabel tutorial covers the function. The download also has share links for both columns, and our guide on how to import a shared item into ThinkOrSwim shows how to load them.

How the code works

The Moving Averages Column

The Moving Averages column checks whether the 8, 13, 21 and 34-period exponential moving averages are stacked in order. I added it to keep only the strongest candidates in view. It reads the daily chart.

Step 1: Define the Four EMAs

This step’s code is free with an account. Create one or sign in.

ExpAverage(close, 8) is an 8-period EMA of the close. I wrote the first line, then copied it for the 13, 21 and 34.

Step 2: Define Bullish and Bearish Stacks

This step’s code is free with an account. Create one or sign in.

bullish is true when each faster EMA sits above the next slower one. bearish flips every comparison. When the lines are mixed, both are false.

Step 3: Print the Label and Color the Cell

This step’s code is free with an account. Create one or sign in.

Each AddLabel prints its text only when its condition is true. The third label prints a blank space when neither stack is in place, so the cell stays empty instead of showing the default loading text.

AssignBackgroundColor paints the cell green for a bullish stack, red for a bearish stack and black for neither.

In the video, the column showed bullish stacks on SPY, QQQ, gold and bonds, and nothing on DIA or IWM. I checked gold, SPY and QQQ against a chart with all four EMAs, and the lines were stacked.

To plot a stack on the chart itself, see our Stacked Moving Averages indicator. It uses a different set, the 8, 21 and 34 EMAs plus the 50 and 200 SMAs, so it won't always agree with this column.

The Squeeze Column

The Squeeze column runs the built-in squeeze study with its default settings and prints one of three things: a red-dot count, a fired label, or nothing. The same code goes into all three squeeze columns. Only the aggregation changes.

Step 1: Flag Red-Dot Bars and Count Them

This step’s code is free with an account. Create one or sign in.

squeeze is 1 on any bar with a red dot, where SqueezeAlert equals 0, and 0 on every other bar. Sum(squeeze, 10) adds those ones over the last 10 bars, which is the 10-period lens. A count of 10 means all 10 bars had red dots.

Step 2: Catch the Bar Where It Fires

This step’s code is free with an account. Create one or sign in.

squeezeFired is 1 when the previous bar had a red dot and the current bar doesn't. That's the bar where the squeeze fires, so the fired state lasts one bar. On the next bar the cell goes back to black unless a new squeeze starts.

Step 3: Labels and Colors

This step’s code is free with an account. Create one or sign in.

While a squeeze is on, the cell reads "Sqz Count:" plus the count, in white text on red. On the bar it fires, the cell reads "Sqz FIRED" in black text on green.

The blank label and black background keep every other cell clean, so the red and green cells stand out.

The empty parentheses in TTM_Squeeze() mean the study runs with its default inputs. To use other settings, pass them inside the parentheses. Our free Squeeze backtester tests different Squeeze settings on each ticker, which helps you choose them.

Full thinkScript code

TTM Squeeze Dashboard.tsthinkScript · 34 lines
The full code is free with an account

Create a free account or sign in to copy all 34 lines and download the file.

Examples

Walking the Funnel in the Video

The funnel in the video narrowed index ETFs down to a few stocks in XLP. These readings come from the day I recorded, so your dashboard will show different names.

Index ETFs

Gold showed a squeeze count of 10, and its chart had a squeeze on each of the past 10 bars. The QQQ squeezes had already fired, so their cells were black. While those squeezes were on, the same cells would have been red.

Sector ETFs

MarketWatch dashboard for 6 sector ETFs with XLP showing bullish stacked MAs and a 1-hour squeeze count of 10
The Top ETFs list: XLP is the only sector ETF with a squeeze, a count of 10 on the 1-hour column, with bullish stacked moving averages.

XLP was the only sector ETF with a squeeze worth a look: a count of 10 on the 1-hour column. Its 1-hour chart confirmed the red dots, and its moving averages were stacked bullishly.

XLP's Top Holdings

Dashboard for XLP top 10 holdings with WMT showing bearish stacked MAs and a daily squeeze count of 1
XLP Holdings on the daily, 1-hour and 30-minute columns: Walmart (WMT) has a daily count of 1 with bearish stacked moving averages.

Walmart was the one holding with a daily squeeze, and the dashboard showed its first red dot. Its moving averages were stacked bearishly, with the 34 on top, then the 21, 13 and 8, and price was consolidating inside them. The histogram bar was still below zero, so I read the bias as bearish.

That made Walmart a counter-trend trade inside XLP. The ETF's own averages were stacked bullishly, and XLP moved up 1.19% that day. Seeing both levels of the funnel at once is what flags that kind of conflict.

Shorter Timeframes

Dashboard for XLP top 10 holdings with 15-minute, 5-minute and 3-minute squeeze columns showing PG and KO squeezes
The same list with the squeeze columns switched to 15, 5 and 3 minutes: PG and KO show 15-minute squeezes, both with bullish stacked moving averages.

To look for bullish setups in XLP's holdings, I edited the three squeeze columns to 15 minutes, 5 minutes and 3 minutes, with extended hours off. Procter & Gamble and Coca-Cola then showed 15-minute squeezes building, and both had bullish stacked moving averages on the daily chart.

How I Read the Dashboard

The Squeeze dashboard is a filter that tells me where to look next. I train my eyes to find the red cells first, then open the chart and read price, the moving averages and the histogram before deciding anything.

A red cell says a squeeze is on, and a green cell marks the one bar where it fired. Neither one tells you where to enter or exit. Decide where your stop goes before you enter, and size the trade so a stop-out costs a small, fixed share of your account.

To find squeezes across a whole index instead of a list you picked, run our free 5-dot squeeze scan. It searches for 5 red dots in a row with stacked moving averages, and you can watch the names it finds in this dashboard.

Customize and troubleshoot

Timeframes and Extended Hours

Aggregation is the setting that decides what one bar is in each custom column, so the same squeeze code gives a daily, hourly or 30-minute reading. These are the settings I used in the video:

ColumnAggregation10 bars cover
Moving AveragesDailyNot used (EMA stack only)
Daily SqueezeDaily10 days
1hr Squeeze1 hour10 hours
30m Squeeze30 minutes5 hours

Intraday columns also have an extended-hours checkbox. I first left it off, then turned it on for the index list, where trading outside regular hours matters. For the sector ETFs I turned it off again so the data was reliable. When you check a count against a chart, set the chart's extended hours the same way.

Customizing the Dashboard

The Squeeze dashboard changes with a few clicks, because each column is independent. These are the changes I made or suggested in the video:

  • Add more columns. Click Customize, open another custom slot, and paste in the squeeze code again for a 15-minute or 5-minute column.
  • Swap the watchlist. Load any list in MarketWatch, from XLP Holdings back to the broader sector ETF list, and every column recalculates.
  • Detach it. Click the actions menu (the hamburger icon) at the top of MarketWatch and choose Detach. There are two of these menus, and the top one has Detach. Then resize the window to fit a corner of your screen.

For the end-of-day process I use to build a squeeze watchlist with the Squeeze Course tools, see our squeeze watchlist tutorial. More free layouts are on the dashboards page.

Video: TTM Squeeze Dashboard, built line by line

26 minutes on YouTube.

Watch on YouTube

Questions

What is a Squeeze dashboard in ThinkOrSwim?

It is a MarketWatch quotes table where custom columns show the Squeeze for every symbol in a watchlist. Mine has a Moving Averages column for stacked 8, 13, 21 and 34 EMAs and three squeeze columns on the daily, 1-hour and 30-minute timeframes. Red cells count squeeze dots, green cells mark a fired squeeze, and black cells mean there is nothing to report.

How do I add a custom column to MarketWatch in ThinkOrSwim?

In the MarketWatch tab, click the gear icon on the quotes table and choose Customize. Open the dropdown, scroll to Custom Quotes, and open the editor for a custom slot. Name the column, set the aggregation, paste in the thinkScript code, click OK, then add the column to the table. Each squeeze timeframe needs its own slot.

What does Sqz Count mean on the dashboard?

Sqz Count is the number of red squeeze dots in the last 10 bars of that column's timeframe. It appears only when the current bar has a red dot. A count of 10 means a squeeze on every one of those bars. A count of 1 means the current bar is the only red dot in the last 10, as with Walmart's daily column in the video.

What does Sqz FIRED mean on the dashboard?

Sqz FIRED means the previous bar had a red squeeze dot and the current bar doesn't, so the squeeze fired on this bar. The cell turns green with black text for that one bar. On the next bar it goes back to black, unless a new squeeze starts and the red count appears.

How do I change the dashboard timeframes for day trading?

Edit each squeeze column and change its aggregation. The code stays the same. In the video I switched the three squeeze columns to 15 minutes, 5 minutes and 3 minutes to look for faster setups in XLP's holdings. Rename the headers to match, and set the extended-hours checkbox to suit the symbols in your list.

Why is the squeeze cell black when my chart shows a squeeze?

Check that the column's aggregation and extended-hours setting match your chart. In the video I turned extended hours on for the index list, in both the columns and the chart, before checking counts. A black cell can also mean the squeeze already fired, since the Sqz FIRED label shows for one bar only.

Which moving averages does the dashboard use?

The Moving Averages column uses 4 exponential moving averages of the close: the 8, 13, 21 and 34. The cell is green when the 8 is above the 13, the 13 above the 21 and the 21 above the 34. It is red when all three comparisons flip, and black otherwise. I read it on the daily chart.

How is the Squeeze dashboard different from a squeeze scan?

The dashboard checks a watchlist you choose and shows the squeeze state on several timeframes side by side. A scan searches a whole list, such as the S&P 500, and returns only the symbols that pass one condition. Our free squeeze scan looks for 5 red dots in a row with stacked moving averages, and its results can go into the dashboard.

Goes with

Get each new indicator by email

One email on Sundays with the week's new tool and its code. A free account also unlocks every .txt download.

No credit card. Unsubscribe anytime.