Useful Indicators For Swing Trading With ThinkOrSwim

jserenson1153

New member
VIP
How do I find useful indicators to help me on my way to learning how to scan for eligible stocks for swing trading or for options trading.
 
Solution
Keep in mind that swing trading is more about the research and analysis into the financials, news and forward-looking guidance for the stock. These factors power the profitability of your swing trade.
https://usethinkscript.com/threads/best-time-frame-for-trading-for-thinkorswim.12209/#:~:text=Daytraders attempting to-,swing,-because they have

And exits are not the same as day-trading, where traders jump out at the slightest sign of trouble.
https://usethinkscript.com/threads/swing-trade-exits.17435/

Swing Trading means making the assumption based on your analysis that the trend will continue despite minor downturns.
read more here...
Hey guys I started trading a 8-9 months ago and options trading caught my attention. I’ve been trying to get better at 2-4 week swing trading options but I’m having a difficult time finding indicators and decent stocks and when I do find one I hesitate. What kind of indicator and screeners would you guys recommend and what tips do you guys have? Thank you for the help


You have come to the right place. This thread is chock-full of indicators and scanners for swing trading.
Want more ideas? Here are the top 50 swing trading threads currently trending:
https://usethinkscript.com/search/2...&c[nodes][3]=25&c[title_only]=1&o=replies&g=1
 
Reliable and effective scans for swing trading

What have you found to be the most effective and reliable scans for swing trading? I want to use daily and weekly charts on the symbols that the scans have listed. Thank you very much in advance for any help you can give.
 
Last edited by a moderator:
Reliable and effective scans for swing trading

What have you found to be the most effective and reliable scans for swing trading? I want to use daily and weekly charts on the symbols that the scans have listed. Thank you very much in advance for any help you can give.
Swing Trading is a different animal as @useThinkScript mentions. You need to think like a hunter hunting a very elusive and smart prey. You are a hunter without prejudice!!!

The Hunter's Checklist for a Scanner.
The scanner wakes up every morning and asks every stock:

✓ Trend Triggered?​

Something has changed.

✓ Momentum Building?​

Energy is entering.

✓ Volume Confirming?​

Someone bigger than retail is involved.

✓ Structure Favorable?​

There is a logical place to enter.

✓ Continuation Likely?​

This probably isn't a one-day wonder.

✓ Institutional Quality?​

Is this something worth holding for 2–12 weeks?
 
I think we build it in three passes, just like a screening process.

Pass 1 – Find the prey - Run through 500–1000 stocks.
Return only names with:
  • 5/6 signals
  • 6/6 signals
Nothing else. Maybe only 10–20 names survive.

Pass 2 – Evaluate the prey - Now open the chart.
Look at:
  • support/resistance
  • option chain
  • IV
  • earnings date
  • position size
This is where your judgment comes in.

Pass 3 – Pull the trigger - Choose the best 2–5 trades.

Can you guys think of other or better strategy??
 
thinking outloud - Version 1 (Test Drive)

I would start with only six objective signals.

1) Trend Triggered ✓

Long
  • EMA21 > EMA55
  • EMA21 slope > 0
  • Price above EMA21

Short
  • EMA21 < EMA55
  • EMA21 slope < 0
  • Price below EMA21

If true... Trend Triggered


2) Momentum Building ✓

Using my Linda indicator (my preferred oscillator):

Long
  • K > D
  • D rising

Short
  • K < D
  • D falling

If true... Momentum Building

3) Volume Confirming ✓

Simple. RVOL

RVOL > 1.20

or

OBV making new highs/lows.

If true = Volume Confirming

4) Structure Favorable ✓

One of these must be true.

Long
  • Pullback into EMA21
  • Bounce from support
  • Breakout above resistance

Short
  • Rally into resistance
  • Failure at EMA21
  • Breakdown below support

If any one occurs = Structure Favorable


5) Continuation ✓

This is simply agreement.
Examples

Long
  • Cloud green
  • DSMA Long
  • EMA stack bullish

Need 2 of 3.


