On this page
Overview
In this tutorial I build a monthly watchlist scan in ThinkOrSwim for the month of March. It combines two pieces: a seasonal filter from our Seasonal Analysis indicator that looks for stocks where March has been a strong month, and a trend filter from our Market Pulse indicator on both the daily and the weekly chart.
The result is what I call an obvious watchlist: stocks heading into a month that has been strong for them, with strong daily and weekly trends already in place. In the video the scan cut 606 stocks with weekly options down to 42, which I saved as a March 2024 watchlist to study on max-data charts. The same steps work for any month.
Key Takeaways
- The Monthly Watchlist Scan is a free ThinkOrSwim scan built from 3 custom study filters: a seasonal filter for the month, and our Market Pulse trend filter on daily and on weekly bars.
- The seasonal filter uses the March code from our free Seasonal Analysis indicator. It keeps stocks where March closed above its open more than 80% of the time and the average March move is above 0.
- The Scan tab only reaches about 3 years of data, even on weekly bars, so in the video the seasonal filter means each of the last 3 Marches closed higher.
- The two Market Pulse filters keep stocks in the acceleration stage on both timeframes: the bullish condition is true and the close is at or above the variable moving average (VMA).
- In the video, the scan cut the Weeklys list from 606 symbols to 42 heading into March 2024. I saved them as a watchlist to step through on daily charts with max data.
What the Monthly Watchlist Scan Finds
The monthly watchlist scan finds stocks and ETFs where the coming month has been a strong one and the trend is already strong on the daily and weekly charts. I call it an obvious watchlist: names with seasonality on their side and both trends pointing the same way as you head into the month.
The scan needs 4 conditions, which become 3 custom study filters in ThinkOrSwim:
| Condition | Source code | Study filter | Aggregation |
|---|---|---|---|
| March closed above its open more than 80% of the time | Seasonal Analysis indicator | Filter 1 | W (weekly) |
| March's average move is above 0 | Seasonal Analysis indicator | Filter 1 | W (weekly) |
| Daily Market Pulse in the acceleration stage | Market Pulse indicator | Filter 2 | D (daily) |
| Weekly Market Pulse in the acceleration stage | Market Pulse indicator | Filter 3 | W (weekly) |
Both source indicators are free. Our Seasonal Analysis indicator tracks how each month has performed on a chart, and our Market Pulse indicator sorts a chart into market stages. If you haven't added either study yet, start there, because the scan borrows their code.
Why the Scan Only Sees 3 Years of Data
The ThinkOrSwim Scan tab makes this process about 10 times faster than flipping through charts, but it limits how much history a study filter can read. Setting the seasonal filter to weekly bars pushes the history as far back as it goes, and that is still only about 3 years. The filter sees the past 3 Marches and no more.
With 3 Marches, "more than 80% up" means all 3 closed higher. Three years is a thin sample, so I treat the scan as the first cut and do the rest of the leg work by hand on a chart with max data, which on SPY goes back more than 20 years.
That's also why the other three conditions matter. A positive average March and 2 trend filters shrink the list to a size you can review chart by chart.
Weekly bars add one more wrinkle: a week that straddles the start or end of March shifts which open and close the code picks up. The scan's March numbers can differ a little from the same code on a daily chart, which is one more reason to confirm the names on the chart.
How to Build the Monthly Watchlist Scan in ThinkOrSwim
Building the monthly watchlist scan takes 3 custom study filters on a Weeklys scan. Each filter is a separate Study filter with its own aggregation. Have the Seasonal Analysis and Market Pulse studies on a chart first so you can copy their code.
- Open the Scan tab and set Scan in to Weeklys, the list of stocks that have weekly options. You'll find it under the Public lists.
- Click Add filter and choose Study. The new filter defaults to ADXCrossover. When I recorded the video, study filters only worked in the live-money version of ThinkOrSwim.
- Go to the Charts tab, click the Studies icon, find the Seasonal Analysis indicator and click the scroll icon to open its code. Copy the March section.
- Back in the Scan tab, click the pencil icon on the filter, open the thinkScript Editor and paste the March code. Add the
plot signalline shown below, delete theAddLabelline, set the aggregation to W and click OK. - Add a second study filter, paste in the Market Pulse code, and edit it into the acceleration filter shown below. Leave the aggregation on D.
- Add a third study filter, copy the code from the daily Market Pulse filter into it, and set its aggregation to W.
- Click Scan.


