On this page
Overview
In this tutorial I build an advanced VZO for ThinkOrSwim, starting from the Volume Zone Oscillator that comes with the platform. The VZO compares volume on up closes and down closes with total volume. Our version colors it green, yellow or red, shades the zones from 40 to 60 and from -40 to -60, and adds bullish and bearish arrows.
The arrows come from ThinkOrSwim's own documentation for the study, which confirms a trend with the 14-period ADX and the 60-period EMA. I build a lower study for the oscillator and an upper study that colors the candles and plots the arrows. It's for momentum and trend traders, and it pairs with tools like the Squeeze and moving averages.
Key Takeaways
- The Volume Zone Oscillator (VZO) is 100 times the ratio of two 14-bar EMAs: volume signed by the direction of the close, and total volume.
- ThinkOrSwim's documentation for the VZO lists levels at +60, +40, +15, -5, -40 and -60, and confirms a trend with a 14-period ADX above 18 and a 60-period EMA.
- Our Advanced VZO colors the line, dots and candles green above 15, yellow above -5 up to 15, and red at -5 or below.
- A bullish arrow needs ADX above 18, a close crossing above the 60 EMA, and the VZO crossing up to 40 or higher, all on the same bar. The bearish arrow mirrors it at -40.
- The free download has 2 studies: a lower oscillator with clouds and dots, and an upper study with colored candles and arrows.
What Is the Volume Zone Oscillator?
The Volume Zone Oscillator is a built-in ThinkOrSwim study that analyzes volume changes in relation to levels, or zones. It runs on two exponential moving averages of volume. The first is price-related: each bar's volume counts as positive when the close is above the previous close and negative when it's below. The second is a plain EMA of volume.
This step’s code is free with an account. Create one or sign in.
The VZO is the percentage ratio of the two, with a length of 14 bars.
A positive VZO means volume on up closes has outweighed volume on down closes over that period, and a negative VZO means the reverse. For other ways to read volume, see our article on the best volume indicators for ThinkOrSwim.
What ThinkOrSwim's Documentation Adds
ThinkOrSwim's description of the VZO lists the levels to watch and two indicators that confirm a trend. TD Ameritrade did a lot of the work of finding the patterns and best practices, so I turned each part into code:
| From the documentation | Value | How the Advanced VZO uses it |
|---|---|---|
| Levels | +60, +40, +15, -5, -40, -60 | 40 to 60 and -40 to -60 become clouds. 15 and -5 set the colors. |
| Trend existence | 14-period ADX above 18 | trendExistence, required for every arrow |
| Trend direction | 60-period EMA: a cross above suggests an uptrend, below a downtrend | direction, a value from 1 to 4 |
Search for the Volume Zone Oscillator online and you'll find other best practices. The most agreed-upon signal level is plus and minus 40, so that's what this indicator uses. Depending on your trading style, you may want to change 40 to something else.
What the Advanced VZO Shows
The Advanced VZO comes as two studies that split the information across your screen. Both use the same colors, set by where the VZO sits against the 15 and -5 levels:
| VZO reading | Color of the line, dots and candles |
|---|---|
| Above 15 | Green |
| Above -5, up to 15 | Yellow |
| -5 or below | Red |
- Lower study. The VZO line and a matching row of dots, a zero line, lines at +40, +60, -40 and -60, a green cloud from 40 to 60 and a red cloud from -40 to -60.
- Upper study. No oscillator. It colors your candles with the VZO colors and plots the bullish and bearish arrows at line weight 5.
The 15 and -5 levels are there because coloring by the 40 zone would leave the line one color most of the time.
How to Build the Lower VZO Study
The lower study build starts from the built-in code, and these are the steps I follow in the video. To skip it, import the finished studies from the download with our guide on how to import a study into ThinkOrSwim.
- Click the studies icon, find Volume Zone Oscillator, and click the scroll icon. The code is locked, but you can read all of it.
- Copy it, click Create to start a new study, paste it in and name it TI_AdvancedVZO_Lower. It already declares lower.
- Add the confirmation variables: ADX, the 60 EMA, trendExistence and direction.
- Add the two crossover variables and the bullSignal and bearSignal plots to test them.
- Comment out the +15 and -5 plots and their color lines, and comment out the signal plots, since the arrows belong on the upper study.
- Add the two clouds, the color line, and a second copy of the VZO plot drawn as dots.
Before changing any of the code, I added the copied study to a daily SPY chart, where the VZO shows as a cyan line with the zero line and all six levels.
Here are the formatting lines from step 6, as they read in the download:
This step’s code is free with an account. Create one or sign in.
The dots come from plotting the same value twice:
This step’s code is free with an account. Create one or sign in.
VZO_DOTS draws as points at weight 3 and gets the same color line as the VZO, so the line looks like it connects a dot on every bar.
How the Signal Logic Works
The Advanced VZO signal logic has three parts: a trend check, a direction check and a level cross. The first two come straight from ThinkOrSwim's documentation.
Trend Existence and Direction
This step’s code is free with an account. Create one or sign in.
trendExistence is true when the 14-period ADX is above 18.
The direction variable gives each bar a value from 1 to 4 based on the close and the 60-period EMA:
| direction | Meaning | Condition in the code |
|---|---|---|
| 1 | Crossed above the 60 EMA on this bar | Close above the EMA, previous close at or below it |
| 2 | Above the 60 EMA | Close above the EMA, previous close at or above it |
| 3 | Crossed below the 60 EMA on this bar | Close below the EMA, previous close at or above it |
| 4 | Below the 60 EMA | Anything else |
The Level Crosses and Arrows
This step’s code is free with an account. Create one or sign in.
A crossover is 1 on the bar where the VZO reaches 40 or more from below 40, or -40 or less from above -40.
This step’s code is free with an account. Create one or sign in.
A bullish arrow needs all three on the same bar: ADX above 18, direction 1, and a bullish crossover. The bearish arrow needs ADX above 18, direction 3, and a bearish crossover.
My first version used ARROW_UP and ARROW_DOWN, and a lot of arrows plotted, because those draw at the plot value whether it's 1 or 0. BOOLEAN_ARROW_UP and BOOLEAN_ARROW_DOWN draw only when the value is true, and most of the arrows disappeared. The ones left included a bullish arrow on a Goldman Sachs chart.
How to Build the Upper VZO Study
The upper VZO study is the lower code moved onto the price chart, where it colors the candles and plots the arrows. These are the changes I make in the video:
- Copy all the lower code into a new study named TI_AdvancedVZO_Upper and change it to declare upper.
- Bring back the bullSignal and bearSignal code you commented out.
- Delete the clouds, and change
VZO.AssignValueColortoAssignPriceColorso the colors land on the candles. - Change the VZO plot to a def, and delete the other plots, the dots, the painting strategy and the default color lines.
- Give both arrows a line weight of 5.
The candle color rule is the same as in the lower study: green above 15, yellow above -5 up to 15, and red at -5 or below. The line from step 3 reads:
This step’s code is free with an account. Create one or sign in.
Advanced VZO Settings
The Advanced VZO has one input, length. The other settings are numbers in the code:
| Setting | Value | Where it lives |
|---|---|---|
| length | 14 | Input, used by both volume EMAs |
| ADX length and threshold | 14, above 18 | ADX(14) and trendExistence |
| EMA length | 60 | ExpAverage(close, 60) |
| Signal levels | +40 and -40 | The two crossover lines |
| Color levels | 15 and -5 | The color lines in both studies |
| Dot weight | 3 | Lower study |
| Arrow weight | 5 | Upper study |
The ADX threshold and signal levels are hard-coded. To try different ones, edit the numbers in the upper study, which plots the arrows.
Advanced VZO Examples from the Video
The Advanced VZO examples in the video come from the day I recorded, so the charts will look different today.
- Goldman Sachs (GS). On a 30-minute chart, the upper study showed a bullish arrow. On the daily chart there were no arrows.
- NVIDIA (NVDA), daily. The upper study plotted a bullish arrow, then a bearish arrow after earnings.
- NVIDIA with the Squeeze. The bullish arrow came on the final day of the squeeze, right as it fired. The follow-through was smaller than I expected, but it was a relatively nice burst for momentum traders.
- The bearish arrow. With the Squeeze settings I started with, there was no squeeze before it. After I changed the Squeeze to a more aggressive setting, a squeeze showed up and fired bearishly, and the arrow would have helped you get into that momentum move.
How I Use the Advanced VZO
The Advanced VZO is a momentum and trend tool, so I pair it with similar indicators instead of our overbought and oversold studies. In the video I name the Squeeze, which we built a dashboard for in our Squeeze Dashboard tutorial, moving averages like our multiple time frame moving averages, and our Simple Breakout Tool.
The arrows mark bursts of movement where you might look for an entry. Treat an arrow as a read on volume and trend, then check the chart. Decide where the stop goes before you enter, and size the position so a stop-out costs a small, fixed share of your account.
The download has no alerts. In the video I point to our VScore indicator tutorial for setting alerts, so ThinkOrSwim can tell you when an arrow plots on the S&P or a futures chart. The VScore download ends with Alert lines you can copy the pattern from.
In the video I mention that Volatility Box members would get scans for the arrow signals in that week's indicator update. The free download has the 2 studies only.
The Advanced VZO on real charts
Drawn from real daily bars with the code on this page, through Oct 20, 2026. A bull arrow needs three things on the same bar: ADX above 18, the close crossing above the 60-period EMA, and the VZO crossing up to 40 or higher. The candles take the VZO's color: green above 15, yellow above -5, red at -5 or below. I picked the most recent bull arrow on a well-known name that closed higher 10 days later, and the most recent that did not.
AMZN, Jul 7, 2026

