๐ Ultimate Trading Dashboard: EMA Crossover + ADX Filter + MTF Scanner
Welcome to the most advanced TradingView indicator script for Indian Stock Market Traders. If you trade NIFTY, BANKNIFTY, or F&O Stocks, this tool is designed to solve your biggest problem: Analysis Paralysis.
Instead of opening 10 different tabs to check trends, this indicator brings everything to a single screen. It combines Trend Following (EMA), Momentum (ADX), and Multi-Timeframe Analysis into one powerful dashboard.
Need a Custom Strategy or Modifications?
We build professional Pine Script indicators tailored to your needs.
๐ฒ WhatsApp: 9713466747๐ฅ Why This Indicator is a Game Changer?
Most traders lose money because they trade against the trend or enter during a sideways market. This script fixes that using a triple-confirmation system:
- Confirmation 1 (EMA Crossover): We use EMA 9 and EMA 15. When the fast line crosses the slow line, it signals a potential entry.
- Confirmation 2 (The ADX Filter): This is the secret sauce. A crossover is useless if the market has no power. We only generate a signal if ADX is greater than 25. This filters out 70% of fake signals.
- Confirmation 3 (Global Sentiment): The dashboard shows you the trend of 10 major sectors/stocks at once. If NIFTY, BANKNIFTY, and HDFC are all Green, you know the market is Bullish.
๐ Key Features Explained
1. The "Jackpot" Combo Alert
Free TradingView users usually get only 1 alert. This script combines BUY and SELL logic into a single alert condition called "Jackpot Combo".
Logic: It triggers ONLY when a crossover happens AND the trend strength (ADX) is explosive. You get a notification saying: ⚠️ BIG MOVE: Strong Buy/Sell Signal on {{ticker}}! ADX > 25.
2. The Live Market Dashboard
On the right side of your screen, you will see a detailed table tracking 10 symbols (NIFTY, BANKNIFTY, FINNIFTY, IT, AUTO, RELIANCE, etc.).
- LTP & %Chg: Live price tracking.
- RSI: Background changes color if RSI is Overbought (>70) or Oversold (<30).
- SIG (Signal): Shows ๐ฅ B (Buy) or ❌ S (Sell) based on breakout logic.
3. Multi-Timeframe (MTF) Scanner
A small movable panel allows you to see the trend of the current chart across all timeframes: 1m, 5m, 15m, 1H, 4H, Daily, and Weekly. Never trade against the higher timeframe trend again!
4. Auto Support & Resistance Levels
No need to draw lines manually. The script automatically plots:
- PDH (Previous Day High): Important resistance.
- PDL (Previous Day Low): Important support.
- 200 EMA: The ultimate trend filter.
๐ ️ How to Trade with This Tool
For Buying (Call Option / Long):
- Wait for a GREEN Arrow on the chart.
- Check the label: It must say "๐ STRONG BUY" (this means ADX > 25).
- Look at the MTF Dashboard: Ensure 15m and 1H timeframes are also Green.
- Entry above the high of the signal candle. Stoploss below EMA 15.
For Selling (Put Option / Short):
- Wait for a RED Arrow on the chart.
- Check the label: It must say "๐ป STRONG SELL".
- Look at the MTF Dashboard: Ensure higher timeframes are Red.
- Entry below the low of the signal candle.
๐ Download the Premium Pine Script
Enter your User ID and Password below to reveal the source code. Copy the code and paste it into the TradingView Pine Editor.
Restricted Content
This code is exclusive for premium members.
⚠️ Incorrect ID or Password
✅ Code Unlocked Successfully!
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ashishmishraahc
//@version=5
indicator("All-in-One: Full Dashboard + ADX + Combo Alert", overlay=true, max_labels_count=500, max_lines_count=500)
// ==========================================
// ๐น 1. GENERAL SETTINGS
// ==========================================
sizeInput = input.string("Small", "Dashboard Size", options=["Tiny", "Small", "Normal", "Large", "Auto"], group="Display Settings")
textSize = switch sizeInput
"Tiny" => size.tiny
"Small" => size.small
"Normal" => size.normal
"Large" => size.large
=> size.auto
// ==========================================
// ๐น 2. CHART DATA & ALERTS (FREE PLAN FIX)
// ==========================================
chartSym = syminfo.tickerid
[ema9, ema15, vwap, c] = request.security(chartSym, timeframe.period, [ta.ema(close, 9), ta.ema(close, 15), ta.vwap, close])
[dplus, dminus, adxChart] = ta.dmi(14, 14)
// Conditions
buyCond = ta.crossover(ema9, ema15)
sellCond = ta.crossunder(ema9, ema15)
// --- ๐ฅ COMBO ALERT LOGIC ---
// Ye Buy aur Sell dono ko check karega (Free plan ke liye 1 slot)
anyStrongSignal = (buyCond and adxChart > 25) or (sellCond and adxChart > 25)
alertcondition(anyStrongSignal, title="๐ฅ Jackpot Combo Alert", message="⚠️ BIG MOVE: Strong Buy/Sell Signal on {{ticker}}! ADX > 25. Check Chart!")
// Plot Arrows on Chart
var string lastSignal = "NONE"
if buyCond and lastSignal != "BUY"
lastSignal := "BUY"
txt = adxChart > 25 ? "๐ STRONG BUY" : "BUY"
label.new(bar_index, low, txt, color=color.green, style=label.style_label_up, textcolor=color.white, size=size.normal)
if sellCond and lastSignal != "SELL"
lastSignal := "SELL"
txt = adxChart > 25 ? "๐ป STRONG SELL" : "SELL"
label.new(bar_index, high, txt, color=color.red, style=label.style_label_down, textcolor=color.white, size=size.normal)
// Plot Indicators
plot(ema9, title="EMA 9", color=color.green, linewidth=2)
plot(ema15, title="EMA 15", color=color.red, linewidth=2)
plot(vwap, title="VWAP", color=color.new(color.blue, 0), linewidth=2, style=plot.style_line)
// ==========================================
// ๐น 3. FULL DASHBOARD (10 COLUMNS)
// ==========================================
sym1 = input.symbol("NSE:NIFTY", "Symbol 1", group="Symbols")
sym2 = input.symbol("NSE:BANKNIFTY", "Symbol 2", group="Symbols")
sym3 = input.symbol("NSE:CNXFINANCE", "Symbol 3", group="Symbols")
sym4 = input.symbol("NSE:CNXIT", "Symbol 4", group="Symbols")
sym5 = input.symbol("NSE:CNXAUTO", "Symbol 5", group="Symbols")
sym6 = input.symbol("NSE:CNXENERGY", "Symbol 6", group="Symbols")
sym7 = input.symbol("NSE:CNXFMCG", "Symbol 7", group="Symbols")
sym8 = input.symbol("NSE:SBIN", "Symbol 8", group="Symbols")
sym9 = input.symbol("NSE:HDFCBANK", "Symbol 9", group="Symbols")
sym10 = input.symbol("NSE:ICICIBANK", "Symbol 10", group="Symbols")
var table dash = table.new(position.top_right, 10, 12, border_width=1)
if barstate.isfirst
table.cell(dash, 0, 0, "SYM", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 1, 0, "LTP", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 2, 0, "%CHG", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 3, 0, "RSI", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 4, 0, "ADX", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 5, 0, "LEVEL", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 6, 0, "TRND", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 7, 0, "EMA", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 8, 0, "VWAP", text_color=color.white, bgcolor=color.gray, text_size=textSize)
table.cell(dash, 9, 0, "SIG", text_color=color.white, bgcolor=color.gray, text_size=textSize)
var int buyCount = 0
var int sellCount = 0
f_calcAdx() =>
[dp, dm, val] = ta.dmi(14, 14)
val
f_fill_row(row, sym) =>
[cur, e9, e15, vwp, adxVal] = request.security(sym, timeframe.period, [close, ta.ema(close, 9), ta.ema(close, 15), ta.vwap, f_calcAdx()])
[prevClose, prevHigh, prevLow] = request.security(sym, "D", [close[1], high[1], low[1]])
chg = (na(prevClose) or prevClose == 0) ? na : ((cur - prevClose) / prevClose) * 100
chgColor = (not na(chg) and chg >= 0) ? color.green : color.red
rsi = na(cur) ? na : ta.rsi(cur, 14)
adxColor = na(adxVal) ? color.gray : adxVal >= 25 ? color.new(color.green, 0) : adxVal < 20 ? color.gray : color.orange
trendBull = e9 > e15
trend_txt = trendBull ? "UP" : "DN"
trendColor = trendBull ? color.new(color.green, 0) : color.new(color.red, 0)
lvl = ""
sig = "NO"
sigColor = color.orange
if not na(prevHigh) and cur > prevHigh
lvl := "Abv PDH"
sig := "Brk ↑"
sigColor := color.green
else if not na(prevLow) and cur < prevLow
lvl := "Blw PDL"
sig := "Brk ↓"
sigColor := color.red
else
lvl := "Rng"
sig := "Rng"
emaSig = e9 > e15 ? "B" : e9 < e15 ? "S" : "N"
emaColor = e9 > e15 ? color.green : e9 < e15 ? color.red : color.orange
vwapColor = cur > vwp ? color.green : cur < vwp ? color.red : color.gray
finalSig = (sig == "Brk ↑" and emaSig == "B") ? "๐ฅ B" : (sig == "Brk ↓" and emaSig == "S") ? "❌ S" : "⚖️ N"
finalColor = finalSig == "๐ฅ B" ? color.new(color.green, 0) : finalSig == "❌ S" ? color.new(color.red, 0) : color.new(color.orange, 0)
rsiBg = na(rsi) ? color.black : rsi > 70 ? color.new(color.red, 0) : rsi < 30 ? color.new(color.green, 0) : color.rgb(60, 60, 60)
table.cell(dash, 0, row, str.replace_all(sym, "NSE:", ""), text_color=color.white, bgcolor=color.black, text_size=textSize)
table.cell(dash, 1, row, na(cur) ? "-" : str.tostring(cur, format.mintick), text_color=color.white, bgcolor=color.black, text_size=textSize)
table.cell(dash, 2, row, na(chg) ? "-" : str.tostring(chg, "#.1") + "%", text_color=color.white, bgcolor=chgColor, text_size=textSize)
table.cell(dash, 3, row, na(rsi) ? "-" : str.tostring(rsi, "#"), text_color=color.white, bgcolor=rsiBg, text_size=textSize)
table.cell(dash, 4, row, na(adxVal) ? "-" : str.tostring(adxVal, "#"), text_color=color.white, bgcolor=adxColor, text_size=textSize)
table.cell(dash, 5, row, lvl, text_color=color.white, bgcolor=sigColor, text_size=textSize)
table.cell(dash, 6, row, trend_txt, text_color=color.white, bgcolor=trendColor, text_size=textSize)
table.cell(dash, 7, row, emaSig, text_color=color.white, bgcolor=emaColor, text_size=textSize)
table.cell(dash, 8, row, na(vwp) ? "-" : str.tostring(vwp, format.mintick), text_color=color.white, bgcolor=vwapColor, text_size=textSize)
table.cell(dash, 9, row, finalSig, text_color=color.white, bgcolor=finalColor, text_size=textSize)
finalSig
// Fill Rows separately to avoid errors
s1 = f_fill_row(1, sym1)
s2 = f_fill_row(2, sym2)
s3 = f_fill_row(3, sym3)
s4 = f_fill_row(4, sym4)
s5 = f_fill_row(5, sym5)
s6 = f_fill_row(6, sym6)
s7 = f_fill_row(7, sym7)
s8 = f_fill_row(8, sym8)
s9 = f_fill_row(9, sym9)
s10 = f_fill_row(10, sym10)
// Sentiment Logic
for s in array.from(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10)
if s == "๐ฅ B"
buyCount += 1
else if s == "❌ S"
sellCount += 1
marketSentiment = buyCount > sellCount ? "Bullish ๐ข" : sellCount > buyCount ? "Bearish ๐ด" : "Neutral ⚖️"
sentimentColor = buyCount > sellCount ? color.new(color.green, 20) : sellCount > buyCount ? color.new(color.red, 20) : color.new(color.orange, 20)
table.merge_cells(dash, 0, 11, 9, 11)
table.cell(dash, 0, 11, "SENTIMENT: " + marketSentiment + " (B:" + str.tostring(buyCount) + " S:" + str.tostring(sellCount) + ")", text_color=color.white, bgcolor=sentimentColor, text_size=textSize)
// ==========================================
// ๐น 3. MINI MTF DASHBOARD (Compact & Movable)
// ==========================================
// Inputs for Position
mtfPosStr = input.string("Bottom Right", "MTF Widget Position", options=["Top Right", "Top Left", "Top Center", "Bottom Right", "Bottom Left", "Bottom Center", "Middle Right", "Middle Left"], group="MTF Mini Settings")
mtfSizeInput = input.string("Small", "MTF Widget Size", options=["Tiny", "Small", "Normal"], group="MTF Mini Settings")
// Map inputs to real values
mtfPos = switch mtfPosStr
"Top Right" => position.top_right
"Top Left" => position.top_left
"Top Center" => position.top_center
"Bottom Right" => position.bottom_right
"Bottom Left" => position.bottom_left
"Bottom Center"=> position.bottom_center
"Middle Right" => position.middle_right
"Middle Left" => position.middle_left
=> position.bottom_right
mtfTextSize = switch mtfSizeInput
"Tiny" => size.tiny
"Small" => size.small
"Normal" => size.normal
=> size.small
mtfMaLen = input.int(50, "MTF Trend EMA Length", group="MTF Mini Settings")
var table mtfDash = table.new(mtfPos, 2, 10, border_width=1, frame_color=color.gray, bgcolor=color.rgb(20, 20, 20))
f_get_mtf_trend(tf) =>
[c_mtf, ema_mtf] = request.security(syminfo.tickerid, tf, [close, ta.ema(close, mtfMaLen)])
c_mtf > ema_mtf
f_fill_mtf_row(row, tf, dispName) =>
isBull = f_get_mtf_trend(tf)
table.cell(mtfDash, 0, row, dispName, text_color=color.white, bgcolor=color.rgb(40, 44, 52), text_size=mtfTextSize)
table.cell(mtfDash, 1, row, isBull ? "๐ข" : "๐ด", text_color=color.white, bgcolor=isBull ? color.new(color.green, 80) : color.new(color.red, 80), text_size=mtfTextSize)
if barstate.islast
f_fill_mtf_row(0, "1", "1m")
f_fill_mtf_row(1, "3", "3m")
f_fill_mtf_row(2, "5", "5m")
f_fill_mtf_row(3, "15", "15m")
f_fill_mtf_row(4, "30", "30m")
f_fill_mtf_row(5, "60", "1h")
f_fill_mtf_row(6, "240", "4h")
f_fill_mtf_row(7, "D", "Day")
f_fill_mtf_row(8, "W", "Wk")
// ==========================================
// ๐น 5. CHART PLOTS (PDH, PDL, EMA200)
// ==========================================
[pdh_chart, pdl_chart] = request.security(syminfo.tickerid, "D", [high[1], low[1]], lookahead=barmerge.lookahead_on)
finalSigChart = "N"
if (not na(c)) and (not na(pdh_chart)) and (not na(pdl_chart))
if (c >= pdh_chart) and (ema9 > ema15)
finalSigChart := "B"
else if (c <= pdl_chart) and (ema9 < ema15)
finalSigChart := "S"
bgCol = finalSigChart == "B" ? color.new(color.green, 90) : finalSigChart == "S" ? color.new(color.red, 90) : color.new(color.orange, 95)
bgcolor(bgCol)
plot(pdh_chart, title="PDH", color=color.green, linewidth=2)
plot(pdl_chart, title="PDL", color=color.red, linewidth=2)
ema200 = ta.ema(close, 200)
plot(ema200, title="Trend EMA200", color=close > ema200 ? color.green : color.red, linewidth=2)
© 2025 Ashish Mishra Trading Tools. All Rights Reserved.

0 Comments