← Volver a la documentación
LootX

Ejemplos de scripts

Generado: 2026-10-01 docs.lootx.trade
Справочник

1Ejemplos de scripts

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

https://docs.lootx.trade/es/loot/examples