LootX

Ejemplos de scripts

nuevo Actualizado 30 de septiembre de 2026 Esta página en PDF

Ocho scripts listos en LootScript: medias móviles, RSI, VWAP con bandas, CVD con divergencias, interés abierto, tasa de financiación, disbalances de clústeres y una estrategia para el probador.

Ocho scripts listos en LootScript: desde medias móviles y RSI hasta CVD, interés abierto, tasa de financiación y clústeres. Cada uno es un indicador funcional que puedes añadir al Gráfico y ajustar. Todos los ejemplos compilan sin errores ni advertencias con el compilador de la versión actual.

Cómo ejecutar un ejemplo

  1. Haga clic en ƒ en el panel del Gráfico; en la ventana Indicadores — Editor….
  2. En el Editor haga clic en Nuevo (Ctrl+N), reemplace la plantilla por el código del ejemplo y pulse Guardar.
  3. Pulse Añadir al gráfico (Ctrl+Enter). Las opciones de input.* aparecerán en la ventana de configuración del indicador.

1. Tres medias móviles con selección de tipo

Rápida, media y lenta del mismo tipo, seleccionable. El fondo se ilumina cuando las tres se alinean a favor de la tendencia.

Loot
indicator("Три скользящие", shortTitle = "MA×3", overlay = true)
maType = input.string("EMA", "Тип средней", options = ["EMA", "SMA", "WMA", "HMA"])
src    = input.source(close, "Источник")
len1   = input.int(20, "Быстрая", minval = 1)
len2   = input.int(50, "Средняя", minval = 1)
len3   = input.int(200, "Медленная", minval = 1)

func ma(s, len) => switch maType {
    "SMA" => ta.sma(s, len)
    "WMA" => ta.wma(s, len)
    "HMA" => ta.hma(s, len)
    => ta.ema(s, len)
}

m1 = ma(src, len1)
m2 = ma(src, len2)
m3 = ma(src, len3)

plot(m1, "Быстрая", color = m1 >= m1[1] ? color.teal : color.red, linewidth = 2)
plot(m2, "Средняя", color = color.orange)
plot(m3, "Медленная", color = color.gray, linewidth = 2)
bgcolor(m1 > m2 and m2 > m3 ? color.new(color.teal, 20) : m1 < m2 and m2 < m3 ? color.new(color.red, 20) : na)

Cómo funciona

  • input.string con options se convierte en un menú desplegable en la configuración.
  • La función ma elige la media mediante switch. El estado ta.* vive por cada llamada, por eso tres llamadas a ma son tres medias independientes.
  • El color de la línea rápida es una expresión: si sube respecto a la barra anterior (m1[1]) es teal, si baja es rojo.
  • El panel puede dibujar hasta tres líneas plot por script — de ahí que haya tres medias.

2. RSI con zonas y alertas

RSI con una banda rellenada entre niveles. La línea y el fondo se colorean cuando el RSI está en sobrecompra o sobreventa.

Loot
indicator("RSI с зонами", shortTitle = "RSI", overlay = false)
len = input.int(14, "Период", minval = 2)
src = input.source(close, "Источник")
ob  = input.float(70, "Перекупленность", minval = 50, maxval = 100)
os  = input.float(30, "Перепроданность", minval = 0, maxval = 50)

r = ta.rsi(src, len)

hOb = hline(ob, "Перекупленность", color = color.red)
hOs = hline(os, "Перепроданность", color = color.teal)
fill(hOb, hOs, color = color.new(color.purple, 20))
plot(r, "RSI", color = r > ob ? color.red : r < os ? color.teal : color.purple, linewidth = 2)
bgcolor(r > ob ? color.new(color.red, 35) : r < os ? color.new(color.teal, 35) : na)

alertcondition(ta.crossunder(r, ob), "RSI вышел из перекупленности", "RSI опустился ниже верхнего уровня")
alertcondition(ta.crossover(r, os), "RSI вышел из перепроданности", "RSI поднялся выше нижнего уровня")

