Swing Trading MTF + DSR + Momentum Indicator: Introduction and How to Use
Introduction
Swing trading is a popular trading approach for traders who want to capture price movements over several days or weeks without constantly monitoring the market. However, identifying the right entry point can be challenging when the market moves between bullish, bearish, and sideways phases.
The Swing Trading MTF + DSR + Momentum Indicator is a custom TradingView Pine Script indicator designed to help traders analyse market trends, dynamic support and resistance levels, price structure, and momentum in one place.
The indicator combines Multi-Timeframe (MTF) Trend Analysis, Dynamic Support and Resistance (DSR), Market Structure, Momentum Engine 1, Momentum Engine 2, and a directional Bias Score. Its dashboard displays the trend conditions across Monthly, Weekly, Daily, 1-Hour, 15-Minute, and 5-Minute timeframes.
By combining these technical factors, traders can identify potential bullish and bearish setups, observe important price levels, and assess whether different market conditions are aligned.
Important: This is an independently developed, FF-style approximation based on publicly described trading concepts. It is not the official Financial Frontline indicator and does not reproduce its proprietary formulas.
Key Features of the Indicator
1. Multi-Timeframe Trend Analysis
Multi-timeframe analysis helps traders understand the broader market direction before considering a trade on their preferred timeframe.
The dashboard displays six timeframes:
Monthly
Weekly
Daily
1 Hour
15 Minutes
5 Minutes
Green indicates a bullish trend, red indicates a bearish trend, and grey indicates a neutral trend.
For swing trading on the 1-hour chart, traders can examine the Monthly, Weekly, and Daily trends alongside the 1-hour trend. The 15-minute and 5-minute readings provide additional information about shorter-term market conditions.
2. Dynamic Support and Resistance
The indicator plots a purple Dynamic Support and Resistance line using an EMA and an ATR-based offset. It also displays two reference levels, called Level A and Level B.
These levels help traders observe how price behaves around potential support and resistance areas.
A move above a resistance level may indicate bullish strength, while a move below support may indicate bearish pressure. However, breakouts can fail, so traders should confirm them using price action and other relevant conditions.
3. Market Structure Identification
Market structure is assessed using two Exponential Moving Averages (EMAs).
Bullish structure: Price is above the fast EMA, and the fast EMA is above the slow EMA.
Bearish structure: Price is below the fast EMA, and the fast EMA is below the slow EMA.
Neutral or mixed structure: Neither condition is satisfied.
The chart background changes to a light green or red shade when the corresponding market structure is identified.
4. Momentum Engine 1
Momentum Engine 1 identifies candles with directional strength using a two-candle combination and the size of the current candle's body relative to the Average True Range (ATR).
A strong bullish combination highlights potential upward momentum, while a strong bearish combination highlights potential downward momentum.
These shaded regions help traders identify periods of directional price movement. They do not guarantee that the movement will continue.
5. Momentum Engine 2
Momentum Engine 2 uses the Relative Strength Index (RSI) to identify momentum changes.
A bullish circle appears when RSI crosses above 55 and the optional volume condition is satisfied.
A bearish circle appears when RSI crosses below 45 and the optional volume condition is satisfied.
When enabled, the volume filter requires volume to be above its moving average. These markers provide additional confirmation rather than standalone buy or sell instructions.
6. Directional Bias Score
The Bias Score measures how many of ten programmed bullish or bearish conditions are satisfied.
The conditions include six timeframe trends, market structure, a price-structure breakout, Momentum Engine 1, and Momentum Engine 2.
The score ranges from 0 to 100 in increments of 10. A higher directional score means more of the conditions for that direction are satisfied.
For example, a bullish score of 80 means eight of the ten bullish conditions are true. It does not mean that the trade has an 80% probability of success.
7. Automated Chart Signals and Alerts
When the programmed conditions align, the indicator can display LONG or SHORT markers on the chart.
The script also supports TradingView alerts for bullish and bearish swing setups, structure breakouts, and momentum confirmations.
These alerts help traders monitor potential opportunities without watching every candle continuously.
How to Use the Swing Trading Indicator
Step 1: Open TradingView
Visit TradingView and open the chart of the stock you want to analyse.
Select a liquid stock that suits your trading approach. Before trading, check its liquidity, volatility, recent price action, and relevant market conditions.
Step 2: Add the Pine Script Indicator
Open the Pine Editor at the bottom of the TradingView chart.
Paste the Swing Trading MTF + DSR + Momentum Pine Script code into the editor, save the script, and click Add to chart.
If TradingView displays a compilation error, correct it before relying on the indicator.
Step 3: Select the Appropriate Chart Timeframe
For the swing-trading approach described on this page, start with the 1-hour timeframe.
Use the higher-timeframe dashboard to assess the broader trend. The Monthly, Weekly, and Daily readings can help you understand whether the larger trend supports your trading idea.
The 15-minute and 5-minute readings offer additional short-term context but should not automatically override the broader trend.
Step 4: Read the MTF Dashboard
Check the trend status shown for each timeframe.
When Monthly, Weekly, Daily, and 1-Hour readings are green, the broader trend alignment is bullish. When they are red, the broader trend alignment is bearish.
Mixed readings suggest that different timeframes are moving in different directions. In such cases, you may prefer to wait for clearer conditions rather than force a trade.
Remember that higher-timeframe readings in this script use completed candles, so they may differ from indicators that use developing candles.
Step 5: Observe Dynamic Support and Resistance
Watch how price interacts with the purple line and the displayed reference levels.
A breakout above a relevant resistance level can indicate buying strength. A breakdown below support can indicate selling pressure.
Look for a decisive candle close and consider whether the move is supported by market structure and momentum. Avoid assuming that every breakout will produce a sustained trend.
Step 6: Check Market Structure and Momentum
Before considering an entry, assess the chart background and momentum markers.
For a potential bullish setup, look for bullish market structure, a meaningful upward price move, and supportive momentum. For a potential bearish setup, look for the corresponding bearish conditions.
The two momentum engines use different calculations, so they may not always appear together. Their absence does not necessarily mean that the market has no opportunity.
Step 7: Review the Bias Score
Use the Bias Score as a summary of the programmed conditions.
A higher bullish score suggests stronger alignment among bullish factors, while a higher bearish score suggests stronger alignment among bearish factors.
The default minimum bias setting is 70. This is a configurable threshold, not a proven optimum. You should evaluate different settings through historical testing before using them in live trading.
Step 8: Wait for a Valid Signal
The script requires several conditions to align before displaying a LONG or SHORT signal. These include higher-timeframe alignment, market structure, a breakout of a confirmed swing level, momentum confirmation, and the minimum bias threshold.
Because the conditions are strict, signals may be infrequent. A missing signal does not necessarily mean that a stock is unsuitable for swing trading.
The indicator's LONG and SHORT labels are chart-analysis signals, not personalised trading recommendations.
Step 9: Plan Risk Management
Before entering any trade, decide how much capital you are willing to risk.
Consider the following:
Identify a logical stop-loss level based on price structure and volatility.
Calculate position size according to your predefined risk limit.
Establish a realistic profit target and assess the potential reward relative to the risk.
Account for brokerage charges, slippage, liquidity, and overnight gaps.
Avoid increasing position size simply because the Bias Score is high.
The current indicator does not automatically calculate a tested stop-loss, profit target, or position size. These decisions require a separate risk-management process.
Step 10: Set TradingView Alerts
Open the TradingView alert panel and select the indicator as the alert source.
Choose the appropriate condition, such as Swing Long, Swing Short, Bullish Structure Break, or Bearish Structure Break. Configure the notification method and alert frequency according to your needs.
Test the alert setup before relying on it. An alert only notifies you when its programmed condition is met; it does not execute or manage a trade automatically.
Recommended Settings for Swing Trading
The following are the default settings in this version of the script, not settings proven to be optimal.
| Setting | Default Value |
|---|---|
| Fast EMA | 20 |
| Slow EMA | 50 |
| ATR Length | 14 |
| Structure Pivot Length | 5 |
| Dynamic Level Lookback | 20 |
| ATR Offset | 1.0 |
| Engine 1 Body / ATR | 0.6 |
| RSI Length | 14 |
| Volume Average Length | 20 |
| Minimum Bias Score | 70 |
These settings can be adjusted for different stocks and market conditions. Test any changes on historical data and paper trade before considering live use.
Advantages of the Indicator
Brings multiple timeframe readings into one dashboard.
Combines trend, price structure, and momentum information.
Displays dynamic reference levels on the chart.
Provides a directional score to summarise programmed conditions.
Supports TradingView alerts for selected events.
Can help traders develop a more consistent chart-analysis routine.
Limitations You Should Understand
No technical indicator can predict every market movement. False breakouts, sideways markets, sudden news, low liquidity, and overnight price gaps can all affect trading results.
The Bias Score is a count of conditions, not a statistical win probability. The momentum calculations and dynamic levels in this script are simplified approximations and may differ from other indicators with similar names.
The script is an indicator rather than a fully backtested strategy. It does not establish that its signals are profitable, and it does not automatically manage trade exits or risk.
Frequently Asked Questions
1. What is the Swing Trading MTF + DSR + Momentum Indicator?
It is a TradingView Pine Script indicator that combines six timeframe trend readings, EMA-based market structure, dynamic reference levels, two momentum conditions, a directional Bias Score, and chart signals.
2. Which timeframe is best for using this indicator?
The indicator is designed with a 1-hour swing-trading chart in mind. Traders can use the Monthly, Weekly, and Daily readings for broader context while observing shorter timeframes for additional information. The most suitable timeframe depends on the trader's approach and should be tested.
3. What does a Bias Score of 100 mean?
A directional score of 100 means all ten programmed conditions for that direction are satisfied on the current calculation. It does not guarantee a profitable trade or indicate a 100% chance of success.
4. Does a LONG signal mean I should immediately buy?
No. A LONG signal indicates that the script's programmed bullish conditions are aligned. Review the price action, liquidity, stop-loss placement, potential reward, and overall market conditions before making any trading decision.
5. Can I use this indicator for intraday trading?
The script can be applied to other chart timeframes, but its conditions were designed around swing-trading concepts and include higher-timeframe alignment. Intraday use requires separate testing and may need different settings.
Conclusion
The Swing Trading MTF + DSR + Momentum Indicator provides a structured way to study trends, support and resistance, market structure, and momentum on TradingView. Its multi-timeframe dashboard and Bias Score can help traders organise their analysis and identify potential setups without relying on a single indicator signal.
For best results, understand how each component works, test the indicator on historical charts, and follow a consistent risk-management plan. Treat every signal as a potential trading opportunity that requires independent evaluation rather than a guarantee of future performance.
Disclaimer: This page is for educational and informational purposes only and does not constitute investment advice or a recommendation to buy or sell any security. Trading involves financial risk. Past performance and indicator signals do not guarantee future results. Consult a SEBI-registered investment adviser where appropriate and make decisions according to your own financial circumstances.
=============================
to find stocks use this criteria in chartink.com
1 Latest Close Greater than Latest EMA 20
2 Latest EMA 20 Greater than Latest EMA 50
3 Latest RSI (14) Greater than 55
4 Latest Close Greater than Previous Close
5 Latest Volume Greater than 20-day average volume
========================================================
Tradingview Indicator
//@version=6
indicator("FF Style Momentum Dashboard", overlay=true, max_labels_count=500)
//--------------------------------------------------
// INPUTS
//--------------------------------------------------
fastLen = input.int(20, "Fast EMA", minval=1)
slowLen = input.int(50, "Slow EMA", minval=1)
atrLen = input.int(14, "ATR Length", minval=1)
pivotLen = input.int(5, "Pivot Strength", minval=1)
levelLen = input.int(20, "Support/Resistance Lookback", minval=2)
atrOffset = input.float(1.0, "Dynamic Level ATR Offset", minval=0.1, step=0.1)
bodyAtrMult = input.float(0.6, "Momentum 1: Body / ATR", minval=0.1, step=0.1)
rsiLen = input.int(14, "RSI Length", minval=1)
volLen = input.int(20, "Volume Average Length", minval=1)
useVolume = input.bool(true, "Require Above-Average Volume for M2")
minBias = input.int(70, "Minimum Bias Score", minval=10, maxval=100)
showDashboard = input.bool(true, "Show Dashboard")
showLevels = input.bool(true, "Show Dynamic Levels")
showSignals = input.bool(true, "Show Momentum Signals")
showStructure = input.bool(true, "Show Market Structure Background")
//--------------------------------------------------
// MULTI-TIMEFRAME TREND
// Uses previous completed candle for higher-timeframe
// values to reduce repainting.
//--------------------------------------------------
fTrend() =>
ema50 = ta.ema(close, 50)
close > ema50 and ema50 > ema50[1] ? 1 :
close < ema50 and ema50 < ema50[1] ? -1 : 0
fConfirmedTrend(tf) =>
request.security(syminfo.tickerid, tf, fTrend()[1],
gaps=barmerge.gaps_off,
lookahead=barmerge.lookahead_on)
trendM = fConfirmedTrend("1M")
trendW = fConfirmedTrend("1W")
trendD = fConfirmedTrend("1D")
trend1H = fConfirmedTrend("60")
trend15M = fConfirmedTrend("15")
trend5M = fConfirmedTrend("5")
//--------------------------------------------------
// CORE INDICATORS
//--------------------------------------------------
emaFast = ta.ema(close, fastLen)
emaSlow = ta.ema(close, slowLen)
atr = ta.atr(atrLen)
rsiVal = ta.rsi(close, rsiLen)
volAvg = ta.sma(volume, volLen)
bullStructure = close > emaFast and emaFast > emaSlow
bearStructure = close < emaFast and emaFast < emaSlow
//--------------------------------------------------
// CONFIRMED SWING LEVELS
//--------------------------------------------------
pivotHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivotLow = ta.pivotlow(low, pivotLen, pivotLen)
var float lastPivotHigh = na
var float lastPivotLow = na
if not na(pivotHigh)
lastPivotHigh := pivotHigh
if not na(pivotLow)
lastPivotLow := pivotLow
bullBreak = not na(lastPivotHigh) and ta.crossover(close, lastPivotHigh)
bearBreak = not na(lastPivotLow) and ta.crossunder(close, lastPivotLow)
aboveSwingHigh = not na(lastPivotHigh) and close > lastPivotHigh
belowSwingLow = not na(lastPivotLow) and close < lastPivotLow
//--------------------------------------------------
// DYNAMIC SUPPORT / RESISTANCE
//--------------------------------------------------
rollingSupport = ta.lowest(low, levelLen)
rollingResistance = ta.highest(high, levelLen)
levelA = close >= emaSlow ? rollingSupport : rollingResistance
levelB = close >= emaSlow ? emaSlow - atr * atrOffset : emaSlow + atr * atrOffset
plot(showLevels ? levelA : na, "Level A: Rolling S/R",
color=color.purple, linewidth=2, style=plot.style_stepline)
plot(showLevels ? levelB : na, "Level B: Dynamic EMA/ATR",
color=color.fuchsia, linewidth=2)
plot(emaFast, "EMA 20", color=color.new(color.teal, 35))
plot(emaSlow, "EMA 50", color=color.new(color.orange, 20))
//--------------------------------------------------
// MOMENTUM ENGINE 1 — CANDLE MOMENTUM
// Approximation: two same-direction candles and
// current candle body at least the selected ATR size.
//--------------------------------------------------
bodySize = math.abs(close - open)
bullCandle = close > open
bearCandle = close < open
engine1Bull = bullCandle and close[1] > open[1] and bodySize >= atr * bodyAtrMult
engine1Bear = bearCandle and close[1] < open[1] and bodySize >= atr * bodyAtrMult
//--------------------------------------------------
// MOMENTUM ENGINE 2 — RSI + OPTIONAL VOLUME
// Approximation; not the original proprietary formula.
//--------------------------------------------------
volumeOK = not useVolume or (not na(volAvg) and volume > volAvg)
engine2Bull = ta.crossover(rsiVal, 55) and volumeOK
engine2Bear = ta.crossunder(rsiVal, 45) and volumeOK
//--------------------------------------------------
// MARKET STRUCTURE BACKGROUND
//--------------------------------------------------
bgcolor(showStructure and bullStructure ? color.new(color.green, 91) : na,
title="Bullish Structure")
bgcolor(showStructure and bearStructure ? color.new(color.red, 91) : na,
title="Bearish Structure")
//--------------------------------------------------
// MOMENTUM MARKERS
//--------------------------------------------------
plotshape(showSignals and engine1Bull, title="M1 Bullish",
style=shape.triangleup, location=location.belowbar,
color=color.lime, size=size.small, text="M1")
plotshape(showSignals and engine1Bear, title="M1 Bearish",
style=shape.triangledown, location=location.abovebar,
color=color.red, size=size.small, text="M1")
plotshape(showSignals and engine2Bull, title="M2 Bullish",
style=shape.circle, location=location.belowbar,
color=color.yellow, size=size.small, text="M2")
plotshape(showSignals and engine2Bear, title="M2 Bearish",
style=shape.circle, location=location.abovebar,
color=color.orange, size=size.small, text="M2")
plotshape(bullBreak, title="Bullish Swing Breakout",
style=shape.labelup, location=location.belowbar,
color=color.green, textcolor=color.white, text="BO",
size=size.tiny)
plotshape(bearBreak, title="Bearish Swing Breakdown",
style=shape.labeldown, location=location.abovebar,
color=color.red, textcolor=color.white, text="BD",
size=size.tiny)
//--------------------------------------------------
// BIAS SCORE — 10 COMPONENTS, 10 POINTS EACH
//--------------------------------------------------
bullCount =
(trendM == 1 ? 1 : 0) +
(trendW == 1 ? 1 : 0) +
(trendD == 1 ? 1 : 0) +
(trend1H == 1 ? 1 : 0) +
(trend15M == 1 ? 1 : 0) +
(trend5M == 1 ? 1 : 0) +
(bullStructure ? 1 : 0) +
(aboveSwingHigh ? 1 : 0) +
(engine1Bull ? 1 : 0) +
(engine2Bull ? 1 : 0)
bearCount =
(trendM == -1 ? 1 : 0) +
(trendW == -1 ? 1 : 0) +
(trendD == -1 ? 1 : 0) +
(trend1H == -1 ? 1 : 0) +
(trend15M == -1 ? 1 : 0) +
(trend5M == -1 ? 1 : 0) +
(bearStructure ? 1 : 0) +
(belowSwingLow ? 1 : 0) +
(engine1Bear ? 1 : 0) +
(engine2Bear ? 1 : 0)
biasScore = math.max(bullCount, bearCount) * 10
biasDirection = bullCount > bearCount ? 1 :
bearCount > bullCount ? -1 : 0
//--------------------------------------------------
// SETUPS
//--------------------------------------------------
higherBull = trendM == 1 and trendW == 1 and trendD == 1 and trend1H == 1
higherBear = trendM == -1 and trendW == -1 and trendD == -1 and trend1H == -1
longSetup = higherBull and bullStructure and bullBreak and
(engine1Bull or engine2Bull) and bullCount * 10 >= minBias and
barstate.isconfirmed
shortSetup = higherBear and bearStructure and bearBreak and
(engine1Bear or engine2Bear) and bearCount * 10 >= minBias and
barstate.isconfirmed
plotshape(longSetup, title="LONG Setup",
style=shape.labelup, location=location.belowbar,
color=color.green, textcolor=color.white, text="LONG",
size=size.normal)
plotshape(shortSetup, title="SHORT Setup",
style=shape.labeldown, location=location.abovebar,
color=color.maroon, textcolor=color.white, text="SHORT",
size=size.normal)
// Data-window outputs for inspection and supported scanners.
plot(biasScore, "Bias Score", display=display.data_window)
plot(biasDirection, "Bias Direction: 1 Bull / -1 Bear",
display=display.data_window)
plot(longSetup ? 1 : 0, "Long Setup (1 = Yes)",
display=display.data_window)
plot(shortSetup ? 1 : 0, "Short Setup (1 = Yes)",
display=display.data_window)
plot(engine1Bull ? 1 : engine1Bear ? -1 : 0,
"Momentum Engine 1", display=display.data_window)
plot(engine2Bull ? 1 : engine2Bear ? -1 : 0,
"Momentum Engine 2", display=display.data_window)
//--------------------------------------------------
// DASHBOARD
//--------------------------------------------------
fTrendText(value) =>
value == 1 ? "BULL" : value == -1 ? "BEAR" : "NEUTRAL"
fTrendColor(value) =>
value == 1 ? color.new(color.green, 15) :
value == -1 ? color.new(color.red, 15) :
color.new(color.gray, 40)
var table dash = table.new(position.top_right, 2, 11,
border_width=1, frame_color=color.gray)
if barstate.islast and showDashboard
table.cell(dash, 0, 0, "FF STYLE DASHBOARD",
bgcolor=color.navy, text_color=color.white)
table.cell(dash, 1, 0, syminfo.ticker,
bgcolor=color.navy, text_color=color.white)
table.cell(dash, 0, 1, "Timeframe")
table.cell(dash, 1, 1, "Trend")
table.cell(dash, 0, 2, "Monthly")
table.cell(dash, 1, 2, fTrendText(trendM), bgcolor=fTrendColor(trendM), text_color=color.white)
table.cell(dash, 0, 3, "Weekly")
table.cell(dash, 1, 3, fTrendText(trendW), bgcolor=fTrendColor(trendW), text_color=color.white)
table.cell(dash, 0, 4, "Daily")
table.cell(dash, 1, 4, fTrendText(trendD), bgcolor=fTrendColor(trendD), text_color=color.white)
table.cell(dash, 0, 5, "1 Hour")
table.cell(dash, 1, 5, fTrendText(trend1H), bgcolor=fTrendColor(trend1H), text_color=color.white)
table.cell(dash, 0, 6, "15 Minute")
table.cell(dash, 1, 6, fTrendText(trend15M), bgcolor=fTrendColor(trend15M), text_color=color.white)
table.cell(dash, 0, 7, "5 Minute")
table.cell(dash, 1, 7, fTrendText(trend5M), bgcolor=fTrendColor(trend5M), text_color=color.white)
table.cell(dash, 0, 8, "Bias Score")
table.cell(dash, 1, 8, str.tostring(biasScore) + "/100",
bgcolor=biasDirection == 1 ? color.green :
biasDirection == -1 ? color.red : color.gray,
text_color=color.white)
table.cell(dash, 0, 9, "Level A / B")
table.cell(dash, 1, 9,
str.tostring(levelA, format.mintick) + " / " +
str.tostring(levelB, format.mintick))
setupText = longSetup ? "LONG" : shortSetup ? "SHORT" :
biasDirection == 1 ? "Bullish watch" :
biasDirection == -1 ? "Bearish watch" : "WAIT"
setupColor = longSetup ? color.green : shortSetup ? color.red :
color.new(color.gray, 25)
table.cell(dash, 0, 10, "Setup")
table.cell(dash, 1, 10, setupText,
bgcolor=setupColor, text_color=color.white)
//--------------------------------------------------
// ALERTS
//--------------------------------------------------
alertcondition(longSetup, title="FF Style LONG",
message="FF-style LONG setup on {{ticker}} at {{close}}")
alertcondition(shortSetup, title="FF Style SHORT",
message="FF-style SHORT setup on {{ticker}} at {{close}}")
alertcondition(engine1Bull, title="Momentum Engine 1 Bullish",
message="M1 bullish momentum on {{ticker}} at {{close}}")
alertcondition(engine1Bear, title="Momentum Engine 1 Bearish",
message="M1 bearish momentum on {{ticker}} at {{close}}")
alertcondition(engine2Bull, title="Momentum Engine 2 Bullish",
message="M2 bullish momentum on {{ticker}} at {{close}}")
alertcondition(engine2Bear, title="Momentum Engine 2 Bearish",
message="M2 bearish momentum on {{ticker}} at {{close}}")
alertcondition(bullBreak, title="Bullish Swing Breakout",
message="Bullish swing breakout on {{ticker}} at {{close}}")
alertcondition(bearBreak, title="Bearish Swing Breakdown",
message="Bearish swing breakdown on {{ticker}} at {{close}}")


