For the 16th episode of “How to thinkScript”, we’ll switch gears and explore writing thinkScript code to achieve as close to automated trading in ThinkOrSwim, as we can.
Now, before I move further, I want to caveat by saying that this technique still requires you to manually write code, every time you’d like the condition to trigger you either into or out of a trade.
There is no way (at least that we’re aware of) to have fully automated trading in ThinkOrSwim (at least the platform).
That being said, this is still an incredibly powerful way to take advantage of patterns that you may have found on longer time frame charts. The reason we focus on longer time frame chart is trade ideas here typically require you to be more patient, and to keep monitoring the charts to see whether or not your trade conditions are true.
However, if you have a process-driven approach, much of this is mechanical, and can be outsourced to the actual ThinkOrSwim platform to try and automate as much of the trading process as possible.
Keep in mind, most of this is experimental, so you should ALWAYS test out your ideas and code in PaperMoney first.
So, let’s get started!
Table of Contents
Automated Trading in ThinkOrSwim Video Tutorial
Watch the video tutorial here, to follow along with the code snippets below, to learn more about the functionality of automated trading in ThinkOrSwim:
A PDF with all the code snippets is available for free download below.
Volatility Box Invite
We are TOS Indicators.com, home of the Volatility Box.
The Volatility Box is our secret tool, to help us consistently profit from the market place. We’re a small team, and we spend hours every day, after the market close, doing nothing but studying thousands of data points to keep improving and perfecting the Volatility Box price ranges.
We have two different Volatility Boxes – a Futures Volatility Box and a Stock Volatility Box.
The Futures Volatility Box comes with:
- 4 Volatility Models for each market
- Support for 9 Futures Markets (/ES, /NQ, /YM, /RTY, /CL, /GC, /ZB, /HG, /NG)
- Video Setup Guide
- Trade Plan
- Access to all members-only resources, including Squeeze Course
The Stock Volatility Box comes with:
- Powerful web-based platform to help you trade stocks like a pro
- Supports 8,200+ stocks and ETFs, with daily Volatility Box price levels
- Real-time live scanner for all liquid stocks to find active Volatility Box setups, so you can pick, and choose, and simply add them to your Dashboard for price levels
- Completely platform agnostic, so even if you don’t have ThinkOrSwim, you’re all good
- Access to all members-only resources, including Squeeze Course
If you trade both stocks and futures, e-mail us at [email protected] and we can offer you a trader-friendly bundle deal.
Start trading at the edge, with an edge, and join the Volatility Box family today.
Why Automated Trading?
Most of the time, we find trade ideas and patterns that we’ve backtested to great lengths (or that others have), which we’d like to replicate. Very little is original in terms of new trade ideas or patterns.
Much of what separates a successful trader to a non-successful trader is the ability to execute on your actual plan. And of course, we all have a plan, until it comes time to actually enter that trade.
One of the advantages to automated trading in ThinkOrSwim is that we can build this plan via code, and actually set in play to execute on its own, whenever those conditions are true.
This helps us not only eliminate emotions at the time of execution (i.e. will the stock keep falling further?), but it also lets us not have to sit there and worry about checking the charts of SPY daily to see whether or not the trade has triggered.
Now, multiply this by as many strategies as you have and you can start to see where the challenge arises in managing those multiple positions.
So, that brings us to the biggest advantage of this entire concept of automated trading in ThinkOrSwim – you can outsource as much of the machine work to the ThinkOrSwim platform in itself.
Now, of course, automated trading in ThinkOrSwim doesn’t come without its own set of shortcomings. It’s not a platform meant for auto-trading, to be clear.
The biggest one that you’ll notice as you start to explore the functionality, is that it’s incredibly limited in terms of the studies, and built-in functions that it supports.
For example, as you try to reference some of the previously built studies that we have, such as the Market Pulse or VScore, you’ll be met with a flood of errors. Some around the complexity of the study. Some around how rec usage is not supported.
All of this to say – the automated trading triggers pane is more limited, in terms of the coding depths it supports, compared to the ThinkOrSwim studies menu.
Apart from that, the other obvious disadvantage is losing the ability to revise any decision making at the actual time of entry, given the additional data that you now have on your charts (both in terms of price action, volume, and your own indicator studies).
Based on your trading style though, if you are usually more fearful to do things like buy pullbacks in trends, well – this should then help you eliminate that fear, by creating an auto-trade condition to buy Microsoft any time it pulls back into the 34 EMA, as an example.
So, how can we most efficiently use the automated trading in ThinkOrSwim to benefit our trading?
What is the Automated Trading Triggers Window?
To navigate to the automated trading window, you need to first have an order that you’re building inside of ThinkOrSwim.
Once you have an order in the “Trade” tab, you can then click the settings gear icon, to open up the automated trading panel:
Let’s go through some of these options to see what you can control:
- Limit Linked To – this lets you control whether you’d like to link the execution price to the bid, ask, mid-price, last, etc. If you were looking to buy on a pullback, you may have your limit linked to the “Bid” or “Mid” to avoid overpaying at the market.
- Conditions – you can customize the method to be a study, where we can input custom thinkScript code and reference previously build studies to incorporate our own set of automated trading conditions
Let’s brainstorm some potential ideas, that we would want to auto-trade. Of course, these are just examples to help you get started.
8 Trigger Scenarios That We Will Build
- Scenario 1: Buy MSFT if it crosses above $175 in the first 15 minutes
- Scenario 2: Sell HD Iron Condor when price is between $195 and $200
- Scenario 3: Sell a covered call on pre-existing 100 shares in LVGO when price hits the 2.00 extension to collect “rent” on a profitable position
- Scenario 4: Buy a pre-selected put when RSI is showing breakout signals
- Scenario 5: Buy stock if we get a pullback to the 34 EMA, with the moving averages all being stacked, triggered with an OCO order
- Scenario 6: Close my position when squeeze momentum starts to decline
- Scenario 7: Buy pre-selected call if we have a squeeze, with greater than avg. volume, and EMAs agreeing with the direction
- Scenario 8: Buy on Implied Volatility pullbacks in a strong uptrend for the stock. Simultaneously, place a GTC exit order whenever moving averages are no longer stacked, on a lower time frame.
So the built-in study is going to be our base. It seems to match even the s
For Scenario 1, we’ll use our nightly Trending List that we e-mail to our Stock Volatility Box subscribers as a sample condition.
We’d like to buy Microsoft (MSFT), as an example, if it crosses above $179.18 within the first 15 minutes.
No code is required here, but instead, just some simple customizing of the conditions in the Automated Trading Triggers pane in ThinkOrSwim.
And that’s scenario 1, all done. Moving onwards to Scenario 2.
Scenario 2: Iron Condor When in Consolidation
For Scenario 2, let’s assume that you’re looking at a period of potential consolidation in HD we’d like to sell an Iron Condor whenever price is between $195 and $200.
That happens to also overlap with the Market Pulse indicator line, which gives you reason to believe we’ll chop sideways for a bit.
Again, keep in mind, these are all just for demonstrative purposes – NOT real trades, so please don’t go placing them.
You may be looking at a period of consolidation in Home Depot, but want to get a slightly better entry on the Iron Condor so you’d like to wait for price to fall.
Here, the code for the automated trading in ThinkOrSwim is quite simple:
plot signal = if close >= 195 and close < 200 then 1 else 0;
This lets us place the order conditions, and you may link it to something like the ask to avoid overpaying or even the mid-price, and set this as a GTC order.
If it gets filled, fantastic.
You can even set an expiration date, if you’d only like this order to be valid through the end of this week.
Scenario 3: Automatic Covered Call for Income at Fib Extensions
Here, let’s assume that you already own 100 shares of Livongo Health (LVGO). LVGO has made a pretty nice move to its 1.618 retracement.
Now let’s say that you don’t think it can go much higher above the 2.000 retracement at $44.88.
Instead of having to sit there and watch the position (or even set an alert to revisit the thought later), you’d like to automatically sell a covered call against your pre-existing 100 shares.
You’d like to use the automated trading in ThinkOrSwim to automatically sell a $45 strike call, when price hits the 2.00 retracement level at $44.88.
Think of this as collecting rent, on an already profitable position.
Let’s create that. Again, we don’t need any code here. We can build the conditions using the editor.
First, we head to the options chain to choose the $45 strike call, and we go to edit the options of the automated trading pane:
We’d like to join the bid to collect the greatest credit we can (or even the mid, if you prefer), and you can set the order to GTC.
Scenario 4: Buy Put When RSI Shows Bearish Breakout Signals
For Scenario 4, we’ll use the built in RSI signals to buy a put whenever we have a bearish breakout signals. Now, the larger the time frame, the more powerful the signal should be.
Let’s assume we’re doing this on a daily SPY chart, so we may want to buy a Put that is at least 90 days out, to give not only ourselves time, but also the trade without needing to re-update the Trigger conditions (with the next month’s strike).
Here, our code is fairly simple, and we attach this to the Triggers pane of the put we’d like to use:
plot signal = RSI().DownSignal;
That tiny, one-liner of code is enough to trigger the automated trading in ThinkOrSwim to place an order whenever we have that down signal.
We use the array “” to reference the previous bar, to confirm that the signal has actually finished printing, instead of still being in progress.
Scenario 5: Buy Stock on Pullbackto 34 EMA
This time, we’ll write some thinkScript to enter into a stock that has stacked moving averages (8 EMA x 21 EMA x 34 EMA). If we have stacked moving averages, let’s say bullish, then we can assume that we have a bullish trend.
This is a concept we’ve talked about in previous tutorials, including the Simple Breakout Tool tutorial.
And with a trend, we can buy trend pullbacks, to whichever EMA we prefer (in this case, we’re using the 34 EMA).
Here is the code, all written out so that it’s easy to copy/paste:
def EMA8 = ExpAverage(close, 8); def EMA21 = ExpAverage(close, 21); def EMA34 = ExpAverage(close, 34); def stacked = if EMA8>EMA21 and EMA21>EMA34 then 1 else 0; plot signal = if stacked and close <= EMA34 then 1 else 0;
Scenario 6: Sell Position When Squeeze Loses Momentum
In our second to last scenario, we’ll assume that you’re already in a position, ideally because of the TTM_Squeeze.
Once the squeeze fires, you’d like to get out as soon as the histogram bars show us that we’re starting to lose momentum.
Here, you’re using the automated trading in ThinkOrSwim to let you manage an existing position, instead of enter a new one.
Let’s write the code :
plot signal = if TTM_Squeeze().Histogram < TTM_Squeeze().Histogram then 1 else 0;
Scenario 7: Layering on Multiple Indicators
For the 7th scenario in this semi-automated trading series, we’re going to take a look at combining multiple conditions into one trigger.
The concept that I’m really trying to get across here is less about the actual conditions I’ve chosen, and more about the idea that you can layer on multiple “basic” indicators, and bypass some of the complexity errors in ThinkOrSwim.
The specific condition we’re going to look at here is buying a pre-selected call if:
- We have a squeeze
- Greater than average volume
- EMAs agreeing with the overall trend
Here’s the code that we use for the above conditions:
def EMA8 = ExpAverage(close, 8); def EMA21 = ExpAverage(close, 21); def EMA34 = ExpAverage(close, 34); def bullish = if EMA8 > EMA21 and EMA21 > EMA34 then 1 else 0; def squeeze = if TTM_Squeeze().SqueezeAlert == 0 then 1 else 0; def greaterVol = VolumeAvg().Vol > VolumeAvg().VolAvg and close > close; def conditions = bullish and squeeze and greaterVol; plot signal = conditions;
Scenario 8a: Buy on Implied Volatility Pullbacks (Entry)
For our last and final scenario, we have two parts. In part 8a, we’re going to look at coding the entry components, which is going to be around the idea of buying on Implied Volatility pullbacks to the 34 EMA.
Yes, you read that correctly.
We’re going to run exponential moving averages using Implied Volatility as the data input, in lieu of the close price, and buy on IV trend pullbacks in otherwise strong trends on the actual underlying. And, that is going to be built into code for automated trading in ThinkOrSwim.
The goal to convey here is that you can go multiple layers deep in terms of analysis, and can very easily see when these trigger conditions were true, and what happened after.
The thing we’ll do differently here is “Buy custom” and link a close order with our entry order (i.e. Buy Custom with Stop)
Here’s our entry code:
def EMA8 = ExpAverage(close, 8); def EMA21 = ExpAverage(close, 21); def EMA34 = ExpAverage(close, 34); def stacked = if EMA8 > EMA21 and EMA21 > EMA34 then 1 else 0; def ImpVol = IMP_VOLATILITY(); def IV8 = ExpAverage(impVol, 8); def IV21 = ExpAverage(impVol, 21); def IV34 = ExpAverage(impVol, 34); def IVstacked = if IV8 > IV21 and IV21 > IV34 then 1 else 0; def conditions = if stacked and IVstacked and ImpVol<= EMA34 then 1 else 0; plot signal = conditions;
Scenario 8b: Sell When Trend Breaks
And finally, we’d like to add some custom code to the second component of the order – the sell order, as part of that custom order type we had built.
Here, we’ll link the closing order to the EMAs.
This is our exit code:
def EMA8 = ExpAverage(close, 8); def EMA21 = ExpAverage(close, 21); def EMA34 = ExpAverage(close, 34); def stacked = if EMA8 > EMA21 and EMA21 > EMA34 then 1 else 0; def conditions = if stacked and !stacked then 1 else 0; plot signal = conditions;
This is to say that when the 3 EMAs are no longer stacked, we will close out the trade, either for a gain or a loss.
This is what the final trigger order should look like, with both the buy and sell custom codes:
And voila! We’re done.
We walked through 8 different “scenarios” that are fairly close to realistic setups that you may have, and we tried to get as close as we could to automated trading in ThinkOrSwim.
The system is still not perfect, but it should still serve to be convenient and reward the hard work of finding the setup in the first place.
What Else Can I Do?
Now that you have the fundamental knowledge with regards to using automated trading in ThinkOrSwim functionality, you can take this in whichever direction you’d like.
Some examples include:
- Test your own setups
- If you face “complex” errors, break apart the indicator components to see if you can find another way to calculate the same trigger
- Use PaperMoney as a sandbox environment
- Use GTC orders to run experimental trade setup ideas you may be looking at to test their expectancy and probabilities (“free semi-automated backtesting”)
- Push the capabilities of the platform and test different order types, multiple TRG brackets with custom studies, etc.
Click the button below to download the PDF with code snippets for Semi Automated Trading in ThinkOrSwim.