Cómo funciona

  • hline devuelve una asa del nivel, y fill rellena la franja entre dos asas.
  • Los niveles son ajustes input.float, por eso las líneas y la relleno se mueven con ellos.
  • alertcondition declara dos alertas. Por sí solas no suenan — cómo activarlas está en la página Alertas de script.
  • La alfa en color.new va de 0 (transparente) a 255 (opaco).

3. VWAP del día con bandas de desviación

Precio ponderado por volumen desde el inicio del día en UTC y una banda de ±σ alrededor.

Loot
indicator("VWAP дня с полосами", shortTitle = "VWAP", overlay = true)
src  = input.source(hlc3, "Цена")
mult = input.float(1.0, "Ширина полосы, σ", minval = 0.1, step = 0.1)

anchor = session.isfirstbar
vw = ta.vwap(src, anchor)

// Сумма объёма и сумма объёма на квадрат цены с начала дня — для разброса вокруг VWAP.
var float sumV  = 0.0
var float sumV2 = 0.0
if anchor {
    sumV  := 0.0
    sumV2 := 0.0
}
if not na(volume) and not na(src) {
    sumV  := sumV + volume
    sumV2 := sumV2 + volume * src * src
}
sigma = sumV > 0 and not na(vw) ? math.sqrt(math.max(sumV2 / sumV - vw * vw, 0)) : na

pUp = plot(vw + mult * sigma, "Верх", color = color.new(color.blue, 150))
plot(vw, "VWAP", color = color.blue, linewidth = 2)
pDn = plot(vw - mult * sigma, "Низ", color = color.new(color.blue, 150))
fill(pUp, pDn, color = color.new(color.blue, 25))

Cómo funciona

  • ta.vwap reinicia el cálculo en la barra donde el ancla es verdadera. En cripto, session.isfirstbar es la primera barra después de las 00:00 UTC.
  • Las variables var sobreviven entre barras. El mismo ancla las pone a cero, por eso la banda se calcula para el mismo período que el VWAP.
  • La desviación es la raíz de la media ponderada del cuadrado del precio menos el cuadrado del VWAP. math.max(…, 0) protege contra pequeños negativos por redondeo.
  • Tiene sentido en temporalidades intradía. Si quieres VWAP desde la última liquidación de funding, pon anchor = funding.settled.

4. CVD diaria con divergencias

Delta acumulada que se reinicia cada día, y marcas en las barras donde el precio renovó extremo pero la delta no lo confirmó.

Loot
indicator("Дневная кумдельта с расхождениями", shortTitle = "CVD", overlay = false)
len = input.int(20, "Окно поиска максимумов", minval = 3)

var float cvd = 0.0
if session.isfirstbar {
    cvd := 0.0
}
if delta.available {
    cvd := cvd + delta.value
}
cvdLine = delta.available ? cvd : na

// Цена обновила максимум окна, а кумдельта — нет: покупатели не подтверждают рост.
bearish = high >= ta.highest(high, len) and cvdLine < ta.highest(cvdLine, len)
bullish = low <= ta.lowest(low, len) and cvdLine > ta.lowest(cvdLine, len)

plot(cvdLine, "Кумдельта", color = cvdLine >= 0 ? color.teal : color.red, linewidth = 2)
hline(0, "Ноль", color = color.gray)
plotshape(bearish, "Медвежье расхождение", style = shape.triangledown, location = location.top, color = color.red, size = size.tiny)
plotshape(bullish, "Бычье расхождение", style = shape.triangleup, location = location.bottom, color = color.teal, size = size.tiny)

Cómo funciona

  • delta.value son compras agresivas menos ventas agresivas por barra. Donde no hay cobertura, delta.available es falso y la línea se interrumpe en vez de dibujar un cero.
  • El acumulador var se reinicia al inicio del día. Si necesitas una CVD que no se reinicie en todo el histórico cargado, usa la serie delta.cum ya preparada.
  • Divergencia: el precio marca el máximo de la ventana, pero la CVD está por debajo de su máximo en la misma ventana. Para mínimos, el criterio es simétrico.
  • location.top y location.bottom colocan las marcas en los bordes del subpanel, no en el precio.

