AVISO: lo siguiente es únicamente para entretenimiento + fines educativos. ¡No es CONSEJO FINANCIERO ni asesoramiento de CODIFICACIÓN (IA, o de otro tipo)! ¡Esto es solo con fines de DEMOSTRACIÓN!

Solicitud para SMA Clouds

Actúa como un desarrollador senior de TradingView Pine Script v5.

Crea un indicador superpuesto con el nombre:

“CÓDIGO DE INDICADORES TÉCNICOS 4.0 — Configuración de SMA Cloud”

PROPÓSITO

Construye un indicador de múltiples marcos temporales que no repinte, que proporcione contexto de tendencia y califique posibles señales. No debe ejecutar operaciones ni proporcionar asesoramiento financiero.

MARCO

El indicador usa tres capas analíticas:

1. Estructura de 8 horas

   - Determina la estructura general del mercado en el marco temporal de 8H.

   - Clasifícalo como alcista, bajista o neutral.

   - Muestra la clasificación actual en un pequeño panel (dashboard).

2. Nube SMA de 1 hora

   - Calcula una Media Móvil Simple rápida y una lenta en el marco temporal de 1H.

   - Haz que ambas longitudes de SMA sean configurables.

   - Valores predeterminados: [INSERT FAST SMA] y [INSERT SLOW SMA].

   - Rellena el área entre las medias:

     • Verde cuando la SMA rápida está por encima de la SMA lenta.

     • Rojo cuando la SMA rápida está por debajo de la SMA lenta.

     • Gris neutro cuando la relación no es clara.

   - La nube de 1H es el filtro principal de dirección de tendencia.

3. Disparador de 15 minutos y confirmación de IMACD

   - Calcula el disparador de entrada en el marco temporal de 15M.

   - Confirma los disparadores alcistas solo cuando el momentum de IMACD sea positivo.

   - Confirma disparadores bajistas solo cuando el momentum de IMACD sea negativo.

   - Usa la siguiente especificación de IMACD: [INSERT EXACT IMACD FORMULA AND SETTINGS].

   - Dibuja un triángulo verde hacia arriba para disparadores alcistas confirmados.

   - Dibuja un triángulo rojo hacia abajo para disparadores bajistas confirmados.

JERARQUÍA DE SEÑALES

Una calificación alcista requiere:

- Estructura aceptable alcista o neutral en 8H.

- Nube SMA de 1H alcista.

- Disparador alcista de 15M.

- Confirmación positiva de IMACD.

Una calificación bajista requiere las condiciones exactamente inversas.

REQUISITOS TÉCNICOS

- Usa request.security() con barmerge.lookahead_off.

- Evalúa las señales solo en velas cerradas confirmadas.

- No repintes señales históricas.

- No uses datos futuros.

- Permite que los tres marcos temporales y todas las longitudes de cálculo se cambien mediante entradas.

- Incluye interruptores para mostrar u ocultar la nube, etiquetas de estructura, marcadores de disparo y panel.

- Agrega reglas alertcondition() para calificaciones alcistas y bajistas confirmadas.

- Mantén el gráfico visualmente limpio.

- No incluyas órdenes automáticas, afirmaciones de rendimiento, P&L ni recomendaciones de inversión.

- Comenta el código claramente y explica cómo cada marco temporal contribuye al resultado.

Antes de escribir el código, identifica cualquier regla de cálculo o parámetro faltante. No inventes configuraciones propietarias. Primero, pregúntame por los valores faltantes.

Después de recibir esos valores, proporciona:

1. Código completo de Pine Script v5.

2. Una explicación concisa de la lógica.

3. Una lista de verificación para probar que el indicador no repinta.

CÓDIGO (COPIAR & PEGAR)

//@version=6

indicator("John Wick v 4.0", overlay=true)

//==================================================

// Entradas MACD

//==================================================

fastLength   = input.int(12, "Longitud rápida MACD")

slowLength   = input.int(26, "Longitud lenta MACD")

