//@version=5 indicator("NQ Institutional Dashboard PRO", overlay=true) //================================================== // INPUTS //================================================== emaFast = input.int(9, "EMA Fast") emaSlow = input.int(21, "EMA Slow") momLen = input.int(10, "Momentum Length") rsiLen = input.int(14, "RSI Length") vixHigh = input.float(25.0, "VIX High") vixLow = input.float(15.0, "VIX Low") divThreshold = input.float(0.15, "SPY/NQ Divergence") //================================================== // SYMBOLS //================================================== vixSymbol = input.symbol("CBOE:VIX", "VIX") dxySymbol = input.symbol("TVC:DXY", "DXY") spySymbol = input.symbol("AMEX:SPY", "SPY") nqSymbol = input.symbol("CME_MINI:NQ1!", "NQ") //================================================== // DATA //================================================== vixClose = request.security(vixSymbol, timeframe.period, close) dxyClose = request.security(dxySymbol, timeframe.period, close) spyClose = request.security(spySymbol, timeframe.period, close) nqClose = request.security(nqSymbol, timeframe.period, close) //================================================== // HELPERS //================================================== f_pct(src) => ((src - src[1]) / src[1]) * 100 f_fmt(src) => str.tostring(src, "#.##") f_fmtPct(src) => (src >= 0 ? "+" : "") + str.tostring(src, "#.##") + "%" //================================================== // VIX //================================================== vixEmaFast = ta.ema(vixClose, emaFast) vixEmaSlow = ta.ema(vixClose, emaSlow) vixMom = vixClose - vixClose[momLen] vixPct = f_pct(vixClose) vixTrend = 0 if vixEmaFast > vixEmaSlow and vixMom > 0 and vixClose > vixHigh vixTrend := 2 else if vixEmaFast > vixEmaSlow and vixMom > 0 vixTrend := 1 else if vixEmaFast < vixEmaSlow and vixMom < 0 and vixClose < vixLow vixTrend := -2 else if vixEmaFast < vixEmaSlow and vixMom < 0 vixTrend := -1 vixBias = "NEUTRAL" if vixTrend >= 2 vixBias := "RIESGO" else if vixTrend == 1 vixBias := "ALCISTA" else if vixTrend == -1 vixBias := "BAJISTA" else if vixTrend <= -2 vixBias := "COMPRESION" vixScore = -vixTrend //================================================== // DXY //================================================== dxyEmaFast = ta.ema(dxyClose, emaFast) dxyEmaSlow = ta.ema(dxyClose, emaSlow) dxyMom = dxyClose - dxyClose[momLen] dxyPct = f_pct(dxyClose) dxyTrend = 0 if dxyEmaFast > dxyEmaSlow and dxyMom > 0 dxyTrend := 2 else if dxyEmaFast > dxyEmaSlow dxyTrend := 1 else if dxyEmaFast < dxyEmaSlow and dxyMom < 0 dxyTrend := -2 else if dxyEmaFast < dxyEmaSlow dxyTrend := -1 dxyBias = "NEUTRAL" if dxyTrend >= 2 dxyBias := "FUERTE" else if dxyTrend == 1 dxyBias := "ALCISTA" else if dxyTrend == -1 dxyBias := "BAJISTA" else if dxyTrend <= -2 dxyBias := "DEBIL" dxyScore = -dxyTrend //================================================== // SPY vs NQ //================================================== spyPct = f_pct(spyClose) nqPct = f_pct(nqClose) spread = nqPct - spyPct divState = "NORMAL" if spread > divThreshold divState := "TRAMPA LONG" else if spread < -divThreshold divState := "TRAMPA SHORT" else if math.abs(spread) < divThreshold / 2 divState := "CONFIRMADO" divScore = 0 if divState == "TRAMPA LONG" divScore := -1 else if divState == "TRAMPA SHORT" divScore := 1 else if divState == "CONFIRMADO" and nqPct > 0 divScore := 1 else if divState == "CONFIRMADO" and nqPct < 0 divScore := -1 //================================================== // NQ MOMENTUM //================================================== nqEmaFast = ta.ema(nqClose, emaFast) nqEmaSlow = ta.ema(nqClose, emaSlow) nqRsi = ta.rsi(nqClose, rsiLen) nqMom = nqClose - nqClose[momLen] nqScore = 0 if nqEmaFast > nqEmaSlow and nqRsi > 55 and nqMom > 0 nqScore := 2 else if nqEmaFast > nqEmaSlow and nqMom > 0 nqScore := 1 else if nqEmaFast < nqEmaSlow and nqRsi < 45 and nqMom < 0 nqScore := -2 else if nqEmaFast < nqEmaSlow and nqMom < 0 nqScore := -1 //================================================== // FINAL SCORE //================================================== totalScore = (vixScore * 2) + dxyScore + divScore + nqScore finalScore = math.max(-5, math.min(5, totalScore)) signal = "NEUTRAL" if finalScore >= 4 signal := "COMPRA FUERTE" else if finalScore >= 2 signal := "COMPRA" else if finalScore <= -4 signal := "VENTA FUERTE" else if finalScore <= -2 signal := "VENTA" //================================================== // COLORS //================================================== bgMain = color.rgb(6, 6, 12) bgHeader = color.rgb(15, 15, 25) bgA = color.rgb(10, 10, 18) bgB = color.rgb(15, 15, 22) gold = color.rgb(255, 170, 0) limeCol = color.rgb(0, 255, 120) redCol = color.rgb(255, 70, 70) silver = color.rgb(180, 180, 180) signalColor = silver if finalScore >= 2 signalColor := limeCol else if finalScore <= -2 signalColor := redCol //================================================== // TABLE //================================================== var table dashboard = table.new(position.top_right, 5, 8, bgcolor=bgMain, border_width=1, border_color=gold) //================================================== // DRAW TABLE //================================================== if barstate.islast table.cell(dashboard, 0, 0, "⚡ NQ DASHBOARD", bgcolor=bgHeader, text_color=gold, text_size=size.normal, width=14) table.cell(dashboard, 1, 0, "", bgcolor=bgHeader, width=13) table.cell(dashboard, 2, 0, "", bgcolor=bgHeader, width=7) table.cell(dashboard, 3, 0, "", bgcolor=bgHeader, width=10) table.cell(dashboard, 4, 0, "PRO", bgcolor=bgHeader, text_color=silver, width=6) table.cell(dashboard, 0, 1, "ASSET", bgcolor=bgHeader, text_color=silver, text_size=size.small) table.cell(dashboard, 1, 1, "VALOR", bgcolor=bgHeader, text_color=silver, text_size=size.small) table.cell(dashboard, 2, 1, "%", bgcolor=bgHeader, text_color=silver, text_size=size.small) table.cell(dashboard, 3, 1, "SESGO", bgcolor=bgHeader, text_color=silver, text_size=size.small) table.cell(dashboard, 4, 1, "SCORE", bgcolor=bgHeader, text_color=silver, text_size=size.small) table.cell(dashboard, 0, 2, "◉ VIX", bgcolor=bgA, text_color=color.purple) table.cell(dashboard, 1, 2, f_fmt(vixClose), bgcolor=bgA, text_color=color.white) table.cell(dashboard, 2, 2, f_fmtPct(vixPct), bgcolor=bgA, text_color=vixPct >= 0 ? redCol : limeCol) table.cell(dashboard, 3, 2, vixBias, bgcolor=bgA, text_color=vixScore >= 0 ? limeCol : redCol) table.cell(dashboard, 4, 2, str.tostring(vixScore), bgcolor=bgA, text_color=vixScore >= 0 ? limeCol : redCol, text_size=size.normal) table.cell(dashboard, 0, 3, "◉ DXY", bgcolor=bgB, text_color=color.aqua) table.cell(dashboard, 1, 3, f_fmt(dxyClose), bgcolor=bgB, text_color=color.white) table.cell(dashboard, 2, 3, f_fmtPct(dxyPct), bgcolor=bgB, text_color=dxyPct >= 0 ? redCol : limeCol) table.cell(dashboard, 3, 3, dxyBias, bgcolor=bgB, text_color=dxyScore >= 0 ? limeCol : redCol) table.cell(dashboard, 4, 3, str.tostring(dxyScore), bgcolor=bgB, text_color=dxyScore >= 0 ? limeCol : redCol, text_size=size.normal) table.cell(dashboard, 0, 4, "◉ SPY/NQ", bgcolor=bgA, text_color=color.orange) table.cell(dashboard, 1, 4, f_fmtPct(spyPct), bgcolor=bgA, text_color=spyPct >= 0 ? limeCol : redCol) table.cell(dashboard, 2, 4, f_fmtPct(nqPct), bgcolor=bgA, text_color=nqPct >= 0 ? limeCol : redCol) table.cell(dashboard, 3, 4, divState, bgcolor=bgA, text_color=divScore >= 0 ? limeCol : redCol) table.cell(dashboard, 4, 4, str.tostring(divScore), bgcolor=bgA, text_color=divScore >= 0 ? limeCol : redCol, text_size=size.normal) momentumText = "BAJISTA" if nqEmaFast > nqEmaSlow momentumText := "ALCISTA" table.cell(dashboard, 0, 5, "◉ NQ MOM", bgcolor=bgB, text_color=color.blue) table.cell(dashboard, 1, 5, "RSI " + str.tostring(math.round(nqRsi)), bgcolor=bgB, text_color=color.white) table.cell(dashboard, 2, 5, f_fmtPct(nqPct), bgcolor=bgB, text_color=nqPct >= 0 ? limeCol : redCol) table.cell(dashboard, 3, 5, momentumText, bgcolor=bgB, text_color=nqScore >= 0 ? limeCol : redCol) table.cell(dashboard, 4, 5, str.tostring(nqScore), bgcolor=bgB, text_color=nqScore >= 0 ? limeCol : redCol, text_size=size.normal) table.cell(dashboard, 0, 6, "TOTAL", bgcolor=color.rgb(20,15,5), text_color=gold) table.cell(dashboard, 1, 6, str.tostring(finalScore) + " / 5", bgcolor=color.rgb(20,15,5), text_color=signalColor, text_size=size.large) table.cell(dashboard, 2, 6, "", bgcolor=color.rgb(20,15,5)) table.cell(dashboard, 3, 6, "", bgcolor=color.rgb(20,15,5)) table.cell(dashboard, 4, 6, "", bgcolor=color.rgb(20,15,5)) signalBg = color.rgb(20,20,20) if finalScore >= 4 signalBg := color.rgb(0,40,0) if finalScore <= -4 signalBg := color.rgb(40,0,0) table.cell(dashboard, 0, 7, "SEÑAL", bgcolor=signalBg, text_color=color.white) table.cell(dashboard, 1, 7, signal, bgcolor=signalBg, text_color=signalColor, text_size=size.large) table.cell(dashboard, 2, 7, "", bgcolor=signalBg) table.cell(dashboard, 3, 7, "", bgcolor=signalBg) table.cell(dashboard, 4, 7, "NQ/MNQ", bgcolor=signalBg, text_color=silver) //================================================== // EMAS //================================================== plot(ta.ema(close, emaFast), color=color.orange, linewidth=1) plot(ta.ema(close, emaSlow), color=color.gray, linewidth=1) //================================================== // BACKGROUND //================================================== color bgCol = na if finalScore >= 4 bgCol := color.new(color.green, 95) else if finalScore <= -4 bgCol := color.new(color.red, 95) bgcolor(bgCol) //================================================== // ALERTS //================================================== buyAlert = signal == "COMPRA FUERTE" and signal[1] != "COMPRA FUERTE" sellAlert = signal == "VENTA FUERTE" and signal[1] != "VENTA FUERTE" alertcondition(buyAlert, title="COMPRA FUERTE", message="NQ Dashboard -> COMPRA FUERTE") alertcondition(sellAlert, title="VENTA FUERTE", message="NQ Dashboard -> VENTA FUERTE")