5. Picos de interés abierto

Cambio del interés abierto barra a barra en porcentaje y marcas donde se sale del rango habitual de variación.

Loot
indicator("Изменение открытого интереса", shortTitle = "ΔOI %", overlay = false)
len = input.int(50, "Окно для всплесков", minval = 5)
k   = input.float(3.0, "Порог всплеска, σ", minval = 0.5, step = 0.5)

pct = oi.available and oi.close[1] > 0 ? 100 * (oi.close - oi.close[1]) / oi.close[1] : na
sd  = ta.stdev(pct, len)
spike = not na(sd) and math.abs(pct) > k * sd

plot(pct, "ΔOI, %", style = plot.style_columns, color = pct >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)
plotshape(spike, "Всплеск", style = shape.circle, location = location.top, color = color.orange, size = size.tiny)

Cómo funciona

  • oi.close es el interés abierto al cierre de la barra; oi.close[1] el de la barra anterior. La comprobación oi.available evita calcular cambios desde datos faltantes.
  • Un pico es una barra donde el cambio absoluto excede k desviaciones estándar sobre la ventana len.
  • El interés abierto llega con frecuencia minuto a minuto. En temporalidades menores al minuto las barras contiguas repiten el mismo valor y el cambio es cero — eso son datos, no un error.

6. Tasa de financiación

La tasa de financiación de un futuro perpetuo, en porcentaje por periodo o reexpresada a anual, con marcas de pago y resaltado de tasa alta.

Loot
indicator("Ставка финансирования", shortTitle = "Funding", overlay = false)
mode = input.string("За период", "Показывать", options = ["За период", "Годовых"])
thr  = input.float(0.05, "Порог, %", minval = 0.0, step = 0.01)

perPeriod = funding.rate * 100
periodsPerYear = funding.interval_hours > 0 ? 24.0 / funding.interval_hours * 365 : na
value = mode == "Годовых" ? perPeriod * periodsPerYear : perPeriod
level = mode == "Годовых" ? thr * periodsPerYear : thr

plot(value, "Ставка, %", style = plot.style_columns, color = value >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)
plotshape(funding.settled, "Выплата", style = shape.circle, location = location.bottom, color = color.gray, size = size.tiny)
bgcolor(math.abs(value) > level ? color.new(color.orange, 30) : na)

Cómo funciona

  • funding.rate es el factor, no el porcentaje: 0.0001 representa 0,01 %. Por eso la tasa se multiplica por 100.
  • Para anualizar, la tasa se multiplica por el número de pagos al año. 24.0 está escrito con punto para evitar división entera.
  • funding.settled es verdadero en la barra donde hubo pago; ahí se coloca un punto en la parte inferior.
  • El umbral se define por periodo y para las anualizadas se recalcula con el mismo multiplicador.

7. Disbalances en clústeres

Marcas en el precio donde en los clústeres hay una “escalera” de disbalances o simplemente muchos disbalances, más el nivel de volumen máximo (POC) de cada barra.

Loot
indicator("Дисбалансы кластеров", shortTitle = "Imbalance", overlay = true)
minSteps = input.int(3, "Уровней подряд", minval = 2)
minCount = input.int(5, "Дисбалансов в баре", minval = 1)

levels = cluster.available ? cluster.levels : 0
buys  = 0
sells = 0
for i in 0 .. levels {
    side = cluster.imbalance(i)
    if side == 1 {
        buys := buys + 1
    } else if side == -1 {
        sells := sells + 1
    }
}

plot(cluster.poc, "POC", style = plot.style_circles, color = color.orange)
plotshape(cluster.stacked_buy_steps >= minSteps, "Лесенка покупок", style = shape.triangleup, location = location.belowbar, color = color.teal, size = size.small)
plotshape(cluster.stacked_sell_steps >= minSteps, "Лесенка продаж", style = shape.triangledown, location = location.abovebar, color = color.red, size = size.small)
plotshape(buys >= minCount, "Много дисбалансов покупок", style = shape.circle, location = location.belowbar, color = color.new(color.teal, 120), size = size.tiny)
plotshape(sells >= minCount, "Много дисбалансов продаж", style = shape.circle, location = location.abovebar, color = color.new(color.red, 120), size = size.tiny)