Short- Same idea.

If yes = Continuation

6) Quality Stock ✓

Daily only.

Examples
  • Avg Volume > 2M
  • Price > $20
  • ATR > 2%
  • Not a penny stock

If true = Institutional Quality
 
OK FIRST TRY AT THIS SCAN WAS VERY SIMPLISTIC- here is the first run results (THESE ONLY RETURN IDEAS- IT IS UP TO YOU TO DECIDE GOOD OR BAD)

Code:
#=============================================================
# INSTITUTIONAL SWING SCANNER V1
# Long Only
# Designed for 14-60 Day Swing Trades
# antwerks
#=============================================================

input MinScore = 80;

#-------------------------
# Weights
#-------------------------

input TrendWeight = 35;
input StructureWeight = 25;
input MomentumWeight = 20;
input ParticipationWeight = 10;
input QualityWeight = 10;

#=============================================================
# QUALITY
#=============================================================

def AvgVol = Average(volume, 50);

def DollarVolume = AvgVol * close;

def Quality =
    close > 20 and
    AvgVol > 3000000 and
    DollarVolume > 100000000;

def QualityScore =
if Quality then QualityWeight else 0;

#=============================================================
# TREND
#=============================================================

def SMA21 = Average(close,21);
def SMA50 = Average(close,50);
def SMA200 = Average(close,200);

def Trend =
close > SMA200 and
SMA50 > SMA200 and
SMA50 > SMA50[5] and
SMA200 > SMA200[10];

# Require an established Golden Cross

def EstablishedTrend =
Sum(SMA50 > SMA200,20) == 20;

def TrendScore =
if Trend and EstablishedTrend
then TrendWeight
else 0;

#=============================================================
# STRUCTURE
#=============================================================

def Resistance =
Highest(high[1],20);

def Support =
Lowest(low[1],20);

# Healthy Pullback

def Pullback =
low <= SMA21 * 1.02 and
close > SMA21;

# Retest after breakout

def Retest =
low <= Resistance * 1.01 and
close > Resistance;

# Controlled Breakout

def Breakout =
close > Resistance and
close <= SMA50 * 1.08;

def Structure =
Pullback or
Retest or
Breakout;

def StructureScore =
if Structure
then StructureWeight
else 0;

#=============================================================
# LINDA STOCHASTIC
#=============================================================

input KLength = 8;
input DLength = 5;

def LL = Lowest(low,KLength);
def HH = Highest(high,KLength);

def K =
if HH != LL
then 100 * (close - LL) / (HH - LL)
else 50;

def D = Average(K,DLength);

def Momentum =
K < 35 and
K crosses above D and
D > D[1] and
K > K[1];

def MomentumScore =
if Momentum
then MomentumWeight
else 0;

#=============================================================
# PARTICIPATION
#=============================================================

def RVOL =
volume / Average(volume,50);

def ATR14 =
Average(TrueRange(high,close,low),14);

def ATR50 =
Average(ATR14,50);

def Participation =
RVOL > 1.10 and
ATR14 > ATR50 and
volume > volume[1];

def ParticipationScore =
if Participation
then ParticipationWeight
else 0;

#=============================================================
# EXTENSION FILTER
#=============================================================

def NotExtended =
close <= SMA50 * 1.08;

#=============================================================
# TOTAL SCORE
#=============================================================

def Score =
TrendScore +
StructureScore +
MomentumScore +
ParticipationScore +
QualityScore;

#=============================================================
# FINAL SCAN
#=============================================================

plot scan =
Trend and
EstablishedTrend and
Quality and
NotExtended and
Score >= MinScore;
 
Changing the weights some and adding a different extension range to catch more techs
Code:
#=========================================================
# INSTITUTIONAL SWING SCANNER V3.0
# PART 1
# ANTWERKS
#=========================================================

#==========================
# USER INPUTS
#==========================

input MinimumScore = 75;

input MinPrice = 20;
input MinAvgVolume = 3000000;
input MinDollarVolume = 100000000;

