ASSISTANT
Para mejorar aún más la filtración de señales falsas en tu estrategia de Pine Script, se pueden incorporar más filtros o criterios de confirmación, como el uso de la acción del precio, otros indicadores de confirmación y condiciones más estrictas. Aquí te presento algunas ideas adicionales que podrías incorporar:
1. **Confluencia de Indicadores**: Asegúrate de que otros indicadores también confirman la señal. Por ejemplo, usando un MACD en confirmación con la dirección de la ruptura.
2. **Volumen Relativo**: No solo compara el volumen con su media, sino también observa cambios en el volumen relativo para asegurar que la ruptura tiene suficiente impulso.
3. **Diversificación Temporal**: Considera observar tendencias en múltiples marcos temporales para asegurar que la ruptura está alineada en diferentes contextos de tiempo.
4. **Verificación de Resistencia/Soporte**: Asegúrate de que las rupturas no estén inmediatamente encontrándose con niveles significativos de resistencia o soporte que puedan causar un retroceso.
Aquí tienes un guión modificado con algunos de estos conceptos:
```pinescript
//@version=5
indicator("Detección Avanzada de Patrones y Rupturas Mejorada", overlay=true)
// Configuración de Bandas de Bollinger
bbLength = 20
bbMult = 2.0
basis = ta.sma(close, bbLength)
dev = ta.stdev(close, bbLength) * bbMult
upperBand = basis + dev
lowerBand = basis - dev
// Cálculo del RSI
rsiLength = 14
rsi = ta.rsi(close, rsiLength)
// Cálculo del ATR
atrLength = 14
atr = ta.atr(atrLength)
// Volumen promedio para confirmar rupturas
volumeLength = 20
avgVolume = ta.sma(volume, volumeLength)
// Calculamos la Media Móvil Exponencial principal
emaLength = 50
ema = ta.ema(close, emaLength)
// Criterios de ruptura
compression = (upperBand - lowerBand) / basis < 0.1
volatilityIncrease = atr > ta.sma(atr, atrLength)
volumeIncrease = volume > avgVolume
// Indicadores adicionales de confluencia
macdLine = ta.ema(close, 12) - ta.ema(close, 26)
signalLine = ta.ema(macdLine, 9)
macdAboveSignal = macdLine > signalLine
macdBelowSignal = macdLine < signalLine
adxThreshold = 25
adx = ta.adx(14)
strongTrend = adx > adxThreshold
// Confirmación multitemporal (usando marco de 1 día)
emaDaily = request.security(syminfo.tickerid, "D", ta.ema(close, emaLength))
// Señal de ruptura alcista
breakoutUp = compression and volatilityIncrease and volumeIncrease and rsi > 50 and ta.crossover(close, ema) and macdAboveSignal and strongTrend and close > emaDaily
// Señal de ruptura bajista
breakoutDown = compression and volatilityIncrease and volumeIncrease and rsi < 50 and ta.crossunder(close, ema) and macdBelowSignal and strongTrend and close < emaDaily
// Visualización de Bandas de Bollinger
plot(upperBand, color=color.blue, title='Banda Superior')
plot(lowerBand, color=color.blue, title='Banda Inferior')
// Visualización de la EMA principal
plot(ema, color=color.orange, title='EMA')
// Configuración y visualización de EMAs adicionales
emaLength1 = input.int(20, title="Periodo EMA 1")
emaColor1 = input.color(color.red, title="Color EMA 1")
emaLength2 = input.int(50, title="Periodo EMA 2")
emaColor2 = input.color(color.green, title="Color EMA 2")
emaLength3 = input.int(100, title="Periodo EMA 3")
emaColor3 = input.color(color.blue, title="Color EMA 3")
ema1 = ta.ema(close, emaLength1)
ema2 = ta.ema(close, emaLength2)
ema3 = ta.ema(close, emaLength3)
plot(ema1, color=emaColor1, title="EMA 1")
plot(ema2, color=emaColor2, title="EMA 2")
plot(ema3, color=emaColor3, title="EMA 3")
// Configuración para patrones chartistas
sensitivity = input.float(0.01, title="Sensibilidad")
// Opciones de color y activación/desactivación para cada patrón
showDoubleTop = input(true, title="Mostrar Doble Techo")
doubleTopColor = input.color(color.red, title="Color Doble Techo")
showDoubleBottom = input(true, title="Mostrar Doble Suelo")
doubleBottomColor = input.color(color.green, title="Color Doble Suelo")
showAscendingTriangle = input(true, title="Mostrar Triángulo Ascendente")
ascendingTriangleColor = input.color(color.green, title="Color Triángulo Ascendente")
showDescendingTriangle = input(true, title="Mostrar Triángulo Descendente")
descendingTriangleColor = input.color(color.red, title="Color Triángulo Descendente")
// Funciones para detectar patrones
isDoubleTop() =>
peak1 = ta.valuewhen(ta.pivothigh(3, 3), high, 0)
peak2 = ta.valuewhen(ta.pivothigh(3, 3), high, 1)
peak1 and peak2 and (peak1 - peak2) / peak1 < sensitivity
isDoubleBottom() =>
trough1 = ta.valuewhen(ta.pivotlow(3, 3), low, 0)
trough2 = ta.valuewhen(ta.pivotlow(3, 3), low, 1)
trough1 and trough2 and (trough2 - trough1) / trough1 < sensitivity
isAscendingTriangle() =>
top1 = ta.valuewhen(ta.pivothigh(3, 3), high, 0)
top2 = ta.valuewhen(ta.pivothigh(3, 3), high, 1)
bottom = ta.valuewhen(ta.pivotlow(3, 3), low, 0)
top1 and top2 and bottom and low[1] > low[2] and (top2 - bottom) / top1 < sensitivity
isDescendingTriangle() =>
bottom1 = ta.valuewhen(ta.pivotlow(3, 3), low, 0)
bottom2 = ta.valuewhen(ta.pivotlow(3, 3), low, 1)
top = ta.valuewhen(ta.pivothigh(3, 3), high, 0)
bottom1 and bottom2 and top and high[1] < high[2] and (bottom2 - top) / bottom1 < sensitivity
// Detectar y trazar patrones si están activados
if isDoubleTop() and showDoubleTop
line.new(bar_index[1], high[1], bar_index[2], high[2], width=2, color=doubleTopColor)
if isDoubleBottom() and showDoubleBottom
line.new(bar_index[1], low[1], bar_index[2], low[2], width=2, color=doubleBottomColor)
if isAscendingTriangle() and showAscendingTriangle
line.new(bar_index[1], low[1], bar_index[2], low[2], width=2, color=ascendingTriangleColor)
line.new(bar_index[1], high[1], bar_index[2], high[2], width=2, color=ascendingTriangleColor)
if isDescendingTriangle() and showDescendingTriangle
line.new(bar_index[1], high[1], bar_index[2], high[2], width=2, color=descendingTriangleColor)
line.new(bar_index[1], low[1], bar_index[2], low[2], width=2, color=descendingTriangleColor)
// Marca de señal de ruptura
plotshape(series=breakoutUp, location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small, title="Ruptura Alcista")
plotshape(series=breakoutDown, location=location.abovebar, color=color.new(color.red, 0), style=shape.triangledown, size=size.small, title="Ruptura Bajista")
// Generar alertas
alertcondition(breakoutUp, title="Ruptura Alcista Detectada", message="Se ha detectado una posible ruptura alcista.")
alertcondition(breakoutDown, title="Ruptura Bajista Detectada", message="Se ha detectado una posible ruptura bajista.")
```
### Notas sobre Mejoras:
- **MACD** y **ADX**: Aseguramos que la dirección del MACD esté alineada con la señal y que el ADX esté mostrando una tendencia fuerte.
- **EMA en Marco Diario**: Uso del EMA en el marco temporal diario como prueba adicional de que el precio está alineado con la tendencia de más largo plazo.
- **Parámetros de Volumen**: Mayor consideración sobre el volumen para asegurar que la ruptura tiene suficiente apoyo.
Prueba estas mejoras y ajusta los parámetros según tus necesidades y las características de los activos que estás analizando. La interacción entre diferentes marcos de tiempo y confirmaciones adicionales puede proporcionar señales más robustas.