PHP Code:
//@version=5
indicator("Super Oscilador by Rouro", overlay=false)
// === INPUTS DE INDICADORES ===
rsiPeriod = input.int(14, title="RSI - Periodo")
stochKPeriod = input.int(14, title="Stochastic %K - Periodo")
cciPeriod = input.int(20, title="CCI - Periodo")
rocPeriod = input.int(10, title="ROC - Periodo")
willrPeriod = input.int(14, title="Williams %R - Periodo")
rsiOver = input.int(70, title="RSI - Sobrecompra")
rsiUnder = input.int(30, title="RSI - Sobreventa")
stochOver = input.int(80, title="Stochastic - Sobrecompra")
stochUnder = input.int(20, title="Stochastic - Sobreventa")
cciOver = input.int(100, title="CCI - Sobrecompra")
cciUnder = input.int(-100, title="CCI - Sobreventa")
// ROC manual (por si no se usa ATR)
rocManualOver = input.float(0.5, title="ROC % Sobrecompra (manual)")
rocManualUnder = input.float(-0.5, title="ROC % Sobreventa (manual)")
// Selector de método dinámico
useATR = input.bool(true, title="Usar ATR para ROC dinámico")
atrPeriod = input.int(14, title="ATR - Periodo para ROC")
atrFactor = input.float(1.0, title="Factor ATR → umbral ROC")
willrOver = input.int(-20, title="Williams %R - Sobrecompra")
willrUnder = input.int(-80, title="Williams %R - Sobreventa")
// OPCIONES VISUALES
mostrarLineaBase = input.bool(false, title="Mostrar línea base")
emaSuavizado = input.int(5, title="Periodo de suavizado EMA")
nivelInferior = input.float(-0.8, title="Nivel Inferior (Sobreventa)")
nivelSuperior = input.float( 0.8, title="Nivel Superior (Sobrecompra)")
// === CÁLCULO DE INDICADORES ===
rsiVal = ta.rsi(close, rsiPeriod)
stochVal = ta.stoch(high, low, close, stochKPeriod)
cciVal = ta.cci(close, cciPeriod)
rocVal = ta.roc(close, rocPeriod) // ROC en %
den = ta.highest(high, willrPeriod) - ta.lowest(low, willrPeriod)
willrVal = den != 0 ? -100 * (ta.highest(high, willrPeriod) - close) / den : na
// === CÁLCULO ROC dinámico vía ATR ===
atrPct = ta.atr(atrPeriod) / close * 100
rocATROver = atrPct * atrFactor
rocATRUnder = -rocATROver
rocOver = useATR ? rocATROver : rocManualOver
rocUnder = useATR ? rocATRUnder : rocManualUnder
// === SCORES INDIVIDUALES ===
rsiScore = rsiVal > rsiOver ? 1 : rsiVal < rsiUnder ? -1 : 0
stochScore = stochVal > stochOver ? 1 : stochVal < stochUnder ? -1 : 0
cciScore = cciVal > cciOver ? 1 : cciVal < cciUnder ? -1 : 0
rocScore = rocVal > rocOver ? 1 : rocVal < rocUnder ? -1 : 0
willrScore = willrVal > willrOver ? 1 : willrVal < willrUnder ? -1 : 0
// === NORMALIZACIÓN & SUAVIZADO ===
score = rsiScore + stochScore + cciScore + rocScore + willrScore
lineaOsc = score / 5
emaOsc = ta.ema(lineaOsc, emaSuavizado)
// === COLOR DINÁMICO DEL OSCILADOR ===
oscColor = emaOsc > nivelSuperior ? color.red :
emaOsc < nivelInferior ? color.green :
color.blue
// === PLOTS DEL OSCILADOR ===
plot(emaOsc, title="EMA Súper Oscilador", color=oscColor, linewidth=2)
plot(mostrarLineaBase ? lineaOsc : na, title="Línea base", color=color.gray, linewidth=1)
hline(nivelSuperior, "Sobrecompra", color=color.new(color.red, 60), linestyle=hline.style_dashed)
hline(0, "Centro", color=color.gray, linestyle=hline.style_dotted)
hline(nivelInferior,"Sobreventa", color=color.new(color.green, 60), linestyle=hline.style_dashed)
// === TABLA SEMÁFORO ===
rsiState = rsiScore == 1 ? color.green : rsiScore == -1 ? color.red : color.gray
stochState = stochScore == 1 ? color.green : stochScore == -1 ? color.red : color.gray
cciState = cciScore == 1 ? color.green : cciScore == -1 ? color.red : color.gray
rocState = rocScore == 1 ? color.green : rocScore == -1 ? color.red : color.gray
willrState = willrScore == 1 ? color.green : willrScore == -1 ? color.red : color.gray
var table semaforo = table.new(position.top_right, 2, 6, border_width=1, frame_width=1)
if barstate.islast
table.cell(semaforo, 0, 0, "IND", text_color=color.white, bgcolor=color.black)
table.cell(semaforo, 1, 0, "EST", text_color=color.white, bgcolor=color.black)
table.cell(semaforo, 0, 1, "RSI", text_color=color.white)
table.cell(semaforo, 1, 1, "●", text_color=rsiState, bgcolor=color.new(rsiState, 85))
table.cell(semaforo, 0, 2, "STO", text_color=color.white)
table.cell(semaforo, 1, 2, "●", text_color=stochState, bgcolor=color.new(stochState, 85))
table.cell(semaforo, 0, 3, "CCI", text_color=color.white)
table.cell(semaforo, 1, 3, "●", text_color=cciState, bgcolor=color.new(cciState, 85))
table.cell(semaforo, 0, 4, "ROC", text_color=color.white)
table.cell(semaforo, 1, 4, "●", text_color=rocState, bgcolor=color.new(rocState, 85))
table.cell(semaforo, 0, 5, "W%R", text_color=color.white)
table.cell(semaforo, 1, 5, "●", text_color=willrState, bgcolor=color.new(willrState, 85))
// === SEÑALES DENTRO DEL PANEL DEL OSCILADOR ===
// Venta: sale de sobrecompra (cierre bajo nivelSuperior)
sellSignal = ta.crossunder(emaOsc, nivelSuperior) and barstate.isconfirmed
// Compra: sale de sobreventa (cierre sobre nivelInferior)
buySignal = ta.crossover (emaOsc, nivelInferior) and barstate.isconfirmed
plotshape(series = sellSignal ? nivelSuperior : na,title = "Señal Venta",style = shape.triangledown,location = location.absolute,size = size.small,color = color.red,text = "Sell")
plotshape(series = buySignal ? nivelInferior : na,title = "Señal Compra",style = shape.triangleup,location = location.absolute,size = size.small,color = color.green,text = "Buy")
// === ALERTAS PARA TRADINGVIEW ===
alertcondition(sellSignal, "Señal Venta", "El Súper Oscilador sale de sobrecompra")
alertcondition(buySignal, "Señal Compra","El Súper Oscilador sale de sobreventa")
Yer İmleri