input TrendWeight = 40;
input StructureWeight = 25;
input MomentumWeight = 15;
input LeadershipWeight = 10;
input QualityWeight = 10;

input EMAFast = 21;
input SMAMid = 50;
input SMASlow = 200;

input ExtensionLimit = 0.15;

input LindaLength = 8;
input LindaSmooth = 5;

input RVOLLength = 50;
input ATRLength = 14;

#==========================
# MOVING AVERAGES
#==========================

def EMA21 = ExpAverage(close, EMAFast);
def SMA50 = Average(close, SMAMid);
def SMA200 = Average(close, SMASlow);

#==========================
# QUALITY ENGINE
#==========================

def AvgVolume50 = Average(volume,50);

def DollarVolume =
AvgVolume50 * close;

def QualityScore =

(if close > MinPrice then 3 else 0)

+

(if AvgVolume50 > MinAvgVolume then 4 else 0)

+

(if DollarVolume > MinDollarVolume then 3 else 0);

#==========================
# TREND ENGINE
#==========================

def TrendScore =

(if close > SMA200 then 10 else 0)

+

(if SMA50 > SMA200 then 10 else 0)

+

(if EMA21 > SMA50 then 8 else 0)

+

(if SMA50 > SMA50[5] then 5 else 0)

+

(if SMA200 > SMA200[10] then 4 else 0)

+

(if Sum(SMA50 > SMA200,20) == 20 then 3 else 0);

#==========================
# STRUCTURE ENGINE V2
#==========================

def Distance50 = AbsValue((close - SMA50) / SMA50);

#--------------------------------
# Extension Score (8 Points)
#--------------------------------

def ExtensionScore =
if Distance50 <= .05 then 8
else if Distance50 <= .10 then 6
else if Distance50 <= .15 then 4
else if Distance50 <= .20 then 2
else 0;

#--------------------------------
# Position Score (7 Points)
#--------------------------------

def PositionScore =
if close > EMA21 then 7
else if close > SMA50 then 5
else if close > SMA200 then 2
else 0;

#--------------------------------
# EMA Alignment (5 Points)
#--------------------------------

def AlignmentScore =
if EMA21 > SMA50 and SMA50 > SMA200 then 5
else if SMA50 > SMA200 then 3
else 0;

#--------------------------------
# Trend Health (5 Points)
#--------------------------------

def TrendHealth =
(close > close[5]) +
(close > close[10]) +
(SMA50 > SMA50[5]) +
(EMA21 > EMA21[5]) +
(high > high[10]);

def TrendHealthScore =
TrendHealth;

#--------------------------------
# Final Structure Score
#--------------------------------

def StructureScore =
ExtensionScore +
PositionScore +
AlignmentScore +
TrendHealthScore;

#==========================
# MOMENTUM ENGINE
#==========================

def LL =
Lowest(low,LindaLength);

def HH =
Highest(high,LindaLength);

def FastK =

if HH != LL
then 100 * (close - LL) / (HH - LL)
else 50;

def FastD =
Average(FastK,LindaSmooth);

def MomentumScore =

(if FastK < 40 then 5 else 0)

+

(if FastK crosses above FastD then 5 else 0)

+

(if FastD > FastD[1] then 3 else 0)

+

(if FastK > FastK[1] then 2 else 0);

#==========================
# LEADERSHIP ENGINE
#==========================

def SwamiBull =
reference SwamiRelativePerformance();

def RVOL =
if Average(volume, RVOLLength) != 0
then volume / Average(volume, RVOLLength)
else 0;

def ATR14 =
Average(TrueRange(high, close, low), ATRLength);

def ATR50 =
Average(ATR14, 50);

def SwamiScore =
if SwamiBull then 4 else 0;

def RVOLScore =
if RVOL >= 2.00 then 4
else if RVOL >= 1.50 then 3
else if RVOL >= 1.20 then 2
else if RVOL >= 1.05 then 1
else 0;

def ATRScore =
if ATR14 > ATR50 * 1.20 then 2
else if ATR14 > ATR50 then 1
else 0;