AMZN closed at $245.98 on the arrow and at $247.55 ten trading days later, +0.6%.
META, May 27, 2026

META closed at $635.25 on the arrow and at $570.98 ten trading days later, -10.1%.
By the numbers
Daily bars for 648 stocks and ETFs, Aug 5, 2016 to Oct 20, 2026: the 14 ETFs from 2016, most stocks from about Dec 31, 2024, once they have 120 bars of history. The yardstick is every day in the same symbols over the same window, and the bull arrows matched it. Of the 458 bear arrows with 10 days after them, 45.2% were followed by a lower close, against 47.2% for any day.
Full thinkScript code
Create a free account or sign in to copy all 99 lines and download the file.
Download
Download the Advanced VZO indicator for ThinkOrSwim. The download is a .zip with two study files: TI_AdvancedVZO_LowerSTUDY.ts, the oscillator with the colored line, dots and clouds, and TI_AdvancedVZO_UpperSTUDY.ts, which colors your candles and plots the bullish and bearish arrows. Import both for the full setup. If you haven't added a custom study before, here's how to import an indicator into your ThinkOrSwim platform.
Questions
What is the Volume Zone Oscillator (VZO)?
The Volume Zone Oscillator is a built-in ThinkOrSwim study that compares volume on up closes and down closes with total volume. It is the percentage ratio of two exponential moving averages of volume. Positive readings mean up-close volume has outweighed down-close volume, and negative readings mean the reverse.
How is the VZO calculated in ThinkOrSwim?
The study takes a 14-bar EMA of volume signed by the direction of the close (positive when the close is above the previous close, negative when below) and divides it by a 14-bar EMA of total volume. Multiplying by 100 gives the VZO.
What do the VZO levels mean?
ThinkOrSwim's documentation lists levels at +60, +40, +15, -5, -40 and -60. The Advanced VZO shades 40 to 60 green and -40 to -60 red, uses crosses of +40 and -40 for its arrows, and uses 15 and -5 to color the line and candles.
What confirms a VZO signal?
ThinkOrSwim's documentation uses two indicators. A 14-period ADX above 18 says a trend exists, and the 60-period EMA gives its direction: a cross above suggests an uptrend, a cross below a downtrend. The Advanced VZO arrow needs the ADX check, the EMA cross and the 40 level cross on the same bar.
What do the green, yellow and red colors mean?
They show where the VZO sits. Green means the VZO is above 15, yellow means it is above -5 and up to 15, and red means it is at -5 or below. The lower study colors the line and dots, and the upper study colors your candles the same way.
Why do my VZO arrows plot on every bar?
You are probably using ARROW_UP and ARROW_DOWN, which draw at the plot value on every bar, including 0. Switch to BOOLEAN_ARROW_UP and BOOLEAN_ARROW_DOWN, which draw only when the signal is true. That change removed most of the arrows in the video.
Why are there no arrows on the lower VZO study?
The arrows live on the upper study. In the video I comment out the signal plots in the lower study to keep the oscillator clean, and the upper study plots them on the candles at line weight 5. Add both studies to see the oscillator and the arrows together.
Which indicators pair well with the Advanced VZO?
The Advanced VZO is a momentum and trend tool, so it fits with similar indicators: the Squeeze, moving averages and our Simple Breakout Tool. In the video, the NVIDIA bullish arrow came on the final day of a squeeze, right as it fired.
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 Volume Stats
Increasing Volume
Unusual Volume
Volume Intensity
Multi-Time Frame (MTF) Squeeze Indicator
Option Chain Relative Value