signalLength = input.int(9, "Longitud de la señal MACD")

atrLength = input.int(14, "Longitud de ATR")

showExits   = input.bool(true)

showCrosses = input.bool(true)

minProfitATR = input.float(0.30)

//==================================================

// Núcleo MACD

//==================================================

fastMA   = ta.ema(close, fastLength)

slowMA   = ta.ema(close, slowLength)

macdLine   = fastMA - slowMA

signalLine = ta.ema(macdLine, signalLength)

hist = macdLine - signalLine

//==================================================

// Eventos de cruce

//==================================================

bullCross = ta.crossover(macdLine, signalLine)

bearCross = ta.crossunder(macdLine, signalLine)

//==================================================

// Espaciado del marcador

//==================================================

atrValue = ta.atr(atrLength)

dotOffset = atrValue * 0.28

triOffset = atrValue * 0.70

longExitY  = high + dotOffset

shortExitY = low  - dotOffset

triBullY = low  - triOffset

triBearY = high + triOffset

//==================================================

// Motor del estado de la operación

//==================================================

var int   activeDir    = 0

var float entryPrice   = na

var float bestHist     = na

var bool  partialTaken = false

if bullCross

   activeDir    := 1

   entryPrice   := close

   bestHist     := hist

   partialTaken := false

if bearCross

   activeDir    := -1

 entryPrice   := close

   bestHist     := hist

   partialTaken := false

if activeDir == 1

   bestHist := na(bestHist) ? hist : math.max(bestHist, hist)

if activeDir == -1

   bestHist := na(bestHist) ? hist : math.min(bestHist, hist)

//==================================================

// Lógica de salida

//==================================================

longInProfit =

    activeDir == 1

and not na(entryPrice)

and high >= entryPrice + atrValue * minProfitATR

shortInProfit =

    activeDir == -1

and not na(entryPrice)

and low <= entryPrice - atrValue * minProfitATR

longMomentumFade =

    activeDir == 1

and bestHist > 0

and hist < hist[1]

shortMomentumFade =

    activeDir == -1

and bestHist < 0

and hist > hist[1]

yellowLongExit =

    showExits

and activeDir == 1

and not partialTaken

and longInProfit

and longMomentumFade

yellowShortExit =

    showExits

and activeDir == -1

and not partialTaken

and shortInProfit

and shortMomentumFade

if yellowLongExit or yellowShortExit

   partialTaken := true

redLongExit =

    showExits

and activeDir == 1

and partialTaken

and bearCross

redShortExit =

    showExits

and activeDir == -1

and partialTaken

and bullCross

if redLongExit or redShortExit

   activeDir    := 0

   entryPrice   := na

   bestHist     := na

   partialTaken := false

//==================================================

// PILA DE EMA (Nube de 5 capas)

//==================================================

ema5  = ta.ema(close, 5)

ema9  = ta.ema(close, 9)

ema12 = ta.ema(close, 12)

ema26 = ta.ema(close, 26)

ema50 = ta.ema(close, 50)

//==================================================

// Trazar EMAs (Delgadas / Atenuadas)

//==================================================

p5  = plot(ema5,  color=color.new(color.aqua, 20),  linewidth=1)

p9  = plot(ema9,  color=color.new(color.blue, 20),  linewidth=1)

p12 = plot(ema12, color=color.new(color.gray, 20),  linewidth=1)

p26 = plot(ema26, color=color.new(color.orange,20), linewidth=1)

p50 = plot(ema50, color=color.new(color.red, 20),   linewidth=1)

//==================================================

// NUBES

//==================================================

// 5–9 Reacción rápida

fill(p5, p9, color=color.new(color.aqua, 80))

// 9–12 Momentum

fill(p9, p12, color=color.new(color.blue, 82))

// 12–26 Estructura

fill(p12, p26, color=color.new(color.gray, 84))

// 26–50 Tendencia

fill(p26, p50, color=color.new(color.orange, 86))

//==================================================

// Salida Puntos

//==================================================