def LeadershipScore =
SwamiScore +
RVOLScore +
ATRScore;

#==========================
# NORMALIZE SCORES
#==========================

def TrendNormalized =
TrendScore;

def StructureNormalized =
StructureScore;

def MomentumNormalized =
MomentumScore;

def LeadershipNormalized =
LeadershipScore;

def QualityNormalized =
QualityScore;

#==========================
# TOTAL INSTITUTIONAL SCORE
#==========================

def TotalScore =

TrendNormalized +

StructureNormalized +

MomentumNormalized +

LeadershipNormalized +

QualityNormalized;

#==========================
# REQUIRED INSTITUTIONAL FILTERS
#==========================

def InstitutionalTrend =
close > SMA200 and
SMA50 > SMA200;

def HealthyStructure =
StructureScore >= 14;

def InstitutionalQuality =
close > MinPrice and
AvgVolume50 > MinAvgVolume;

#==========================
# FINAL SCAN
#==========================

plot scan =
InstitutionalTrend
and HealthyStructure
and InstitutionalQuality
and TotalScore >= MinimumScore;
 
Big issue here- how far of an extension is too far? I am thinking - get the stocks on the scanner and the trader decide after looking at the chart- what is over extension - a quick take:
Overextension guardrail
For a 2 week to 3 month swing, the problem is not only being right on direction. The entry has to be close enough to support that the stop, target, and time window still make sense.

Simple rule- If three or more red flags are present, skip the entry and wait for a reset.
This avoids buying after the easy part of the move has already happened.

Signal:

Overextended reading

Trading decision

Price stretched from trend

Above 20-day avg by 8–12% or above 50-day avg by 15–25%

Do not chase; wait for a pullback or base.

RSI is overheated

RSI 14 above 70; extreme if above 80

Avoid fresh longs unless risk is very small.

Too many ATRs above support

Entry is more than 2 ATR from the 20-day avg or last pivot

Stop is likely too far for a clean swing.

Climax move

Large gap up, wide candle, or volume spike after a fast run

Treat as late-stage buying, not a fresh setup.

Bad reward-to-risk

Logical stop is more than 8–12% below entry or target is less than 2x risk

Pass until the stock resets near structure???

Maybe grade it 0–1 red flags = Tradeable
Setup can be considered if market and sector confirm.

2 red flags = Wait
Use smaller size or wait for a tighter entry.

3 or more red flags = No chase
Overextended for a 2 week to 3 month swing trade.

What to wait for =
Pulls back toward the 20-day or 50-day moving average without breaking trend.

Builds a tight 5–15 session base with volume drying up.

RSI cools back toward 45–60 while price holds higher lows.

A logical stop sits just below support with risk under roughly 6–10%.

thoughts????
 
Big issue here- how far of an extension is too far? I am thinking - get the stocks on the scanner and the trader decide after looking at the chart- what is over extension - a quick take:
Overextension guardrail
For a 2 week to 3 month swing, the problem is not only being right on direction. The entry has to be close enough to support that the stop, target, and time window still make sense.

Simple rule- If three or more red flags are present, skip the entry and wait for a reset.
This avoids buying after the easy part of the move has already happened.

Signal:

Overextended reading

Trading decision

Price stretched from trend

Above 20-day avg by 8–12% or above 50-day avg by 15–25%

Do not chase; wait for a pullback or base.

RSI is overheated

RSI 14 above 70; extreme if above 80

Avoid fresh longs unless risk is very small.

Too many ATRs above support

Entry is more than 2 ATR from the 20-day avg or last pivot

Stop is likely too far for a clean swing.

Climax move

Large gap up, wide candle, or volume spike after a fast run

Treat as late-stage buying, not a fresh setup.

Bad reward-to-risk

Logical stop is more than 8–12% below entry or target is less than 2x risk

Pass until the stock resets near structure???

Maybe grade it 0–1 red flags = Tradeable
Setup can be considered if market and sector confirm.