Errors You'll See Along the Way
ThinkOrSwim throws two errors during the build in the video, and both come from code that works on a chart but not in a scan. The third row covers the live-money limit on study filters.
| Error or problem | Cause | Fix |
|---|---|---|
| AddLabel is not allowed in this context | Scans can't draw labels | Delete the AddLabel line after you've copied its condition |
| Exactly one plot expected | The Market Pulse code still plots the VMA line | Change plot VMA to def VMA and delete its color line |
| Study filter not available | When I recorded, study filters only worked in live-money ThinkOrSwim, not paperMoney | Build the scan in your live account |
The Seasonal Filter Code
The seasonal filter is the March block from the Seasonal Analysis indicator plus one new line. The block works out, for every March on the chart, the move from March's first open to its last close. The full filter is on the Code tab. These are the lines that matter for the scan:
This step’s code is free with an account. Create one or sign in.
The deleted AddLabel line is a handy reference: it already divides marUp by marTotalCount.
The plot signal line is what ThinkOrSwim scans for, and it needs both conditions to be true:
marUp/marTotalCount > 0.8: March closed above its open more than 80% of the time. The ratio runs from 0 to 1, so 80% is written 0.8.marAvgDiff > 0: the average March move is positive, so March has been a positive month overall.
For the code behind each of those lines, see our seasonal analysis tutorial, which builds the January version step by step.
The Market Pulse Filter Code
The Market Pulse filter keeps the stocks that are in the acceleration stage, which is when the Market Pulse line on your chart turns green. The indicator's own label code spells out the condition: the bullish variable is true and the close is at or above the variable moving average.
In the Market Pulse code, bullish means the 8-bar volume-weighted moving average sits above the 21-bar, and the 21-bar above the 34-bar:
This step’s code is free with an account. Create one or sign in.
To turn the indicator into a scan filter, keep everything through the distribution line and delete the label, color and bubble lines after it.
Then make two changes:
This step’s code is free with an account. Create one or sign in.
The first line turns the VMA from a plot into a def, which clears the one-plot error. The second is the line the scan reads. The table shows all 4 Market Pulse stages from the indicator's code, and the scan keeps only the first.
| Market Pulse stage | Condition in the code | Label color |
|---|---|---|
| Acceleration | Bullish, and the close at or above the VMA | Green |
| Deceleration | Bearish, and the close at or below the VMA | Red |
| Accumulation | Neither of the above, and the close at or above the VMA | Yellow |
| Distribution | Neither of the above, and the close below the VMA | Orange |
The weekly filter is the same code with a weekly aggregation, so you can copy it straight from the daily filter instead of going back to the chart.
What the Scan Found in the Video
The monthly watchlist scan returned 42 results heading into March 2024. The Weeklys list was 606 stocks before the 3 custom filters, so the scan cut it to about 7% of the starting list.

I also had our Market Pulse Dashboard script loaded as columns in the scan results, which let me confirm double greens, daily and weekly, across the board. I sorted the results by volume and started with SPY.
On a SPY chart with max data, which goes back more than 20 years, the Seasonal Analysis label showed March as an up month more than 60% of the time. That longer history is the check the 3-year scan can't do.
Saving the Results as a Monthly Watchlist
Saving the results is the last step of the build. The watchlist is only useful if you can step through it quickly:
- Save the scan itself as a scan query, or save the results as a manual watchlist. I named mine March 2024.
- In the Charts tab, load the new watchlist in the left-hand panel. It shows up with your personal watchlists.
- Link the watchlist and the chart with the same linking color and number.
- Click a symbol, such as ACN, to load its daily chart with max data, then use your arrow keys to move through the list and pick the names to study further.
Checking the Seasonal Numbers With Chart Bubbles
ThinkOrSwim occasionally gives you a glitch in these calculations, which a fellow YouTube member found, and chart bubbles are the way to debug it. Add this line to the Seasonal Analysis indicator, under the March code:
This step’s code is free with an account. Create one or sign in.
marDiff only has a value on the last bar of each March, so the chart stays clean. Each bubble shows one March's move as a percentage, in yellow at the close. Scroll back through them to see exactly which Marches feed the label. For another month, swap marDiff for that month's variable, such as aprDiff.
How I Use the Monthly Watchlist
The monthly watchlist is a starting list for research. The scan tells me which names have seasonality and both trends on their side, and the max-data chart tells me whether the seasonal pattern holds up over more than 3 years. From there I decide which ones to dig into.
A strong March in the past describes past Marches, and a green Market Pulse can turn. Before you trade a name from the list, decide where your stop goes and size the position so a stop-out costs a small, fixed share of your account. If you want a second trend read on the charts you review, our free Moving Average Clouds indicator is another trend tool.
The same idea works for other months and other watchlists. For another month, replace the March block with that month's block from the Seasonal Analysis indicator and change the mar variables in the plot line to match. For background on monthly patterns, read our research on stock market seasonality patterns.
The scan on real data
Drawn from real daily bars with the code on this page, through Oct 20, 2026. The scan has three filters: the month closed up in more than 80% of past years with an average gain (weekly bars, as in the code), the daily Market Pulse in Acceleration, and the weekly Market Pulse in Acceleration. The seasonal filter needs many years of the same month, so I ran it on the 14 funds we have back to 2016: SPY, QQQ, IWM, DIA and the sector ETFs. The video runs it on the Weeklys list.
March 2026, the month in the video
Run on March 2, 2026 with Marches 2016 to 2025: None of the 14 funds passed the seasonal filter, so the March list was empty.
October 2026, on Oct 20, 2026