plotshape(

    yellowLongExit ? longExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.new(color.yellow, 20),

    size=size.tiny

)

plotshape(

    yellowShortExit ? shortExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.new(color.yellow, 20),

    size=size.tiny

)

plotshape(

    redLongExit ? longExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.red,

    size=size.tiny

)

plotshape(

    redShortExit ? shortExitY : na,

    style=shape.circle,

    location=location.absolute,

    color=color.red,

    size=size.tiny

)

//==================================================

// Triángulos de entrada

//==================================================

plotshape(

    showCrosses and bullCross ? triBullY : na,

    style=shape.triangleup,

    location=location.absolute,

    color=color.lime,

    size=size.small

)

plotshape(

    showCrosses and bearCross ? triBearY : na,

    style=shape.triangledown,

    location=location.absolute,

    color=color.red,

    size=size.small

)

ATR Prompt y Code

Prompt

Actúa como un desarrollador senior de TradingView Pine Script v5.

Crea un indicador superpuesto llamado:

“Codificación de Indicadores Técnicos 5.2 — Average True Range”

PROPÓSITO

Construye un indicador de dirección de tendencia adaptativo a la volatilidad usando un nivel de seguimiento (trailing) de ATR con carril (ratcheting). El indicador es para análisis educativo y no debe ejecutar operaciones ni hacer afirmaciones de rendimiento.

AJUSTES PRINCIPALES

- Periodo de ATR: 10

- Multiplicador de ATR: 1.9

- Fuente de cálculo: close

- Haz que el periodo del ATR, el multiplicador y la fuente sean configurables.

CÁLCULO

1. Calcula el Rango Verdadero Medio (ATR) durante 10 periodos.

2. Calcula la distancia de seguimiento (trailing):

   trailingDistance = 1.9 × ATR(10)

3. Crea un nivel de seguimiento recursivo que se ajusta con el precio:

- Mientras el precio permanezca por encima del nivel de seguimiento anterior, el nivel puede moverse hacia arriba, pero nunca hacia abajo.

   - Mientras el precio permanezca por debajo del nivel de seguimiento anterior, el nivel puede moverse hacia abajo, pero nunca hacia arriba.

   - Cuando el precio cruza el nivel de seguimiento, cambia la dirección codificada.

LÓGICA DE DIRECCIÓN

- Cambia a dirección alcista cuando el precio de cierre cruce por encima del nivel de seguimiento.

- Cambia a dirección bajista cuando el precio de cierre cruce por debajo del nivel de seguimiento.

- Genera una señal solo cuando el sentido cambia.

- No generes señales repetidas en cada vela.

SALIDA VISUAL

- Trazar el nivel de seguimiento del ATR.

- Usa verde cuando la dirección codificada sea alcista.

- Usa rojo cuando la dirección codificada sea bajista.

- Dibuja un triángulo verde hacia arriba en un cambio de dirección alcista.

- Dibuja un triángulo rojo hacia abajo en un cambio de dirección bajista.

- Opcionalmente colorea las velas según la dirección actual.

EMA CLOUD

- Agrega una nube de EMA de 12 periodos y 26 periodos.

- Rellena la nube en verde cuando la EMA 12 esté por encima de la EMA 26.

- Rellena en rojo cuando la EMA 12 esté por debajo de la EMA 26.

- Trata la nube de EMA como contexto de momentum; no debe alterar el cálculo del cambio de dirección del ATR.

- Incluye una entrada para ocultar la nube de EMA.

REQUISITOS TÉCNICOS

- Usa cierres de velas confirmados.

- No repintes (repaint).

- No uses información futura ni look-ahead.

- Preserva el nivel de seguimiento mediante lógica de variable recursiva.

- Agrega reglas alertcondition() para cambios de dirección alcistas y bajistas.

- Incluye interruptores para marcadores, colores de velas, nivel de seguimiento y nube de EMA.

- No crees órdenes de estrategia, una tabla de resultados, cálculos de P&L ni recomendaciones financieras.

- Organiza y comenta el código claramente.