Cómo funciona

  • cluster.imbalance(i) devuelve +1, −1 o 0 para el nivel de precio i. El umbral de disbalance lo toma la configuración de clústeres del Gráfico, así que el script ve lo mismo que tú.
  • cluster.stacked_buy_steps es cuántos niveles consecutivos hay con disbalance de compras. El bucle for i in 0 .. levels cuenta todos los disbalances de la barra, no solo los consecutivos.
  • El script se suscribe a los clústeres y funciona sobre un gráfico de velas normal. En exchanges sin cobertura y en temporalidades menores a 30 segundos o mayores a un día no hay clústeres — entonces levels es 0 y no habrá marcas.

8. Estrategia: cruce de EMA con stop basado en ATR

Entrada largo al cruce de medias, stop y objetivo en múltiplos de ATR, salida por cruce inverso.

Loot
strategy("EMA-кросс со стопом по ATR", overlay = true, initialCapital = 10000,
         defaultQtyType = strategy.qty.percent_of_equity, defaultQtyValue = 10,
         slippageTicks = 2)
fastLen = input.int(12, "Быстрая EMA", minval = 1)
slowLen = input.int(26, "Медленная EMA", minval = 2)
atrLen  = input.int(14, "Период ATR", minval = 1)
stopK   = input.float(1.5, "Стоп, в ATR", minval = 0.1, step = 0.1)
takeK   = input.float(3.0, "Цель, в ATR", minval = 0.1, step = 0.1)

fast = ta.ema(close, fastLen)
slow = ta.ema(close, slowLen)
atr  = ta.atr(atrLen)

// ATR запоминается в момент сигнала, чтобы стоп и цель не ползли вслед за волатильностью.
var float riskAtr = na
if ta.crossover(fast, slow) and strategy.position_size == 0 {
    riskAtr := atr
    strategy.entry("Long", strategy.long)
}
if ta.crossunder(fast, slow) {
    strategy.close("Long", comment = "Обратный кросс")
}
if strategy.position_size > 0 {
    entry = strategy.position_avg_price
    strategy.exit("Стоп/цель", from_entry = "Long", stop = entry - stopK * riskAtr, limit = entry + takeK * riskAtr)
}

plot(fast, "Быстрая", color = color.teal)
plot(slow, "Медленная", color = color.orange)

Cómo funciona

  • Los parámetros de strategy(…) son literales: capital 10 000, tamaño de posición 10 % del capital, deslizamiento 2 ticks. No hay comisión fijada, por eso el probador usa la tarifa por defecto: 0,02 % para ejecución límite y 0,05 % para mercado y stop. Tu propia tarifa en porcentaje se define con commissionValue.
  • La entrada de mercado se ejecuta en la apertura de la barra siguiente, no en el cierre de la señal: así el probador no mira al futuro.
  • strategy.exit coloca stop y objetivo desde el precio medio de entrada. Si en una barra se tocan ambos, el probador por defecto considera que se ejecutó el stop.
  • Resultados — operaciones, curva de capital, drawdowns — aparecen en la ventana Probador de estrategias… del Editor. Más detalles en Estrategias y probador.

Más

FAQ

¿Cómo añadir un ejemplo al gráfico?
Abra el Editor (ƒ en el panel del gráfico → «Editor…»), haga clic en «Nuevo», pegue el código, guarde y haga clic en «Añadir al gráfico».
¿Por qué el ejemplo con clústeres o tasa de financiación no dibuja nada?
Estos datos no están disponibles en el instrumento actual: los clústeres no están disponibles en todos los exchanges y temporalidades; la tasa de financiación solo existe en futuros perpetuos. Cuando faltan datos, el valor aparece como na y en el gráfico se muestra una omisión de datos.
¿Se puede operar con la estrategia del ejemplo?
Solo en el Probador de estrategias, en una cuenta simulada. Los scripts de LootScript no envían órdenes reales.