None of the 14 funds closed October up in more than 8 of the last 10 years with an average gain, so the October list was empty.
How often a month passes at all
The seasonal filter is strict: across all 12 months and all 14 funds, through 2025, 11 fund-months pass it. November: IWM, DIA, XLF, XLV, XLP, XLB; August: SPY, QQQ, XLK; July: XLI; June: XLRE. So on the first trading day of November the seasonal filter alone keeps 6 funds, and the two Market Pulse filters decide the rest. Ten or eleven years is a short record for a monthly pattern, so treat the filter as a way to build the list, not a reason to trade.
Full thinkScript code
Create a free account or sign in to copy all 53 lines and download the file.
Download
Download the Monthly Watchlist Scan for ThinkOrSwim. The download is a .txt file with one ThinkOrSwim shared link to the scan. In ThinkOrSwim, click Setup in the top right corner, choose Open shared item, paste in the link and save the scan. You can also build the 3 study filters from the Code tab on this page. If you haven't imported a shared item before, here's how to import into your ThinkOrSwim platform.
Questions
What is a monthly watchlist scan?
It is a ThinkOrSwim scan that builds a short list of stocks for the coming month. Ours keeps names where that month has closed higher more than 80% of the time with a positive average move, and where our Market Pulse indicator is in the acceleration stage on both the daily and weekly charts.
How do I build a monthly watchlist in ThinkOrSwim?
Set the Scan tab to the Weeklys list and add 3 custom study filters. The first holds the month's code from our Seasonal Analysis indicator with a plot signal line, on weekly bars. The other two hold the Market Pulse acceleration condition on daily and on weekly bars. Run the scan and save the results as a watchlist.
Why does the scan only look at 3 years of seasonal data?
ThinkOrSwim limits how much history a scan filter can read. Even on weekly bars, the seasonal filter only reaches about 3 years, so it sees the last 3 Marches. That is why I check each result on a chart with max data, which goes back more than 20 years on SPY.
What does the Market Pulse acceleration stage mean?
Acceleration is the Market Pulse stage where the 8-bar volume-weighted moving average is above the 21-bar, the 21-bar is above the 34-bar, and the close is at or above the variable moving average. The Market Pulse line turns green. The scan requires it on both the daily and the weekly chart.
How do I change the scan to a different month?
Replace the March block in the seasonal filter with the block for the month you want from the Seasonal Analysis indicator, then change the mar variables in the plot signal line to that month, such as aprUp, aprTotalCount and aprAvgDiff for April. The two Market Pulse filters stay the same.
Why can't I add a study filter to my scan?
When I recorded the video, custom study filters only worked in the live-money version of ThinkOrSwim, so build the scan in your live account. If the filter shows an error instead, check for an AddLabel line, which scans don't allow, or a second plot, which you fix by changing plot VMA to def VMA in the Market Pulse code.
How do I save scan results as a watchlist in ThinkOrSwim?
Save the results as a manual watchlist from the Scan tab and give it a name, such as March 2024. Load it in the watchlist panel on the left of the Charts tab, link it to the chart with the same color and number, then click through the symbols with your arrow keys.
How many stocks did the monthly watchlist scan return?
In the video, the scan returned 42 stocks heading into March 2024, out of 606 in the Weeklys list. Your results depend on the month and the market, since the Market Pulse filters change as trends change and the seasonal filter only sees the last 3 years.
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.
Fair Value Gap
False Breakout Scanner
Heiken Ashi Trend



Stock Volatility Box
Futures Volatility Box
ORB Setups
Squeeze Setups
Average True Range Scanner
TTM Squeeze Scanner
Stacked Moving Averages
Upcoming Earnings Scan
Rate of Change Scans