2 red flags = Wait
Use smaller size or wait for a tighter entry.

3 or more red flags = No chase
Overextended for a 2 week to 3 month swing trade.

What to wait for =
Pulls back toward the 20-day or 50-day moving average without breaking trend.

Builds a tight 5–15 session base with volume drying up.

RSI cools back toward 45–60 while price holds higher lows.

A logical stop sits just below support with risk under roughly 6–10%.

thoughts????
OK NO- EXTENSION ALTHOUGH IMPORTANT is not the straw that breaks the camels back yes we need a filter to weed out some stocks but not make it a hard filter less we miss a continuation of a strong performing stock - ok one more - let me think
 
ok Good names but still not exactly what I would want -
I think the next evolution shouldn't be another filter
Instead, it should be a new scoring component.

Rather than asking: "Is it extended?"

Ask: "How much upside structure is still intact?"
That's a very different measurement.

We can score things like:

higher-high sequence intact
higher-low sequence intact
distance from the last major breakout
trend slope
acceleration versus exhaustion

That rewards stocks that are still building, not just those that are near moving averages.
(I think the ones in RED are the most interesting ones)

latest:
Code:
#=========================================================
# INSTITUTIONAL SWING OPPORTUNITY SCANNER V6
# LONG ONLY
# 2-12 WEEK SWING CANDIDATES
# antwerks
#=========================================================

input MinimumScore = 82;

input MinPrice = 20;
input MinAvgVolume = 3000000;
input MinDollarVolume = 100000000;

input FastEMALength = 21;
input MidSMALength = 50;
input SlowSMALength = 200;

input LindaLength = 8;
input LindaSmooth = 5;

input StructureLookback = 20;
input VolumeLength = 50;
input ATRLength = 14;

#=========================================================
# MOVING AVERAGES
#=========================================================

def EMA21 = ExpAverage(close, FastEMALength);
def SMA50 = Average(close, MidSMALength);
def SMA200 = Average(close, SlowSMALength);

#=========================================================
# QUALITY ENGINE - 5 POINTS
#=========================================================

def AvgVol = Average(volume, VolumeLength);
def DollarVol = AvgVol * close;

def QualityScore =
    (if close > MinPrice then 2 else 0) +
    (if AvgVol > MinAvgVolume then 2 else 0) +
    (if DollarVol > MinDollarVolume then 1 else 0);

#=========================================================
# TREND ENGINE - 40 POINTS
#=========================================================

def TrendScore =
    (if close > SMA200 then 8 else 0) +
    (if SMA50 > SMA200 then 8 else 0) +
    (if EMA21 > SMA50 then 8 else 0) +
    (if EMA21 > EMA21[5] then 6 else 0) +
    (if SMA50 > SMA50[10] then 6 else 0) +
    (if SMA200 > SMA200[20] then 4 else 0);

#=========================================================
# STRUCTURE ENGINE - 30 POINTS
#=========================================================

def RecentHigh = Highest(high, StructureLookback);
def PriorHigh = Highest(high[StructureLookback], StructureLookback);

def RecentLow = Lowest(low, StructureLookback);
def PriorLow = Lowest(low[StructureLookback], StructureLookback);

def HigherHigh = RecentHigh > PriorHigh;
def HigherLow = RecentLow > PriorLow;

def CloseNearHigh =
    close >= Highest(high, StructureLookback) * 0.96;

def HoldingTrend =
    close > EMA21 or close > SMA50;

def StrongStack =
    close > EMA21 and EMA21 > SMA50 and SMA50 > SMA200;

def ConstructiveBase =
    low > Lowest(low, 10)[10] and close > SMA50;

def StructureScore =
    (if HigherHigh then 7 else 0) +
    (if HigherLow then 8 else 0) +
    (if CloseNearHigh then 5 else 0) +
    (if HoldingTrend then 4 else 0) +
    (if StrongStack then 4 else 0) +
    (if ConstructiveBase then 2 else 0);

#=========================================================
# LINDA MOMENTUM ENGINE - 15 POINTS
#=========================================================