Proporciona:

1. Código completo de Pine Script v5.

2. Explicación en lenguaje sencillo de ATR y el mecanismo de carril (ratcheting).

3. Una descripción de las condiciones que crean cada marcador.

4. Lista de verificación de no repintado (non-repainting) para una operación corta.


CÓDIGO

//@version=6

indicator("JW V5.2", overlay=true)

// ── Entradas ──────────────────────────────────────────

atrPeriod     = input.int(10, "Periodo de ATR")

keyValue      = input.float(1.9, "Valor clave / Multiplicador ATR", step=0.1)

warnZoneATR   = input.float(0.25, "Zona de advertencia (x ATR)", step=0.05)

cloudSmooth   = input.int(3, "Suavidad de la nube", minval=1, tooltip="Suaviza únicamente la banda trazada — no afecta el timing de la señal")

src           = close

// ── ATR trailing stop núcleo — crudo, impulsa todo lo real ──

xATR  = ta.atr(atrPeriod)

nLoss = keyValue * xATR

var float trailStop = 0.0

trailStop := src > nz(trailStop[1], 0) and src[1] > nz(trailStop[1], 0) ? math.max(nz(trailStop[1]), src - nLoss) :

            src < nz(trailStop[1], 0) and src[1] < nz(trailStop[1], 0) ? math.min(nz(trailStop[1]), src + nLoss) :

            src > nz(trailStop[1], 0) ? src - nLoss : src + nLoss

var int pos = 0

pos := src[1] < nz(trailStop[1], 0) and src > nz(trailStop[1], 0) ? 1 :

      src[1] > nz(trailStop[1], 0) and src < nz(trailStop[1], 0) ? -1 : nz(pos[1], 0)

trendColor = pos == 1 ? color.new(color.green, 0) : pos == -1 ? color.new(color.red, 0) : color.gray

// ── Nube — visualmente suavizada para fluidez, solo estética ──

plotSrc  = ta.ema(src, cloudSmooth)

plotStop = ta.ema(trailStop, cloudSmooth)

pricePlot = plot(plotSrc,  title="Precio (suavizado)",      color=trendColor, linewidth=1)

stopPlot  = plot(plotStop, title="Trail Stop (suavizado)", color=trendColor, linewidth=1)

fill(pricePlot, stopPlot, color=color.new(trendColor, 75), title="Nube de tendencia")

// ── Señales — impulsadas por valores crudos, sin afectarse por el suavizado ──

buySignal  = pos == 1  and pos[1] == -1

sellSignal = pos == -1 and pos[1] == 1

plotshape(buySignal,  title="Buy",  text="buy",  style=shape.triangleup,   location=location.belowbar, color=color.green, textcolor=color.white, size=size.small)

plotshape(sellSignal, title="Sell", text="sell", style=shape.triangledown, location=location.abovebar, color=color.red,   textcolor=color.white, size=size.small)

alertcondition(buySignal,  "Señal de compra", "ATR Trail cambió a alcista")

alertcondition(sellSignal, "Señal de venta", "ATR Trail cambió a bajista")

// ── Proximidad al cambio — brecha cruda, igual que la matemática de la señal ──

gapATR    = pos == 1 ? (src - trailStop) / xATR : (trailStop - src) / xATR

pctToFlip = math.max(0, math.min(100, 100 * (1 - gapATR / keyValue)))

dirText   = pos == 1 ? "LARGO" : pos == -1 ? "CORTO" : "PLANO"

nearFlip  = gapATR <= warnZoneATR

labelColor = nearFlip ? color.new(color.orange, 0) : trendColor

labelText  = dirText + "  —  " + str.tostring(gapATR, "#.##") + " ATR para cambiar (" + str.tostring(pctToFlip, "#") + "%)"

var label proximityLabel = na

if barstate.islast

   label.delete(proximityLabel)

   proximityLabel := label.new(bar_index + 2, src, labelText, style=label.style_label_left, color=labelColor, textcolor=color.white, size=size.normal)