def LL = Lowest(low, LindaLength);
def HH = Highest(high, LindaLength);

def FastK =
    if HH != LL
    then 100 * (close - LL) / (HH - LL)
    else 50;

def FastD = Average(FastK, LindaSmooth);

def MomentumScore =
    (if FastK > FastD then 4 else 0) +
    (if FastK > FastK[1] then 4 else 0) +
    (if FastD > FastD[1] then 3 else 0) +
    (if FastK < 80 then 2 else 0) +
    (if FastK crosses above FastD then 2 else 0);

#=========================================================
# PARTICIPATION ENGINE - 10 POINTS
#=========================================================

def RVOL =
    if AvgVol != 0
    then volume / AvgVol
    else 0;

def ATR = Average(TrueRange(high, close, low), ATRLength);
def ATRBase = Average(ATR, 50);

def ParticipationScore =
    (if RVOL >= 1.50 then 4
     else if RVOL >= 1.20 then 3
     else if RVOL >= 1.05 then 2
     else 0) +
    (if ATR > ATRBase then 3 else 0) +
    (if volume > volume[1] then 3 else 0);

#=========================================================
# LIGHT EXTENSION WARNING - NOT A HARD FILTER
#=========================================================

def ExtremeExtension =
    close > EMA21 * 1.25;

def ExtensionPenalty =
    if ExtremeExtension then 5 else 0;

#=========================================================
# TOTAL SCORE
#=========================================================

def TotalScore =
    TrendScore +
    StructureScore +
    MomentumScore +
    ParticipationScore +
    QualityScore -
    ExtensionPenalty;

#=========================================================
# BASE REQUIREMENTS
#=========================================================

def InstitutionalTrend =
    close > SMA200 and
    SMA50 > SMA200;

def ConstructiveStructure =
    StructureScore >= 18;

def TradableQuality =
    close > MinPrice and
    AvgVol > MinAvgVolume;

#=========================================================
# FINAL SCAN
#=========================================================

plot scan =
    InstitutionalTrend and
    ConstructiveStructure and
    TradableQuality and
    TotalScore >= MinimumScore;

Stocks returned 06/27/2026
 
Last edited:
Just to be clear - No scanner can guarantee moves. It's all about getting put in front of the best opportunities as fast as possible. Finding potential stocks and doing your research to make the decision is what it's about.
 

Join useThinkScript to post your question to a community of 21,000+ developers and traders.

Similar threads

Not the exact question you're looking for?

Start a new thread and receive assistance from our community.

87k+ Posts
1117 Online
Create Post

Similar threads

Similar threads

The Market Trading Game Changer

Join 2,500+ subscribers inside the useThinkScript VIP Membership Club
  • Exclusive indicators
  • Proven strategies & setups
  • Private Discord community
  • ‘Buy The Dip’ signal alerts
  • Exclusive members-only content
  • Add-ons and resources
  • 1 full year of unlimited support

Frequently Asked Questions

What is useThinkScript?

useThinkScript is the #1 community of stock market investors using indicators and other tools to power their trading strategies. Traders of all skill levels use our forums to learn about scripting and indicators, help each other, and discover new ways to gain an edge in the markets.

How do I get started?

We get it. Our forum can be intimidating, if not overwhelming. With thousands of topics, tens of thousands of posts, our community has created an incredibly deep knowledge base for stock traders. No one can ever exhaust every resource provided on our site.

If you are new, or just looking for guidance, here are some helpful links to get you started.

What are the benefits of VIP Membership?
VIP members get exclusive access to these proven and tested premium indicators: Buy the Dip, Advanced Market Moves 2.0, Take Profit, and Volatility Trading Range. In addition, VIP members get access to over 50 VIP-only custom indicators, add-ons, and strategies, private VIP-only forums, private Discord channel to discuss trades and strategies in real-time, customer support, trade alerts, and much more. Learn all about VIP membership here.
How can I access the premium indicators?
To access the premium indicators, which are plug and play ready, sign up for VIP membership here.
Back
Top